راهنمای داکر برای تازهکارها: تعریف داکرفایل، ساخت ایمج و راه اندازی کانتینر

در سومین نوشته از سری مطالب داکر قرار است با جزییات به تعریف دستورات در داکر فایل، ساخت ایمج و راهاندازی کانتینر بپردازیم. برای فهم بهتر مطالب پیشرو بد نیست دو نوشته قبل با عنوان «راهنمای داکر برای تازهکارها: داکر چیست؟» و «راهنمای داکر برای تازهکارها: کلمات کلیدی در Docker» را بخوانید.
نصب داکر
قبل از هر کاری لازم است داکر رو روی سیستمتان نصب کنید. برای نصب روی «مک» ، «ویندوز» و «ابونتو» میتونید از طریق راهنمای خود داکر استفاده کنید.
ساخت ایمج
قبل از هر چیز بیاید اولین ایمجمان را به سادهترین نحو ممکن بسازیم:
ابتدا با دستور mkdir myfirst
در ترمینال یک دایرکتوری ایجاد کنید.
در قدم بعدی داکر فایل را با touch Dockerfile
بسازید.
و دستورات زیر را در آن وارد کنید.
خط اول تعیین میکند با کدوم ایمج کارمان را شروع میکنیم. در اینجا من از یک ایمج سبک و ساده در داکرهاب به نام بیزیباکس استفاده کردم.
خط دوم میگوید دستور اکو با محتویات استرینگش را اجرا کن.
و در خط سوم با استفاده از دستور CMD، کامند پیشفرض استارت کانتینر رو مینویسیم که در اینجا هم اکو شدن «دالی!» هست.
در انتها در همون دایرکتوری دستور بیلد ایمج از روی داکر فایل رو اجرا میکنیم:
docker build -t pemiphilo/first-image .
همانطور که میبینید مرسوم هست برای اسم ایمج از ساختار نام اورگانیزیشن/نام ایمج استفاده شه. نقطه آخر کامند هم به معنای بیلد با استفاده از داکرفایل موجود در همین دایرکتوریست.
چیزی که در ترمینال خواهید دید مانند تصویر زیر است:
حالا بیاید با هم مرور کنیم که در هر گام چه اتفاقی رخ میدهد.
در step 1/3 آخرین ورژن ایمج بیزیباکس با استفاده از دستور پول از داکر هاب گرفته میشود.
در step 2/3 دستور ران اکو [در یک کانتینر موقتی میانی با آیدی ۴۸۲۰۴e313b25] اجرا شده و در انتها چون در جای دیگری ازش استفاده نشده این کانتینر حذف میشود. در این جا یک لایه به ایمج اضافه میشه. اگر به خاطر داشته باشید ساختار لایهای ایمجها در داکر و مزایاش رو در نوشتههای قبل توضیح دادیم.
در step 3/3 خط سوم دستورات [در یک کانتینر موقتی میانی با آیدی ۳۴de5021f8c6] ران میشود و در این مورد هم چون جای دیگری ازش استفاده نشده این کانتینر میانی هم حذف میشود. در این جا هم یک لایه دیگه به ایمج اضافه میشه.
و در نهایت ایمجی با آیدی edca765c109c ساخته شده و آماده استفادهست.
حالا اگر دستور docker images
رو بزنید اولین ایمجی که ساختید رو در لیست ایمجهای داکرتون خواهید دید :]
برای حذف یک ایمج میتونید از دستور
docker rmi image-name
استفاده کنید.
راهاندازی کانتینر
وقتشه از ایمجمون یک کانتینر راهاندازی کنیم!
با زدن دستور docker run --rm pemiphilo/first-image
با خروجی !Peekaboo روبرو میشویم.
با دستور docker run image-name
یک کانتینر از ایمج ساخته میشه و اگر بخواهیم بعد از اگزیت و یا پایان کار کانتینر حذفش کنیم کافیه دستور rm--
رو اضافه کنیم.
به یاد داشته باشید از هر ایمج میتوانید صدها کانتینر بسازید. از طرفی هر خط دستوری که در داکرفایل وارد میکنید یک لایه به ایمجتان اضافه میکند؛ هر بار که از هر ایمج یک کانتینر میسازید، اگر هر لایه ایمج پیشتر ساخته شده باشد داکر از کشاش برای بیلد کردن استفاده خواهد کرد و همین به سرعت کار اضافه خواهد کرد.
برای دیدن لیست کانتینرهای موجود از دستور
docker ps
استفاده کنید.
وقتشه یه نمونه واقعی بسازیم!
فرض کنید قرارست اپلیکیشنی بسازیم که با PHP کد میشه، روی Nginx سوار میشه و از دیتابیس mysql برای نگهداری دیتا استفاده میکنه. در واقع ما برای یک اپلیکیشن نیاز داریم چند سرویس (کانتینر) رو در کنار هم داشته باشیم. در اینجا لازمه از ابزاری به نام Docker Compose استفاده کنیم. در این روش با استفاده از یک فایل YML (یَمْل) تنظیمات مربوط به سرویسها را مینویسیم و با یک کامند همه را اجرا میکنیم.
با استفاده از داکر کامپوز میتوانید در سه گام اپلیکیشن خود را اجرا کنید:
- محیط اپلیکیشن خودتون رو در Dockerfile با استفاده از دستوراتش تعریف کنید.
- سرویسهایی که میخواید یکپارچه و در محیطی ایزوله در کنار هم کار کنند رو در docker-compose.yml تعریف کنید.
- دستور docker-compose up برای اجرای اپلیکیشن در ترمینال و روت اصلی پروژه وارد کنید.
اول از همه داکر کامپوز رو با راهنمایی خود داکر نصب کنید. قراره قدم به قدم همچین دایرکتوریی بسازیم.
بیایید تک تک فایلها را بررسی کنیم:
app.docker
این فایل داکر فایلی هست که قرارست دستورات مربوط به نصب php رو در محیط پروژه داشته باشد.
nginx.docker
در این داکرفایل دستورات مربوط به نصب nginx و کانفیگش رو خواهیم داشت.
vhost.conf
شامل کانفیگ معمول nginx خواهد بود.
docker-compose.yml
این فایل هم وظیفه سرهم بندی و ایجاد ارتباط بین این سه کانتینر در محیط پروژه رو خواهد داشت.
الف. اول از همه به سراغ محتویات app.docker میرویم:
در خط ۱ از ایمج بیسیک php7-fpm استفاده کردیم.
ازخط ۳ تا ۶ اکستنشهایی که نیاز داریم را با استفاده از دستور RUN داکر و دستورات لینوکس نصب میکنیم.
و در خط ۸ محیط کار پروژه را مشخص میکنیم.
ب. در گام بعدی به سراغ محتویات vhost.conf میرویم.
تنظیمات عجیب و غریبی نداره همان تنظیمات معمولست.
خط ۱ و ۲ میگه در ipv4 و ipv6 به کدام پورت گوش کند.
خط ۵ مسیر روت را مشخص میکنه که به پوشه پابلیک در پروژه ختم میشود.
و در خط ۶ فایل ایندکس رو مشخص میکند.
نکته حائز اهمیت در خط ۲۱ هست که در fastcgi_pass app:9000
که در بخش آی پی از نام سرویس app (جلوتر در بررسی داکر کامپوز خواهید دید) برای آدرس دهی و روتینگ استفاده کردهایم.
پ. در بررسی فایل nginx.docker میبینیم:
در خط ۱ از ایمج بیسیک nginx در داکرهاب استفاده کردیم.
در خط ۳ با استفاده از دستور ADD ./vhost.conf /etc/nginx/conf.d/default.conf
مقادیر کانفیگ در فایل vhost.conf را جایگزین تنظیمات پیشفرض nginx میکنیم.
ت. و اما فایل docker-compose.yml:
در خط ۱ ورژنی از docker-compose که از آن استفاده میکنیم را مشخص کردیم.
در خط ۳ در این فایل به تفکیک تمام کانتینرها ( سرویسها) را با اختصاص یک نام تعریف کردهایم. بعد از این در طول پروژه میتونیم از این نامها برای روتینگ و اشاره بهشان استفاده کنیم.
در خط ۴ مشخصات سرویس nginx را وارد کردیم.
در خط ۵ تا ۷ دستورات بیلد ایمج در دایرکتوری فعلی و با استفاده داکر فایل مربوطه معرفی شده.
در خط ۸ و ۹ دایرکتور فعلیمان در پروژه رو به آدرس/var/www در کانتینر ( که همون ورکدایرکتوریمونه) بایند کردیم. این کار کمک میکند وقتی تغییراتی در کد پروژه میدهیم نیازی نباشه دوباره عملیات بیلد رو انجام بدیم و همانها در کانتینر هم اعمال میشه و در لحظه قابل دیدنه.
در خط ۱۰ و ۱۱ پورت ۸۰۱۲ به پورت ۸۰ داخل کانتینر فوروارد شده.
و در خط ۱۲ و ۱۳ با استفاده از لینک مشخص شده این کانتینر به چه کانتینرهای دیگری وصل است و ارتباط دارد.
فکر میکنم تا اینجا با روند موجود در داکر کامپوز آشنا شدهاید.
اضافه میکنم در بخش environment (خط ۲۷ تا ۲۹) هم متغیرهایی که ایمج مورد نظر برای استفاده نیاز دارند را مقدار دهی میکنیم. معمولا داخل داکیومنت ایمجها به راحتی توضیح داده شده چه متغیرهایی نیاز هست.
در اینجا متغیرهایی که در ایمج mysql از پیش تعیین شده برای نامگذاری دیتابیس و پسورد کاربر روت رو مقدار دهی کردیم. پیشنهاد میکنم بخش environment را در داکیومنتهای داکر مطالعه کنید.
ث. پوشه public و فایل index.php
در انتها در پوشه پابلیک یک فایل index.php
ایجاد میکنیم و محتوای زیر را در آن میریزیم تا همزمان وضعیت اتصال به دیتابیس mysql رو هم چک کنیم.
همانطور که در خط ۴ مشاهده میکنید در مقابل host به جای آی پی از نام سرویس mysql برای روتینگ استفاده شده.
این دیگه آخرشه!
حالا دستور docker-compose up -d
رو در ترمینال و در پوشه example اجرا میکنیم و Tadaaa!
پس از بیلد موفقیت آمیز کافیست آدرس http://localhost:8012
رو در مرورگر وارد کرده و نتیجه رو ببینیم. در صورتی که خروجی true ظاهر شود یعنی همه چیز به درستی بیلد شده و کانتینرها در دسترساند.
در آخر برای وارد شدن درون سرویسها با دستور docker-compose exec service_name bash
وارد اینترکتیو ترمینالش شده و یه چرخی داخلش میزنیم. برای شروع وارد سرویس app یا nginx شوید. (سپاس از دوست خوبم عرفان [+]برای اصلاح این قسمت)
پیشنهاد میکنم بعد از مطالعه و تست تریلوژی داکر که براتون آماده کردم به سراغ داکیومنتهای خود داکر برید و با دقت بیشتر و علمیتر در استفاده از این ابزار -به میزانی که بهش نیاز دارید- مهارت کسب کنید 🙂
دیدگاهها