Menu

  • خانه
  • برنامه‌نویسی
  • تجربه‌های کاری
  • سبک زندگی
  • پروژه‌ها

Copyright © 2018 Payro.me Powered by WordPress

شیما پیرو، توسعه دهنده نرم افزارنوشته‌ها و تجربیات کاری شیما پیرو توسعه دهنده نرم افزار

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

داکر کامپوز
نوامبر 28, 2018برنامه‌نویسی

در سومین نوشته از سری مطالب داکر قرار است با جزییات به تعریف دستورات در داکر فایل، ساخت ایمج و راه‌اندازی کانتینر بپردازیم. برای فهم بهتر مطالب پیش‌رو بد نیست دو نوشته قبل با عنوان «راهنمای داکر برای تازه‌کارها: داکر چیست؟» و «راهنمای داکر برای تازه‌کارها: کلمات کلیدی در 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 (یَمْل) تنظیمات مربوط به سرویس‌ها را می‌نویسیم و با یک کامند همه را اجرا می‌کنیم.

با استفاده از داکر کامپوز می‌توانید در سه گام اپلیکیشن خود را اجرا کنید:

  1. محیط اپلیکیشن خودتون رو در Dockerfile با استفاده از دستوراتش تعریف کنید.
  2. سرویس‌هایی که میخواید یکپارچه و در محیطی ایزوله در کنار هم کار کنند رو در docker-compose.yml تعریف کنید.
  3. دستور docker-compose up برای اجرای اپلیکیشن در ترمینال و روت اصلی پروژه وارد کنید.

 

اول از همه داکر کامپوز رو با راهنمایی خود داکر نصب کنید. قراره قدم به قدم همچین دایرکتوریی بسازیم.

بخوانید:  اتصال SSH به Gitlab با بیش از یک حساب کاربری

بیایید تک تک فایل‌ها را بررسی کنیم:

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 شوید. (سپاس از دوست خوبم عرفان [+]برای اصلاح این قسمت)

 

پیشنهاد می‌کنم بعد از مطالعه و تست تریلوژی داکر که براتون آماده کردم به سراغ داکیومنت‌های خود داکر برید و با دقت بیشتر و علمی‌تر در استفاده از این ابزار -به میزانی که بهش نیاز دارید- مهارت کسب کنید 🙂

Container، Docker، Dockerfile، بیلد ایمج داکر، داکر، داکرفایل، کانتینر

دیدگاه‌ها

میکائیل ‫دسامبر 16, 2018 در 3:13 ق.ظ - پاسخ

مطلب مفید و خوبی بود. ممنون

    شیما پیرو ‫دسامبر 27, 2018 در 6:50 ب.ظ - پاسخ

    خوشحالم که مفید بوده. ممنون که مطالعه کردید.

شروین ‫دسامبر 16, 2018 در 3:37 ق.ظ - پاسخ

عالیه ?

    شیما پیرو ‫دسامبر 27, 2018 در 6:49 ب.ظ - پاسخ

    ممنون شروین که خوندی.

حسين ‫آوریل 13, 2019 در 9:19 ب.ظ - پاسخ

عالی بود!!
مطمئنا به کارم می یاد😀

    شیما پیرو ‫جولای 30, 2019 در 1:14 ب.ظ - پاسخ

    خیلی هم عالی :‌)

بهرنگ ‫ژوئن 5, 2019 در 11:55 ق.ظ - پاسخ

مرسی خوب و کاربردی بود 🙂

    شیما پیرو ‫جولای 30, 2019 در 1:12 ب.ظ - پاسخ

    خوشحالم به دردتون خورد.

رها ‫مارس 12, 2020 در 10:58 ق.ظ - پاسخ

سلام. شیما جات واقعا عالی بود و یه دید درست حسابی از اینکه داکر چیه کانتینر و ایمیج چیه و چطوری کار میکنن بهم دادی. ممنونم ازت

    شیما پیرو ‫آوریل 1, 2020 در 11:38 ق.ظ - پاسخ

    ممنونم. خوشحالم به دردتون خورده 🙂

ابوالفضل ‫مارس 26, 2020 در 6:36 ب.ظ - پاسخ

سلام خسته نباشید . ایا امکانش هست یک ایمج برای من بسازید. من به مشکل خوردم و نتونستم چیزی که میخوامو بسازم.

    شیما پیرو ‫آوریل 1, 2020 در 11:40 ق.ظ - پاسخ

    تو کدوم بخش به مشکل خوردید؟ توضیح میدید؟ و اینکه برام محتوای فایل‌هاتون رو بفرستید.

یک پاسخ یا دیدگاه بنویسید لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دسته‌ها

  • برنامه‌نویسی
  • تجربه‌های کاری
  • سبک زندگی

نوشته‌های تازه

  • اتصال SSH به Gitlab با بیش از یک حساب کاربری
  • اهمیت شوخ‌طبعی در محیط کار
  • چطور از شر تسک‌های تو مخی خلاص شویم؟
  • راهنمای داکر برای تازه‌کارها: تعریف داکرفایل، ساخت ایمج و راه اندازی کانتینر
  • راهنمای داکر برای تازه‌کارها: کلمات کلیدی در Docker