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

Docker Compose

О Compose

Compose - это инструмент для определения и запуска的多container 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 version 1.24.1, build 4667896b

ВниманиеДля alpine потребуются следующие зависимости: py-pip, python-dev, libffi-dev, openssl-dev, gcc, libc-dev и make.

macOS

Docker Desktop для Mac и Docker Toolbox уже включают Compose и другие приложения Docker, поэтому пользователи Mac не нуждаются в отдельной установке Compose. Руководство по установке Docker можно найти в Установка Docker на MacOS

Windows PC

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! Я был виден {} раз.\n'.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:Этот веб-сервис использует изображение, сконструированное из текущего каталога Dockerfile. Затем он привязывает контейнер и хост к открытым портам 5000. Этот пример сервиса использует порт 5000 по умолчанию веб-сервера Flask.

  • 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:
    webapp:
      build:
      context: ./dir
      dockerfile: Dockerfile-alternate
        args:
      labels:
        buildno: 1
        - "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:
    image: 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 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr
# DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。

labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。

mode:指定服务提供的模式。

  • replicated:复制服务,复制指定服务到集群的机器上。

  • global:全局服务,服务将部署至集群的每个节点。

  • 图解:下图中黄色的方块是 replicated 模式的运行情况,灰色方块是 global 模式的运行情况。

replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。

resources:配置服务器资源使用的限制,例如上实例,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。

restart_policy:配置如何在退出容器时重新启动容器。

  • condition:可选 none,on-failure 或者 any(默认值:any)。

  • delay:设置多久之后重启(默认值:0)。

  • max_attempts:Количество попыток перезапуска контейнера. Если количество попыток exceeds, больше не пытается (по умолчанию всегда пытается).

  • 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"

Выше будет создан файл /etc/hosts в внутреннем контейнере этой услуги с соответствием ip-адреса и имени хоста:

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 # ID образа

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:[service name]"
network_mode: "container:[container name/id]"

networks

Настройка сети контейнера, ссылка на элементы top-level 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

Изменить mặc định schema тег контейнера.

security-opt:
  - label:user:USER # установить тег пользователя контейнера
  - label:role:ROLE # установить тег роли контейнера
  - label:type:TYPE # установить тег стратегии безопасности контейнера
  - label:level:LEVEL # установить тег безопасности контейнера

stop_grace_period

Указать, сколько времени ждать, прежде чем отправить сигнал SIGKILL для закрытия контейнера, если контейнер не может обработать сигнал SIGTERM (или любой другой stop_signal)

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"