آموزش Docker Compose

Docker یک فناوری DevOps مورد تقاضا برای راه اندازی و استقرار برنامه‌ها با استفاده از کانتینرها است. محیط Docker چرخه عمر توسعه برنامه را ساده کرده و Docker Compose و advanced Docker tool می‌توانند برای ساده کردن گردش کار شما استفاده شوند. در این مطلب، مروری بر Docker انجام داده  و به شما نشان می‌دهیم که چگونه با Docker Compose شروع به کار کنید.


مروری بر داکر(Docker)

Docker یک ابزار متن‎‌باز برای کانتینرسازی است که ایجاد و استقرار برنامه را از طریق استفاده از کانتینرها ساده می‌کند. کانتینرها ما را قادر می‌سازند تا تمام قسمت‌های یک برنامه را در یک بسته واحد برای استقرار دسته بندی کنیم.
این ابزار کار را برای توسعه دهندگان مختلف در یک پروژه در یک محیط بدون هیچ گونه وابستگی یا مشکل سیستم عامل آسان می‌کند. داکر شبیه به ماشین مجازی عمل می‌کند، با این حال، برنامه ها را قادر می سازد تا هسته لینوکس یکسانی را به اشتراک بگذارند.
Docker مزایای زیادی را برای توسعه دهندگان و تیم های DevOps ارائه می دهد. برخی از این مزایا عبارتند از:

  •  به شدت مورد تقاضای شرکت های بزرگ و کوچک است
  • ایجاد ایزولاسیون از سیستم اصلی
  • ساده سازی پیکربندی
  • امکان دسترسی به هزاران ایمیج از پیش پیکربندی شده از طریق Docker Hub
  • پشتیبانی از بسیاری از ابزارهای CI مانند Travis و Jenkins
  • به توسعه دهندگان اجازه می دهد تا فقط بر روی نوشتن کد تمرکز کنند.
  • ساده سازی مدیریت استقرار برای تیم های عملیاتی

Docker اغلب در ارتباط با Kubernetes، یک ابزار مدیریت کانتینر قوی که استقرار کانتینرهای Docker را خودکار می‌کند، استفاده می‌شود. در حالی که Docker برای بسته‌بندی، ایزولاسیون و توزیع برنامه‌ها در کانتینرها استفاده می‌شود، Kubernetes به عنوان زمان‌بندی کانتینر مسئول استقرار و مقیاس‌بندی برنامه عمل می‌کند.

این دو فناوری مکمل یکدیگر هستند و استقرار برنامه را بدون دردسر می کنند.

کامپوننت‌های داکر

مبانی داکر

قبل از بررسی مفاهیم پیشرفته Docker، مانند Docker Compose، می‌خواهیم اصول Docker را به طور کلی مرور کنیم؛ بیایید اصول Docker را تعریف و بررسی کنیم.

داکر کلاینت (Docker Client )

Docker Client یک مؤلفه است که توسط کاربر Docker برای تعامل با Daemon Docker و صدور دستورات استفاده می‌شود. این دستورات بر اساس Docker API هستند.

معماری داکر

معماری Docker از لایه‌ها ساخته شده است، همانطور که در ادامه به آن خواهیم پرداخت. لایه پایین سرور فیزیکی است که ما از آن برای میزبانی ماشین‌های مجازی استفاده می‌کنیم. این همان معماری مجازی سازی سنتی است.
لایه دوم سیستم عامل میزبان (Host OS) که ماشین پایه (یعنی ویندوز یا لینوکس) است. بعد، Docker Engine است که برای اجرای سیستم عامل از آن استفاده می‌کنیم. در بالای آن برنامه هایی قرار دارند که به عنوان کانتینرهای Docker اجرا می‌شوند. Docker Objects از ایمیج‌ها و کانتینرها تشکیل شده‌اند.

کانتینرها (Containers) و ایمیج (images)

ساختار اصلی Docker به ایمیج و کانتینرها متکی است. می توانیم کانتینر را به عنوان یک شی(object) و ایمیج را به عنوان کلاس (class) آن در نظر بگیریم.

کانتینر یک سیستم ایزوله است که همه چیز مورد نیاز برای اجرای یک برنامه خاص را در خود جای می‌دهد. این یک نمونه (instance) خاص از یک ایمیج است که محیط لازم را شبیه سازی می‌کند. دستور زیر برای اجرای یک کانتینر Ubuntu Docker و دسترسی به پوسته bash است:


docker run -i -t ubuntu /bin/bash

از سوی دیگر، از ایمیج‌ها برای راه اندازی کانتینرها استفاده می‌شود. از کانتینرهای در حال اجرا، می‌توانیم ایمیج‌هایی را دریافت کنیم که می‌توانند با هم ترکیب شوند تا یک روش system-agnostic برای بسته‌بندی برنامه‌ها را تشکیل دهند.

ایمیج را می توان از پیش ساخته، از رجیستری‌ها بازیابی کرد، از رجیستری‌های موجود ایجاد کرد یا از طریق یک شبکه مشترک با هم ترکیب کرد.

داکر فایل (Dockerfiles)

Dockerfiles به این معنی است که چگونه برنامه خود را کانتینر می‌کنیم یا چگونه یک کانتینر جدید از یک ایمیج از پیش ساخته شده می‌سازیم و منطق سفارشی را برای شروع برنامه خود اضافه می‌کنیم. از یک Dockerfile، از دستور Docker build برای ایجاد یک ایمیج استفاده می‌کنیم.

یک Dockerfile را به عنوان یک سند متنی در نظر بگیرید که حاوی دستوراتی است که در خط فرمان برای ساختن یک ایمیج  فراخوانی می‌کنیم.


در زیر نمونه‌ای از Dockerfile آورده شده است:


FROM python:3
 
WORKDIR /usr/src/app
 
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
 
COPY . .
 
CMD [ "python", "./your-daemon-or-script.py" ]

لایه‌ها (Layers)

یک Dockerfile به صورت لایه‌ای کار می‌کند. اینها بلوک‌های سازنده Docker هستند. لایه اول با کلمه کلیدی FROM شروع می‌شود و مشخص می‌کند که از کدام ایمیج از پیش ساخته شده برای ساختن یک ایمیج استفاده کنیم. سپس می‌توانیم مجوزهای کاربر و اسکریپت‌های راه اندازی را تعریف کنیم.

در داکر، یک کانتینر ایمیجی است که یک لایه قابل خواندن در بالای یک لایه read-onlyساخته شده است. این لایه‌ها intermediate images نامیده می‌شوند و زمانی که دستورات را در Dockerfile خود در مرحله ساخت اجرا می‌کنیم، تولید می‌شوند.

داکر رجیستری (Docker Registry)

Docker Registry یک مکان متمرکز برای ذخیره و توزیع ایمیج‌های Docker است. پرکاربردترین رجیستری پابلیک Docker Hub است، اما شما می‌توانید رجیستری private خود را هم ایجاد کنید.

داکر دیمن (Docker Daemon)

Docker Daemon روی یک ماشین میزبان اجرا می‌شود و کانتینرها، ایمیج‌ها، شبکه‌ها و Volume‌‌ها را مدیریت می‌کند. دستورات را از داکر کلاینت دریافت و اجرا می‌نماید. Daemon Docker از Docker images برای ایجاد کانتینرها استفاده می‌کند.

داکر هاب (Docker Hub)

Docker Hub یک Docker Registry است که فضای ذخیره سازی نامحدودی را برای ایمیج‌های پابلیک فراهم کرده  و برنامه‌های پولی را برای میزبانی private images ارائه می‌دهد. هر کسی می تواند به یک public image دسترسی داشته باشد. اما برای انتشار و دسترسی به ایمیج‌ها در داکر هاب، ابتدا باید یک حساب کاربری ایجاد کرد.

در ادامه چند دستور رایج برای استفاده از Docker Hub آمده است:

  • docker login: از خط فرمان به حساب Docker Hub خود وارد شوید.
  • docker pull: یک ایمیج را از Docker Hub در دستگاه لوکال خود دانلود کنید. به عنوان مثال، Docker pull alpine.
  • docker push: یک ایمیج لوکال را در Docker Hub آپلود کنید. به عنوان مثال، docker push username/image-name 
  • docker search: یک ایمیج را در Docker Hub جستجو کنید. به عنوان مثال، docker search alpine.
  • docker tag: یک ایمیج را با نام ویا تگ جدید مخزن تگ کنید. به عنوان مثال docker tag image-id username/repository:tag
  • docker images: فهرست همه ایمیج‌ها در ماشین لوکال.
  • docker rmi: یک ایمیج را از دستگاه لوکال حذف کنید. به عنوان مثال، docker rmi 4535، که در آن 4535 شناسه یک ایمیج موجود در دستگاه شما است.

مقایسه Dockerfile با Docker Compose

هر دو Dockerfile و Docker Compose ابزارهایی در اکوسیستم Docker image هستند. Dockerfile یک فایل متنی است که حاوی یک image است و دستوراتی که یک توسعه دهنده می‌تواند برای جمع آوری image فراخوانی کند. دستورات معمولا فرآیندهای ساده ای مانند نصب وابستگی‌ها، کپی کردن فایل‌ها و پیکربندی تنظیمات هستند.

Docker Compose ابزاری برای تعریف و اجرای برنامه‌های Docker چند کانتینری (multi-container) است. اطلاعاتی که خدمات و شبکه‌های یک برنامه کاربردی را توصیف می‌کند در یک فایل YAML به نام docker-compose.yml موجود است.

یکی از عملکردهای پایه Docker Compose ساخت (build) ایمیج از Dockerfiles است. با این حال، Docker Compose قادر به هماهنگ سازی کانتینری و استقرار بسته‌های نرم افزاری متعدد است. شما می‌توانید انتخاب کنید که کدام ایمیج‌ها برای سرویس‌های خاص استفاده شوند، متغیرهای محیطی خاص را تنظیم کنید، اتصالات شبکه را پیکربندی کنید و موارد دیگر.

در ادامه سه مرحله ضروری که اکثر گردش‌های کاری Docker را شروع می‌کنند آورده شده است:

  • برای هر ایمیجی که می‌خواهید اضافه کنید یک Dockerfile بسازید
  • از Docker Compose برای جمع آوری ایمیج‌ها با دستور build استفاده کنید.
  • با استفاده از دستور build همراه با /path/to/dockerfiles، مسیر Dockerfiles را مشخص کنید.

به طور خلاصه، Dockerfiles دستورالعمل‌ها را برای یک ایمیج در یک برنامه تعریف می‌کند، اما Docker Compose ابزاری است که به شما امکان می‌دهد یک برنامه چند کانتینری ایجاد و دستکاری کنید.

مقایسه Dockerfile و Docker Compose

سرور مجازی لینوکس یک ماشین مجازی کامل است که امکان دسترسی SSH طبق آموزش را به آن خواهید داشت.
خرید سرور مجازی لینوکس در پنج موقعیت جغرافیایی ایران، ترکیه، هلند، آلمان و آمریکا با قابلیت تحویل آنی در پارسدو فراهم است.
آیا می‌دانید در پارسدو می‌توان سرور مجازی Docker بر بستر دبیان 11 سفارش داد؟

 

شروع کار با ساخت Docker Compose

Docker Compose یک ابزار Docker است که برای تعریف و اجرای برنامه‌های چند کانتینری استفاده می‌شود. با Compose، از یک فایل YAML برای پیکربندی سرویس‌های برنامه خود استفاده نموده و همه سرویس‌های برنامه را از آن پیکربندی ایجاد می‌کنید.

به docker-compose به عنوان یک گردش کار چند کانتینری خودکار فکر کنید. Compose یک ابزار عالی برای توسعه، تست، گردش کار CI و محیط های staging است. با توجه به مستندات Docker، محبوب‌ترین ویژگی‌های Docker Compose عبارتند از:

  • چندین محیط ایزوله روی یک میزبان واحد
  • هنگام ایجاد کانتینرها، داده‌های volume را حفظ کنید
  • فقط کانتینرهای تغییر یافته را دوباره ایجاد کنید
  • متغیرها و جابجایی یک ترکیب بین محیط‌ها
  • کانتینرهای متعددی را که با هم کار می کنند هماهنگ (Orchestrate) کنید

مقایه داکر و داکر کامپوز

آموزش نصب و استفاده از Docker Compose

Compose از Docker Engine استفاده می‌کند، بنابراین باید Docker Engine را روی دستگاه خود نصب کنید. می‌توانید Compose را در ویندوز، مک و لینوکس ۶۴ بیتی اجرا کنید. نصب Docker Compose در واقع بسیار آسان است.

در سیستم‌های دسکتاپ، مانند Docker Desktop برای Mac و Windows، Docker Compose قبلار گنجانده شده است. هیچ مرحله اضافی لازم نیست. در سیستم های لینوکس، شما باید:

  1. Docker Engine را نصب کنید
  2. برای دانلود Docker Compose دستور زیر را اجرا کنید

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

 

  1. مجوزها را به باینری اعمال کنید، مانند:

sudo chmod +x /usr/local/bin/docker-compose

  1. نصب را تست کنید تا بررسی شود که درست کار کرده است

$ docker-compose --version
docker-compose version 1.26.2, build 1110ad01

صرف نظر از نحوه نصب آن، پس از بارگیری و اجرای صحیح Docker Compose، می توانید از آن با Dockerfiles خود استفاده کنید. این فرآیند به سه مرحله اساسی نیاز دارد:

  1. محیط برنامه خود را با استفاده از Dockerfile تعریف کنید. به این ترتیب می توان آن را تکثیر کرد.
  2. سرویس‌های برنامه خود را در فایل docker-compose.yml تعریف کنید. به این ترتیب، آنها می‌توانند در یک محیط ایزوله اجرا شوند.
  3. برای شروع برنامه خود، docker-compose را اجرا کنید.

شما به راحتی می توانید Docker Compose را به یک پروژه از قبل موجود اضافه کنید. اگر قبلار مقداری Dockerfiles دارید، با باز کردن Command Palette، فایل‌های Docker Compose را اضافه کنید. از Docker: Docker Compose Files در دستور Workspace استفاده کنید و پس از ارتقا، Dockerfiles را که می‌خواهید اضافه کنید انتخاب نمائید.

همچنین می‌توانید فایل‌های Docker Compose را با افزودن Dockerfile به فضای کاری خود اضافه کنید. به طور مشابه، Command Palette را باز کنید و از دستور Docker: Add Docker Files to Workspace استفاده کنید.

سپس از شما پرسیده می شود که آیا می خواهید فایل‌های Docker Compose را اضافه کنید. در هر دو مورد، پسوند Compose فایل docker-compose.yml را به فضای کاری شما اضافه می‌نماید.


ساختار فایل Docker Compose

اکنون که می‌دانیم چگونه Docker Compose را دانلود کنیم، باید نحوه عملکرد فایل‌های Compose را بدانیم. در واقع ساده تر از چیزی است که به نظر می رسد. به طور خلاصه، فایل‌های Docker Compose با اعمال چندین دستور که در یک فایل پیکربندی docker-compose.yml اعلام شده‌اند، کار می‌کنند.

ساختار اصلی یک فایل YAML Docker Compose به شکل زیر است:

version: 'X'
services:
  web:
    build: .
    ports:
     - "5000:5000"
    volumes:
     - .:/code
  redis:
    image: redis

اکنون، بیایید به یک مثال واقعی از یک فایل Docker Compose نگاه کنیم و آن را گام به گام تجزیه کنیم تا همه اینها را بهتر درک کنیم. توجه داشته باشید که تمام بند ها و کلمات کلیدی در این مثال استاندارد صنعتی هستند و معمولا استفاده می شوند.
فقط با این موارد، می توانید یک گردش کار توسعه را شروع کنید. کلمات کلیدی پیشرفته تری وجود دارد که می توانید از آنها در پروداکشن استفاده کنید، اما در حال حاضر، اجازه دهید فقط با بندهای ضروری شروع کنیم.


version: '3'
services:
  web:
    # Path to dockerfile.
    # '.' represents the current directory in which
    # docker-compose.yml is present.
    build: .
    # Mapping of container port to host
    
    ports:
      - "5000:5000"
    # Mount volume 
    volumes:
      - "/usercode/:/code"
    # Link database container to app container 
    # for reachability.
    links:
      - "database:backenddb"
    
  database:
    # image to fetch from docker hub
    image: mysql/mysql-server:5.7
    # Environment variables for startup script
    # container will use these variables
    # to start the container with these define variables. 
    environment:
      - "MYSQL_ROOT_PASSWORD=root"
      - "MYSQL_USER=testuser"
      - "MYSQL_PASSWORD=admin123"
      - "MYSQL_DATABASE=backend"
    # Mount init.sql file to automatically run 
    # and create tables for us.
    # everything in docker-entrypoint-initdb.d folder
    # is executed as soon as container is up nd running.
    volumes:
      - "/usercode/db/init.sql:/docker-entrypoint-initdb.d/init.sql"

    

 

  • ‘version ‘3 - نشان می‌دهد که از نسخه 3 Docker Compose استفاده می‌کنیم و Docker ویژگی‌های مناسب را ارائه می دهد. در زمان نگارش این مطلب، نسخه 3.7 آخرین نسخه Compose است.
  • Services - این بخش تمام کانتینرهای مختلفی را که ما ایجاد خواهیم کرد را تعریف می‌کند. در مثال ما دو سرویس وب و دیتابیس داریم.
  • Web - نام سرویس برنامه Flask ما است. Docker Compose کانتینرهایی با نامی که ما ارائه می‌کنیم ایجاد می‌نماید.
  • build: مکان Dockerfile را مشخص می‌کند و . نشان دهنده دایرکتوری است که فایل docker-compose.yml در آن قرار دارد.
  • Ports - برای نگاشت پورت‌های کانتینر به ماشین میزبان استفاده می‌شود.
  • Volumes - دقیقا مانند گزینه -v برای نصب دیسک در Docker است. در این مثال، دایرکتوری فایل‌های کد خود را به دایرکتوری ./code کانتینرها متصل می‌کنیم. به این ترتیب، در صورت ایجاد تغییرات، نیازی به بازسازی ایمیج‌ها نخواهیم داشت.
  • Links - یک سرویس را به سرویس دیگر لینک می‌کند. برای bridge network، باید مشخص کنیم که کدام کانتینر باید با استفاده از لینک‌ها به کدام کانتینر دسترسی داشته باشد.
  • Image -  اگر Dockerfile نداریم و می‌خواهیم سرویسی را با استفاده از یک ایمیج از پیش ساخته شده اجرا کنیم، مکان ایمیج را با استفاده از عبارت image مشخص می‌کنیم. Compose یک کانتینر را از آن ایمیج جدا می‌کند.
  • Environment - این بند به ما اجازه می‌دهد تا یک متغیر محیطی را در کانتینر تنظیم کنیم. این همان آرگومان -e در Docker هنگام اجرای یک کانتینر است.
  • تبریک میگم اکنون کمی در مورد Docker Compose و بخش‌های لازم برای شروع گردش کار خود می‌دانید.

دستورات Docker Compose

اکنون که می دانیم چگونه یک فایل docker-compose ایجاد کنیم، بیایید به رایج ترین دستورات Docker Compose که می توانیم با فایل‌های خود استفاده کنیم، بپردازیم. به خاطر داشته باشید که ما فقط در مورد دستورات پرکاربرد بحث خواهیم کرد.

دستور docker-compose:
 هر دستور Compose با این دستور شروع می‌شود. همچنین می‌توانید از docker-compose --help برای ارائه اطلاعات اضافی درباره آرگومان‌ها و جزئیات پیاده‌سازی استفاده کنید.


$ docker-compose --help
Define and run multi-container applications with Docker

دستور docker-compose build:
 دستور build ایمیج‌ها را در فایل docker-compose.yml ساخته یا rebuild می‌کند. این فایل شامل تمام تنظیمات لازم برای تمام سرویس‌هایی است که برنامه را تشکیل می‌دهند.
کار دستور build این است که ایمیج‌ها را برای ایجاد کانتینر آماده می‌کند. اگر سرویسی از ایمیج از پیش ساخته شده استفاده می‌نماید، این دستور را skip می‌کند. دستور docker-compose build ، Dockerfile را برای هر سرویس، از جمله دستورالعمل‌های ساخت ایمیج، می‌خواند. سپس می توان از ایمیج‌های ساخته شده برای ایجاد کانتینر برای هر سرویس با استفاده از دستور docker-compose up استفاده کرد.
علاوه بر این، ما از دستور docker-compose build command برای ساختن ایمیج‌ها برای سرویس‌ها به روشی سازگار و قابل تکرار استفاده و استقرار در محیط‌های مختلف را آسان‌تر می‌کنیم.


$ docker-compose build
database uses an image, skipping
Building web
Step 1/11 : FROM python:3.9-rc-buster
 ---> 2e0edf7d3a8a
Step 2/11 : RUN apt-get update && apt-get install -y docker.io

دستور docker-compose images:
 این دستور ایمیج‌هایی را که با استفاده از فایل docker-compose فعلی ساخته‌اید فهرست می‌کند.


docker-compose images
          Container                  Repository        Tag       Image Id       Size  
--------------------------------------------------------------------------------------
7001788f31a9_docker_database_1   mysql/mysql-server   5.7      2a6c84ecfcb2   333.9 MB
docker_database_1                mysql/mysql-server   5.7      2a6c84ecfcb2   333.9 MB
docker_web_1                                     d986d824dae4   953 MB

دستور docker-compose stop:

 این دستور کانتینرهای در حال اجرا سرویس های مشخص شده را متوقف می کند.


$ docker-compose stop
Stopping docker_web_1      ... done
Stopping docker_database_1 ... done

دستور docker-compose run: 
شبیه به دستور docker run است و کانتینرها را از ایمیج ساخته شده برای سرویس‌های ذکر شده در فایل compose ایجاد می‌کند.


$ docker-compose run web
Starting 7001788f31a9_docker_database_1 ... done
 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 116-917-688


دستور docker-compose up:

 این دستور کار دستورات docker-compose build و docker-compose را اجرا می‌کند. اگر ایمیج‌هایی به صورت لوکال قرار نگرفته باشند، می‌سازد و کانتینرها را راه اندازی می‌کند. اگر ایمیج‌هایی از قبل ساخته شده باشند، به طور مستقیم کانتینر را fork می‌کند.


$ docker-compose up
Creating docker_database_1 ... done
Creating docker_web_1      ... done
Attaching to docker_database_1, docker_web_1

دستور docker-compose ps: 
این دستور تمام کانتینرهای فایل docker-compose فعلی را لیست کرده که آنها می‌توانند در حال اجرا باشند یا متوقف شوند.


$ docker-compose ps
      Name                 Command             State               Ports         
---------------------------------------------------------------------------------
docker_database_1   /entrypoint.sh mysqld   Up (healthy)   3306/tcp, 33060/tcp   
docker_web_1        flask run               Up             0.0.0.0:5000->5000/tcp
 
$ docker-compose ps
      Name                 Command          State    Ports
----------------------------------------------------------
docker_database_1   /entrypoint.sh mysqld   Exit 0        
docker_web_1        flask run               Exit 0    


دستور docker-compose down:
 این دستور مشابه دستور docker system prune است. با این حال در Compose، تمام سرویس ها را متوقف نموده و کانتینرها، شبکه‌ها و ایمیج‌ها را پاک می‌کند.


$ docker-compose down
Removing docker_web_1      ... done
Removing docker_database_1 ... done
Removing network docker_default
(django-tuts) Venkateshs-MacBook-Air:Docker venkateshachintalwar$ docker-compose images
Container   Repository   Tag   Image Id   Size
----------------------------------------------
(django-tuts) Venkateshs-MacBook-Air:Docker venkateshachintalwar$ docker-compose ps
Name   Command   State   Ports
------------------------------

اکنون بیشتر دستورات اولیه Docker Compose را یاد گرفته‌اید. برای اطلاعات بیشتر می‌توانید مستندات docker compose را بررسی و به یادگیری ادامه دهید!