English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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: {}
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.
Docker Desktop для Mac и Docker Toolbox уже включают Compose и другие приложения Docker, поэтому пользователи Mac не нуждаются в отдельной установке Compose. Руководство по установке Docker можно найти в Установка Docker на MacOS。
Windows Docker Desktop и Docker Toolbox уже включают Compose и другие приложения Docker, поэтому пользователи Windows не нуждаются в отдельной установке Compose. Руководство по установке Docker можно найти в Установка Docker на Windows。
Создайте тестовый каталог:
$ mkdir composetest $ cd 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
В каталоге 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.
В тестовом каталоге создайте файл с именем docker-compose.yml и вставьте следующее содержимое:
Этот файл Compose определяет два сервиса: web и redis.
web:Этот веб-сервис использует изображение, сконструированное из текущего каталога Dockerfile. Затем он привязывает контейнер и хост к открытым портам 5000. Этот пример сервиса использует порт 5000 по умолчанию веб-сервера Flask.
redis:Этот сервис redis использует общедоступное изображение Redis из Docker Hub.
В тестовом каталоге выполните следующие команды для запуска приложения:
docker-compose up
Если вы хотите запустить этот сервис в фоновом режиме, вы можете добавить параметр -d:
docker-compose up -d
Указать,哪个 версии compose определяет эта yml.
Указать контекстный путь для построения изображения:
Например, сервис 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:установить метки для создания образа.
cap_add,cap_drop
cap_add: добавить или удалить ядровые функции хоста, которые имеет контейнер. - ALL # включить все права cap_drop: - SYS_PTRACE # отключить ptrace权限
указать родительскую группу cgroup для контейнера, что означает наследование ограничений ресурсов этой группы.
cgroup_parent: m-executor-abcd
преобразовать стандартную команду запуска контейнера.
command: ["bundle", "exec", "thin", "-p", "3000"]
указать пользовательское имя контейнера, а не автоматически сгенерированное имя по умолчанию.
container_name: my-web-container
установить зависимости.
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 полностью не запустится, прежде чем он сам запустится.
指定与服务的部署和运行有关的配置。只在 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: - "/dev/ttyUSB0:/dev/ttyUSB0"
Настройка DNS сервера, может быть одним значением или списком значений.
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
Настройка DNS поиска домена. Может быть одним значением или списком.
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
Обычно используется в контейнере.
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
Это также может быть форматом списка:
env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
Добавить переменную окружения. Вы можете использовать массив или словарь, любые булевы значения, булевы значения должны быть заключены в кавычки, чтобы убедиться, что парсер YML не преобразует их в True или False.
environment: RACK_ENV: development SHOW: 'true'
Обнажить порт, но не привязать к хосту, только доступен сервисам, которые подключаются.
Только можно указать внутренний порт в качестве параметра:
expose: - "3000" - "8000"
Добавить соответствие имени хоста. Аналогично 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
Используется для проверки того, здоров ли сервис docker работает.
healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] # Установить программу проверки interval: 1m30s # Установить интервал проверки timeout: 10s # Установить время ожидания проверки retries: 3 # Установить количество попыток перезапуска start_period: 40s # Через сколько секунд после запуска начинать запуск программы проверки
Указать образ для запуска контейнера. Следующие форматы возможны:
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd # ID образа
Конфигурация записи логов услуги.
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: "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 Сервисы других контейнеров на одном и том же сетевом интерфейсе могут быть подключены с помощью имени сервиса или этого псевдонима.
no: это стратегия перезапуска по умолчанию, контейнер не будет перезапускаться ни при каких обстоятельствах.
always: контейнер всегда перезапускается.
on-failure: перезапускать контейнер только в том случае, если он завершен некорректно (состояние выхода не равно 0)
unless-stopped: автоматически перезапускать контейнер при его выходе, но не учитывать контейнеры, которые уже остановлены при запуске Docker-дайвера
restart: "no" restart: always restart: on-failure restart: unless-stopped
Примечание: в режиме кластера swarm, пожалуйста, используйте restart_policy.
Сохранение конфиденциальных данных, таких как пароли:
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
Изменить mặc định schema тег контейнера.
security-opt: - label:user:USER # установить тег пользователя контейнера - label:role:ROLE # установить тег роли контейнера - label:type:TYPE # установить тег стратегии безопасности контейнера - label:level:LEVEL # установить тег безопасности контейнера
Указать, сколько времени ждать, прежде чем отправить сигнал SIGKILL для закрытия контейнера, если контейнер не может обработать сигнал SIGTERM (или любой другой stop_signal)
stop_grace_period: 1s # ждать 1 секунду stop_grace_period: 1m30s # ждать 1 минуту 30 секунд
Время ожидания по умолчанию составляет 10 секунд.
Настройка сигнала для остановки контейнера. По умолчанию используется SIGTERM.
В следующем примере используется SIGUSR1 вместо сигнала SIGTERM для остановки контейнера.
stop_signal: SIGUSR1
Настройка параметров ядра контейнера может быть выполнена в формате массива или словаря.
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
Установить временный файловую систему в контейнере. Может быть одно значение или список из нескольких значений.
tmpfs: /run tmpfs: - /run - /tmp
Перекрыть значения ulimit по умолчанию контейнера.
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
Подключить данные тома или файл хоста к контейнеру.
version: "3.7" services: db: image: postgres:latest volumes: - "/localhost/postgres.sock:/var/run/postgres/postgres.sock" - "/localhost/data:/var/lib/postgresql/data"