English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Docker Compose

مقدمة إلى Compose

Compose هو أداة تستخدم لتعريف وتشغيل تطبيقات Docker متعددة الحاويات. من خلال Compose، يمكنك استخدام ملف YML لضبط جميع الخدمات التي يحتاجها التطبيق. ثم، باستخدام أمر واحد، يمكنك إنشاء وتشغيل جميع الخدمات من إعدادات YML.

الخطوات الثلاث التي يستخدمها Compose:

  • استخدم Dockerfile لتعريف بيئة التطبيق.

  • استخدم docker-compose.yml لتعريف الخدمات التي تشكل التطبيق، بحيث يمكن تشغيلها معًا في بيئة معزولة.

  • في النهاية، قم بتنفيذ الأمر docker-compose up لبدء تشغيل وتشغيل التطبيق بأكمله.

مثال إعدادات docker-compose.yml كما يلي (معايير الإعدادات في النص أدناه):

# مثال على تكوين yaml
version: '3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

تثبيت Compose

Linux

في Linux يمكننا تنزيل حزمة التطبيق من Github واستخدامها، العنوان الأحدث للإصدار الجديد:https://github.com/docker/compose/releases

الآن يمكنك تشغيل الأوامر التالية للتنزيل إصدار Docker Compose الحالي المستقر:

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

للتنزيل إصدارًا آخر من Compose، قم بتبديل 1.24.1.

تطبيق صلاحيات التنفيذ على الملفات الثنائية:

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

إنشاء رابط مجاز:

$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

اختبار التثبيت الناجح:

$ docker-compose --version
cker-compose إصدار 1.24.1، بناء 4667896b

ملاحظةبالنسبة لـ alpine، تحتاج إلى باقات التبعية التالية: py-pip،python-dev،libffi-dev،openssl-dev،gcc،libc-dev،و make.

macOS

يحتوي Docker Desktop وDocker Toolbox على Compose وأدوات Docker الأخرى، لذا لا تحتاج المستخدمون على Mac إلى تثبيت Compose بشكل منفرد. يمكن مراجعة تعليمات تثبيت Docker في تثبيت Docker على MacOS

الكمبيوتر الشخصي Windows

يحتوي Docker Desktop وDocker Toolbox على Compose وأدوات Docker الأخرى، لذا لا تحتاج المستخدمون على Windows إلى تثبيت Compose بشكل منفرد. يمكن مراجعة تعليمات تثبيت Docker في تثبيت Docker على Windows

استخدام

1、إعداد

أنشئ دليلًا للاختبار:

$ mkdir composetest
$ cd composetest

أنشئ ملفًا اسمه app.py في دليل الاختبار، وأكتب المحتويات التالية:

كود ملف composetest/app.py

import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.
'.format(count)

في هذا المثال، redis هو اسم المستضيف للصندوق الذي يحتوي على Redis في الشبكة التطبيقية، والمنفذ المستخدم هو 6379.

في دليل composetest، أنشئ ملفًا آخر اسمه requirements.txt، يحتوي على محتويات التالي:

flask
redis

2、أنشئ ملف Dockerfile

في دليل composetest، أنشئ ملفًا اسمه Dockerfile، يحتوي على محتويات التالي:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

توضيح محتويات Dockerfile:

  • FROM python:3.7-alpine: يتم بناء الصورة من صورة Python 3.7.

  • WORKDIR /code: تُحدد دليل العمل إلى /code.

  • ENV FLASK_APP app.py
    ENV FLASK_RUN_HOST 0.0.0.0

    إعداد المتغيرات البيئية المستخدمة لأمر flask.

  • RUN apk add --no-cache gcc musl-dev linux-headers: تثبيت gcc لتحسين سرعة التجميع لبكات Python مثل MarkupSafe و SQLAlchemy.

  • COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt

    استنساخ requirements.txt وتثبيت التبعيات Python.

  • COPY . .: استنساخ مجلد الحالي من . المشروع إلى مجلد العمل في . الصورة.

  • CMD ["flask", "run"]: يقدم المحاور أوامر افتراضية للتنفيذ:flask run.

3、إنشاء docker-compose.yml

في مجلد الاختبار،أنشئ ملفًا يُدعى docker-compose.yml،ثم ألصق المحتوى التالي فيه:

ملف docker-compose.yml لإعداد

# إعداد yaml
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

يحدد ملف Compose هذا خدمتين: web و redis.

  • web:خدمة web تستخدم الصورة المبنية من Dockerfile في مجلد الحالي.ثم،ستقوم بربط المحاور في المضيف مع الموانئ المفتوحة 5000.خدمة هذا المثال تستخدم ميناء Flask Web Server الافتراضي 5000.

  • redis:خدمة redis تستخدم الصورة العامة لـ Redis من Docker Hub.

4、استخدام أوامر Compose لبناء وتشغيل تطبيقك

في مجلد الاختبار،شغّل الأوامر التالية لبدء التطبيق:

docker-compose up

إذا كنت ترغب في تشغيل الخدمة في الخلفية،يمكنك إضافة 参数 -d:

docker-compose up -d

مرجع أوامر yml

version

تحديد إصدار compose الذي يتبعه هذا yml.

build

تحديد مسار سياق بناء الصورة:

على سبيل المثال،خدمة webapp،تم تحديدها بأنها تم بناء الصورة من المسار ./dir/Dockerfile المحدد في السياق:

version: "3.7"
services:
  webapp:
    build: ./dir

أو،بصفتها كائنًا يحتوي على المسار المحدد في السياق، بالإضافة إلى Dockerfile و args الاختياري:

version: "3.7"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
      target: prod
  • context: مسار السياق.

  • dockerfile: تحديد اسم ملف Dockerfile لبناء الصورة.

  • args: إضافة معلمات البناء، وهي متغيرات بيئية يمكن الوصول إليها فقط أثناء عملية البناء.

  • labels: تعيين علامات بناء الصورة.

  • target:بناء متعدد الطبقات، يمكن تحديد الطبقة التي سيتم بناؤها.

cap_add،cap_drop

إضافة أو إزالة الميزات النووية التي يمتلكها الصندوق على مضيف النظام.

cap_add:
  - ALL # فتح جميع الأذونات
cap_drop:
  - SYS_PTRACE # إغلاق ptrace权限

cgroup_parent

تحديد مجموعة cgroup الأم للصندوق، مما يعني أن الصندوق سيرث قيود الموارد لهذه المجموعة.

cgroup_parent: m-executor-abcd

command

استبدال الأمر الافتراضي الذي يتم تشغيله في الصندوق.

command: ["bundle", "exec", "thin", "-p", "3000"]

container_name

تحديد اسم صندوق مخصص بدلاً من الاسم الافتراضي المولد.

container_name: my-web-container

depends_on

إعداد الاعتمادات.

  • docker-compose up :يبدأ الخدمات وفقًا لترتيب الاعتماد. في المثال التالي، سيتم تشغيل db وredis أولاً قبل تشغيل web.

  • docker-compose up SERVICE :يشمل تلقائيًا اعتمادات SERVICE. في المثال التالي، سيقوم docker-compose up web أيضًا بإنشاء وتشغيل db وredis.

  • docker-compose stop :يوقف الخدمات وفقًا لترتيب الاعتماد. في المثال التالي، يتم إيقاف web قبل db وredis.

version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    صورة: postgres

ملاحظة: خدمة الويب لن تنتظر بدء redis db بشكل كامل قبل بدء التشغيل.

deploy

تحديد إعدادات التركيب وال تشغيل الخدمة. سيكون هذا مفيدًا فقط في نمط swarm.

version: "3.7"
services:
  redis:
    image: redis:alpine
    deploy:
      mode: replicated
      replicas: 6
      endpoint_mode: dnsrr
      labels: 
        description: "This redis service label"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

يمكن اختيار المعاملات التالية:

endpoint_modeتعيين كيفية الوصول إلى خدمة المجموعة.

endpoint_mode: vip 
#Docker Cluster Service one external virtual IP. جميع الطلبات سيتم توجيهها عبر هذا العنوان IP إلى أجهزة الخادم الموجودة داخل خدمة المجموعة.
endpoint_mode: dnsrr
#DNS Polling (DNSRR). جميع الطلبات سيتم توجيهها تلقائيًا للوصول إلى عنوان IP من قائمة ip المجموعة.

labelsتعيين العلامات على الخدمة. يمكن استخدام labels في الصندوق (مثل إعدادات deploy) لتغطية labels تحت deploy.

modeتعيين نمط الخدمة التي يقدمها الخدمة.

  • replicatedتعيين الخدمة المكررة، حيث يتم نسخ الخدمة المحددة إلى أجهزة الخادم في المجموعة.

  • globalتعيين الخدمة العالمية، حيث سيتم توزيع الخدمة على كل عقد في المجموعة.

  • الشرح: في الصورة التالية، المربعات الصفراء تعكس حالة التشغيل في mode replicated، والمربعات الرمادية تعكس حالة التشغيل في mode global.

replicas: mode عندما يكون mode هو replicated،يجب استخدام هذا المعامل لتحديد عدد العقد المحدد لتشغيل.

resourcesتعيين محدودة استخدام موارد الخادم، مثل مثال السابق، تعيين النسبة المئوية للمعالج و استهلاك الذاكرة المطلوبة لتشغيل مجموعة redis. تجنب استخدام موارد عالية قد يؤدي إلى حالات استثنائية.

restart_policyتعيين كيفية إعادة تشغيل الصندوق عند مغادرة الصندوق.

  • condition: اختياري none،on-failure أو any (القيمة الافتراضية: any).

  • delay: تعيين وقت إعادة التشغيل بعد ذلك (القيمة الافتراضية: 0).

  • max_attempts: عدد محاولات إعادة تشغيل الوعاء، بعد الوصول إلى هذا العدد، لا يتم محاولة إعادة التشغيل مرة أخرى (القيمة الافتراضية: تستمر في المحاولة).

  • window: تعيين وقت انتهاء الصلاحية لإنشاء وعاءات جديدة (القيمة الافتراضية: 0).

rollback_config:يحدد كيفية التراجع عند فشل التحديث.

  • parallelism: عدد الوعاءات التي يتم تراجعها مرة واحدة. إذا تم تعيينها على 0، فإن جميع الوعاءات سيتراجعون في نفس الوقت.

  • delay: مدة الانتظار بين تراجع كل مجموعة وعاءات (افتراضي 0s).

  • failure_action: ما يجب القيام به إذا فشل التراجع. إما continue أو pause (افتراضي pause).

  • monitor: مدة مراقبة كل وعاء بعد تحديثه لمعرفة ما إذا فشل (ns|us|ms|s|m|h) (افتراضي 0s).

  • max_failure_ratio: نسبة الفشل التي يمكن التسامح فيها أثناء التراجع (افتراضي 0).

  • order: ترتيب العمليات أثناء التراجع. إما stop-first (التراجع المتسلسل) أو start-first (التراجع المتوازي) (افتراضي stop-first ).

update_config:يحدد كيفية تحديث التكوين، وهو مفيد جدًا للتحديثات المتداخلة في التكوين.

  • parallelism: عدد الوعاءات التي يتم تحديثها مرة واحدة.

  • delay: مدة الانتظار بين تحديث مجموعات الوعاءات.

  • failure_action: ما يجب القيام به إذا فشل التحديث. إما continue،rollback أو pause (افتراضي pause).

  • monitor: مدة مراقبة كل وعاء بعد تحديثه لمعرفة ما إذا فشل (ns|us|ms|s|m|h) (افتراضي 0s).

  • max_failure_ratio: نسبة الفشل التي يمكن التسامح فيها أثناء عملية التحديث.

  • order: ترتيب العمليات أثناء التراجع. إما stop-first (التراجع المتسلسل) أو start-first (التراجع المتوازي) (افتراضي stop-first).

ملاحظة:يدعم فقط الإصدار V3.4 وما فوق.

devices

تحديد قائمة تحويل الأجهزة.

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

dns

تخصيص خادم DNS، يمكن أن يكون قيمة واحدة أو قائمة بالعديد من القيم.

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search

تخصيص مجال البحث في DNS. يمكن أن يكون قيمة واحدة أو قائمة.

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

entrypoint

يغطي الملف الداخلي للمدخل الافتراضي للوعاء.

entrypoint: /code/entrypoint.sh

يمكن أن تكون أيضًا في الشكل التالي:

entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

env_file

إضافة متغيرات البيئة من ملف. يمكن أن تكون قيمة واحدة أو قائمة بأكثر من قيمة.

env_file: .env

يمكن أن تكون قائمة أيضًا:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

environment

إضافة متغيرات البيئة. يمكنك استخدام مصفوفة أو قاموس، أي قيمة بولية، يجب استخدام العلامات البروجيكية لتأكد من أن محلل YML لن يتحول إلى True أو False.

environment:
  RACK_ENV: development
  SHOW: 'true'

 

expose

تعرض المنفذ، ولكن لا يتم تمريره إلى المضيف، ويتم الوصول إليه فقط من الخدمة المتصلة.

يمكن تحديد منفذ داخلي فقط كمعامل:

expose:
 - "3000"
 - "8000"

extra_hosts

إضافة ارتباط اسم المضيف. يشبه docker client --add-host.

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

سيتم إنشاء ارتباط بين عنوان IP والاسم المضيف في /etc/hosts داخل صندوق الخدمة التالي:

162.242.195.82 somehost
50.31.209.229 otherhost

healthcheck

لتحقق من تشغيل خدمة docker بشكل صحيح.

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"] # تعيين برنامج التحقق
  interval: 1m30s # تعيين فترة التحقق
  timeout: 10s # تعيين وقت انقضاء التحقق
  retries: 3 # تعيين عدد المحاولات
  start_period: 40s # بعد بدء التشغيل، بعد كم ثانية يبدأ تشغيل برنامج التحقق

image

تحديد صورة التشغيل للصندوق.

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # معرف الصورة

logging

إعداد تسجيل الخدمة.

driver: تحديد محرك تسجيل الخدمة الخاصة بالجهاز، القيمة الافتراضية json-file. هناك خيارات ثلاثة

driver: "json-file"
driver: "syslog"
driver: "none"

في محرك json-file فقط، يمكن استخدام المعلمات التالية لتحديد عدد السجلات والحجم.

logging:
  driver: json-file
  options:
    max-size: "200k" # حجم ملف واحد 200k
    max-file: "10" # أقصى عدد من الملفات 10

عند الوصول إلى الحد الأعلى للملفات، سيتم حذف الملفات القديمة تلقائيًا.

في محرك syslog، يمكن استخدام syslog-address لتعيين عنوان استقبال السجلات.

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"

network_mode

إعداد نمط الشبكة.

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[اسم الخدمة]"
network_mode: "container:[اسم الجهاز/معرف الجهاز]"

networks

تخطيط الشبكة التي يربط بها الجهاز، مرجعًا إلى عنصر networks الرئسي.

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # استخدم محركًا مخصصًا
    driver: custom-driver-1
  other-network:
    # استخدم محركًا مخصصًا يحتوي على خيارات خاصة
    driver: custom-driver-2

aliases :استطاعة الأجهزة الأخرى على نفس الشبكة الاتصال بخدمة الجهاز المطلوب باستخدام اسم الخدمة أو هذا الاسم البديل。

restart

  • no:是默认的重启策略,在任何情况下都不会重启容器。

  • always:容器总是重新启动。

  • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。

  • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

注:swarm 集群模式,请改用 restart_policy。

secrets

存储敏感数据,例如密码:

version: "3.1"
services:
mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
  secrets:
    - my_secret
secrets:
  my_secret:
    file: ./my_secret.txt

security_opt

修改容器默认的 schema 标签。

security-opt:
  - label:user:USER # 设置容器的用户标签
  - label:role:ROLE # 设置容器的角色标签
  - label:type:TYPE # 设置容器的安全策略标签
  - label:level:LEVEL # 设置容器的安全等级标签

stop_grace_period

指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。

stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒

默认的等待时间是 10 秒。

stop_signal

设置停止容器的代替信号。默认情况下使用 SIGTERM。

以下示例,使用 SIGUSR1 代替信号 SIGTERM 来停止容器。

stop_signal: SIGUSR1

sysctls

设置容器中的内核参数,可以使用数组或字典格式。

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0
sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

tmpfs

تثبيت نظام ملفات مؤقت داخل القمرة. يمكن أن يكون قيمة واحدة أو قائمة من القيم.

tmpfs: /run
tmpfs:
  - /run
  - /tmp

ulimits

إزالة ulimit الافتراضي للقمر.

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

volumes

تثبيت ملف أو مجلد محلي على قمرة.

version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"