источник
Что касается установки docker-compose, основное введение в докер выходит за рамки этой статьи.
Этот пост в основном представляет собой строгий англо-китайский перевод формата файла YAML для создания докеров. Это потому, что вчера я вспомнил, как использовать docker-compose в расположении${PWD}Проблема, то ли китайцы вообще не помогли, то ли официальный сайт окончательно решил мою неясность. Поэтому я думаю, что все же необходимо сделать более строгий перевод и объяснение, чтобы объяснить детали устройства docker-compose.
Ниже мы в основном представимформат файла оркестрации docker-compose версии 3Детали.
После прочтения этой статьи у вас должно быть базовое понимание docker-compose, по крайней мере, базовое понимание раннего (версия 2) формата оркестровки.
Об авторизации
Перевод подчинен оригиналуdocs.docker.com/compose/com….
Перевод https://github.com/hedzr/docker-compose-file-formatРаспространяется под MIT.
Формат аранжировки Версия 3
история
Версия 3 — это формат, поддерживаемый docker-compose с момента появления docker-engine 1.13. До этого Docker запустил режим swarm в версии 1.12 для создания виртуальных вычислительных ресурсов в виртуальной сети, а также значительно улучшил поддержку сети и хранилища Docker.
Для связи между форматом docker-compose и docker-engine в следующей таблице (с официального сайта) есть четкое сравнение.
| Compose file format | Docker Engine release |
|---|---|
| 3.7 | 18.06.0+ |
| 3.6 | 18.02.0+ |
| 3.5 | 17.12.0+ |
| 3.4 | 17.09.0+ |
| 3.3 | 17.06.0+ |
| 3.2 | 17.04.0+ |
| 3.1 | 1.13.1+ |
| 3.0 | 1.13.0+ |
| 2.4 | 17.12.0+ |
| 2.3 | 17.06.0+ |
| 2.2 | 1.13.0+ |
| 2.1 | 1.12.0+ |
| 2.0 | 1.10.0+ |
| 1.0 | 1.9.1.+ |
Структура файла оркестрации с примерами
Вот типичный образец файловой структуры для версии 3+:
version: "3.7"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- "5000:80"
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- "5001:80"
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
В этом примере структура верхнего уровня представленаversion,services,networks,volumesи т.п. состав этикетки. Это не большая разница с версией 2.
существуетservicesВ этой главе вы можете определить несколько служб, каждая из которых обычно запускает контейнер, и эти службы образуют общий стек средств или группу служб.
Вообще говоря, мы организуем кучу разных вещей, таких как куча микросервисов, в сервисный стек, чтобы их можно было обслуживать извне как единое целое, чтобы избежать раскрытия деталей, а также это может усилить гибкость архитектурного проектирования и улучшение общего стека сервисов Масштабирование (вместо того, чтобы иметь дело с большим количеством микросервисов один за другим).
Руководство по форматированию -service
Далее будет структура глав справочного руководства.Мы перечисляем инструкции по оркестровке сервисов в алфавитном порядке, напримерports,volumes,cmd,entryи Т. Д.
build
Этот вариант используется для сборки.
buildМожет быть строкой пути, указывающей на контекст сборки, например:
version: "3.7"
services:
webapp:
build: ./dir
Это также может быть более подробное определение. Это включает в себяcontextпуть, указанный элементом, и необязательноdockerfileфайлы и параметры сборкиargs:
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
Если вы указываетеbuildтакже указаноimage, то результат сборки помечается соответствующим именем, как быdocker build -t container-name:tag dirДелай это так:
build: "./dir"
image: "company/webapp:v1.1.9"
Для YAML безопасным способом избежать двусмысленности является заключение строк в кавычки.
В приведенном выше примере вы найдете./dirКонтекст сборки в папке (по умолчанию находитDockerfile) и завершите сборку, окончательно пометив ее какcompany/webappимя иv1.1.9тег.
context
может быть содержащимDockerfileпапку или URL-адрес репозитория git.
Если указан относительный путь, путь является относительнымdocker-compose.ymlфайл. Этот путь также передается демону Docker для сборки.
docker-compose инициирует действия сборки и помечает результаты сборки (согласноimageимя), после чего используйте его по соответствующему имени.
dockerfile
Вы можете указать имя, отличное от имени по умолчаниюDockerfileДругие имена файлов используются для сборки. Обратите внимание, что вы также должны указать путь кcontext:
build:
context: .
dockerfile: Dockerfile-alternate
args
Укажите параметры сборки. Обычно относится к параметрам, используемым во время сборки (см. DockerfileARG).
Вот краткий обзор:
Сначала указываем параметры в Dockerfile:
ARG buildno
ARG gitcommithash
RUN echo "Build number: $buildno"
RUN echo "Based on commit: $gitcommithash"
Затем укажите фактическое значение параметра построения (передача карты или массива допустима):
build:
context: .
args:
buildno: 1
gitcommithash: cdc3b19
или:
build:
context: .
args:
- buildno=1
- gitcommithash=cdc3b19
NOTE: в Dockerfile, если в
FROMуказано доARG, то этоARGдля последующегоFROMЗакрытия недействительны.несколько
FROMЗатворы нескольких конструкций вырезаются соответственно.хотеть
ARGв каждомFROMОн работает в замыканиях, вам нужно указать его в каждом замыкании.существуетUnderstand how ARGS and FROM interactБолее подробное обсуждение есть в .
Вы можете не указывать параметры сборки. В этом случае фактическое значение этого параметра зависит от среды выполнения времени сборки.
args:
- buildno
- gitcommithash
NOTE: логическое значение YAML (
true,false,yes,no,on,off) должны быть заключены в кавычки, чтобы docker-compose правильно их обрабатывал.
cache_from
since v3.2
Задает список изображений, которые следует использовать для разрешения кэша.
build:
context: .
cache_from:
- alpine:latest
- corp/web_app:3.14
labels
since v3.3
Добавьте теги метаданных к построенному изображению, которое может быть массивом или словарем.
Мы рекомендуем использовать обратные денотативные префиксы DNS, чтобы ваши ярлыки не конфликтовали с ярлыками пользователей:
build:
context: .
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
# anothor example
build:
context: .
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
shm_size
since v3.5
Установить при сборке контейнера/dev/shmРазмер раздела. Целочисленный формат представлен байтами, но также можно использовать строковый формат (byte value):
build:
context: .
shm_size: '2gb'
build:
context: .
shm_size: 10000000
target
since v3.4
Определения сборки и конкретные шаги в файле Dockerfile (Stage), см.multi-stage build docs:
build:
context: .
target: prod
Многопроходные сборки обычно используются для CI/CD.
Например, шаг 0 можно назвать
builder, отвечающий за компиляцию из исходного кода в целевой файл, в то время как шаг 1 извлекает целевой файл из шага 0 для развертывания и упаковки и генерирует окончательный образ контейнера, а затем промежуточные слои на шаге 0 отбрасываются, и эти промежуточные слои не будут появляются в финальном образе В образе контейнера размер конечного образа контейнера эффективно уменьшается, и этот результат также семантически и логически непротиворечив.FROM golang:1.7.3 AS builder WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=builder /go/src/github.com/alexellis/href-counter/app . CMD ["./app"]
cap_add, cap_drop
Возможности Linux для добавления или удаления контейнеров. Полный список можно найти вman 7 capabilities.
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
NOTE: эти параметры игнорируются при развертывании стека в режиме роя.
смотрите такжеdeploying a stack in swarm mode.
Механизм возможностей Linux в значительной степени является механизмом безопасности. Конкретное значение, использование и расширение относятся к категории операционной системы Linux и здесь повторяться не будут.
cgroup_parent
При необходимости укажите предка для контейнераcgroup.cgroupЭто также одна из наиболее важных базовых концепций реализации контейнеризации Linux.
cgroup_parent: m-executor-abcd
NOTE: эти параметры игнорируются при развертывании стека в режиме роя.
смотрите такжеdeploying a stack in swarm mode.
command
Переопределить значение по умолчанию в контейнереcommand.
command: bundle exec thin -p 3000
commandТакже может быть указан в виде списка. На самом деле это более рекомендуемый способ, недвусмысленный, безопасный и соответствующий формату в [dockerfile:
command: ["bundle", "exec", "thin", "-p", "3000"]
configs
Обеспечить определенный доступ к каждой службеconfigразрешение.
ОдинconfigСодержит набор информации о конфигурации, которую можно создать различными способами. Развертывания контейнеров относятся к этим конфигурациям, чтобы лучше решать такие проблемы, как параметры рабочей среды. С другой стороны, конфиденциальная информация также может быть изолирована в безопасной зоне, что в определенной степени снижает вероятность утечки.
NOTE: указанная конфигурация должна уже существовать или быть определена на верхнем уровне.
configsбинго (defined in the top-levelconfigsconfiguration). В противном случае развертывание всего стека контейнеров завершится ошибкой.
Поддерживаются два различных формата вариантов синтаксиса. Для более подробной информации следует обратиться кconfigs.
короткая форма
Укажите только имя конфигурации. Таким образом, контейнер имеет доступ к конфигурации/<config_nameи смонтируйте его (и источник, и назначение монтирования являются именем конфигурации).
version: "3.7"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- my_config
- my_other_config
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
В приведенном выше примере используется краткая форма вredisСлужба контейнера определена вmy_configиmy_other_configцитаты. здесьmy_configуказан как хост-файл./my_config.txt,иmy_other_configобозначается как внешний (ресурс), что означает, что соответствующий ресурс уже определен в Docker, возможно, черезdocker config createСоздано или создано другими развертываниями стека контейнеров.
Если внешний ресурс не может быть найден, развертывание стека контейнеров завершится ошибкой.config not foundошибка.
Note:
configОпределения поддерживаются только в формате docker-compose v3.3 и выше.
длинный формат
Полная форма предоставляет больше информации для выраженияconfigГде, как найти, как использовать:
-
source: имя конфигурации -
target: путь, по которому конфигурация будет смонтирована в контейнере. По умолчанию/<source> -
uid&gid: Linux/Unix для числовых значенийUIDиGIDили 0, если не указано. Не поддерживается в Windows. -
mode: права доступа к файлам в восьмеричном формате. По умолчанию0444.Конфигурации недоступны для записи, поскольку они смонтированы во временной файловой системе. Поэтому, если вы установите разрешение на запись, это будет проигнорировано.
Исполняемый бит может быть установлен.
Следующий пример похож на пример краткой формы:
version: "3.7"
services:
redis:
image: redis:latest
deploy:
replicas: 1
configs:
- source: my_config
target: /redis_config
uid: '103'
gid: '103'
mode: 0440
configs:
my_config:
file: ./my_config.txt
my_other_config:
external: true
это здесь,redisСервис контейнера не доступенmy_other_config.
Вы можете разрешить службе доступ к нескольким конфигурациям, а также использовать длинные и короткие форматы.
(на верхнем уровне) определить конфигурацию (config) не означает, что служба может получить к нему доступ.
container_name
Укажите собственное имя контейнера вместо имени по умолчанию, сгенерированного самим docker-compose.
container_name: my-web-container
Поскольку имена контейнеров Docker должны быть уникальными, вы не можете масштабировать службу с помощью пользовательского имени контейнера.
NOTE: эти параметры игнорируются при развертывании стека в режиме роя.
смотрите такжеdeploying a stack in swarm mode.
credential_spec
since v3.3
Начиная с версии 3.8, поддерживается метод gMSA (групповая управляемая учетная запись службы), который используется для групповых учетных записей службы управления.
Настройте учетные данные для контролируемой учетной записи службы. Этот параметр используется только для служб контейнеров Windows.credential_spceтолько форматfile://<filename> or registry://<value-name>.
когда используешьfile:, указанный файл должен быть помещен в папку данных Docker (обычноC:\ProgramData\Docker\)изCredentialSpecв подкаталоге. Следующий пример начнется сC:\ProgramData\Docker\CredentialSpecs\my-credential-spЗагрузить учетные данные:
credential_spec:
file: my-credential-spec.json
когда используешьregistry:, учетные данные будут считаны из реестра Windows хоста демона Docker. Ключ реестра должен находиться по адресу:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs
среди.
Следующий пример читается вmy-credential-specЗначение ключа реестра:
credential_spec:
registry: my-credential-spec
Пример конфигурации gMSA
При настройке учетных данных gMSA для службы см. следующий пример:
version: "3.8"
services:
myservice:
image: myimage:latest
credential_spec:
config: my_credential_spec
configs:
my_credentials_spec:
file: ./my-credential-spec.json|
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
использовать
depends_onНесколько вещей, о которых вы должны знать:
depends_onне значит ждатьdbиredisНачните, когда будете готовыweb, но начнется после их запускаweb. Если вы хотите подождать, пока служба не будет готова, вы должны увидетьControlling startup order.- Версия 3 больше не поддерживается
conditionвыражение.depends_onПараметры игнорируются при развертывании в режиме роя.смотрите такжеdeploying a stack in swarm mode.
deploy
Version 3 only.
Укажите, разверните и запустите соответствующие конфигурации.
будет использоваться только для развертывания вdocker stack deployизswarmвлиятельный.
существуетdocker-compose upиdocker-compose runигнорируется.
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
replicas: 6
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
Доступны несколько подопций:
endpoint_mode
swarm.
Version 3.3 only.
-
endpoint_mode: vip- Docker запрашивает виртуальный IP для службы (VIP) для доступа.Docker автоматически балансирует маршрутизацию запросов между клиентом и активными рабочими узлами службы. Клиенту не нужно знать, сколько узлов доступно для службы, а также IP-адрес и номер порта узла службы.
Это способ по умолчанию.
-
endpoint_mode: dnsrr- Обнаружение службы с использованием алгоритма циклического перебора DNS (DNSRR). Docker настраивает запись DNS для службы, поэтому он возвращает список IP-адресов по имени службы при выполнении соответствующего разрешения DNS. Таким образом, клиент напрямую выбирает конкретную конечную точку для доступа.
version: "3.7"
services:
wordpress:
image: wordpress
ports:
- "8080:80"
networks:
- overlay
deploy:
mode: replicated
replicas: 2
endpoint_mode: vip
mysql:
image: mysql
volumes:
- db-data:/var/lib/mysql/data
networks:
- overlay
deploy:
mode: replicated
replicas: 2
endpoint_mode: dnsrr
volumes:
db-data:
networks:
overlay:
endpoint_modeпараметры также используются в качестве параметров командной строки режима роя (см.docker service create). Краткий список команд docker swarm см.Swarm mode CLI commands.
Чтобы узнать больше о сетевой модели режима роя и механизме обнаружения служб, см.Configure service discovery.
labels
Укажите метку для службы. Эти метки применяются только к соответствующей службе, а не к контейнеру службы или экземпляру контейнера.
version: "3.7"
services:
web:
image: web
deploy:
labels:
com.example.description: "This label will appear on the web service"
Чтобы установить метку для контейнера, вdeployкроме указанных для услугиlabels:
version: "3.7"
services:
web:
image: web
labels:
com.example.description: "This label will appear on all containers for the web service"
mode
возможноglobalилиreplicated.globalУказывает, что служба строго запущена на узле роя,replicatedУказывает, что можно запустить несколько экземпляров контейнера. По умолчаниюreplicated.
видетьswarmпо темеReplicated and global services.
version: "3.7"
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
mode: global
placement
Укажите ограничения и предпочтения.
См. документацию по созданию службы докеров, чтобы узнать больше оconstraintsи [предпочтения для информации, включая полное описание соответствующего синтаксиса, доступных типов и т. д.
version: "3.7"
services:
db:
image: postgres
deploy:
placement:
constraints:
- node.role == manager
- engine.labels.operatingsystem == ubuntu 14.04
preferences:
- spread: node.labels.zone
replicas
Если услугаreplicatedиз,replicasЗатем укажите для него значение, которое указывает максимальное количество экземпляров контейнера, которые могут работать на узле swarm.
version: "3.7"
services:
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 6
resources
Настройте ограничения ресурсов.
NOTE: для режима без роя эта запись заменяетolder resource constraint options(Такие как
cpu_shares,cpu_quota,cpuset,mem_limit,memswap_limit,mem_swappinessetc записи в версиях до версии 3).существуетUpgrading version 2.x to 3.xЕсть соответствующие описания.
Все эти записи таблицы ограничений ресурсов имеют одно значение, эквивалентноеdocker service createэквивалент в .
В следующем примереredisСлужба ограничена тем, что не может использовать более 50 МБ памяти, 50 % использования ЦП на ядро, а также сохраняет 20 МБ памяти и 25 % использования ЦП в качестве базового значения.
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
В следующих разделах описываются параметры, доступные для ограничений ресурсов службы или контейнера в сценарии роя.
Out Of Memory Exceptions (OOME)
Попытки использовать больше памяти, чем имеется в вашей службе и экземплярах контейнера, приведут к возникновению исключения нехватки памяти (OOME). На этом этапе экземпляр контейнера или демон Docker может быть очищен диспетчером OOM ядра.
Чтобы этого не произошло, убедитесь, что ваше приложение использует память законно и эффективно. О таких рисках см.Understand the risks of running out of memoryдля дальнейших инструкций по оценке.
restart_policy
Указывает, как перезапустить экземпляр контейнера после его выхода. заменятьrestart:
-
condition: возможноnone,on-failureилиany(по умолчаниюany) -
delay: сколько ждать перед попыткой перезагрузки (по умолчанию 0). должен быть назначенduration. -
max_attempts: количество попыток перезапуска после отказа от попытки перезапуска. По умолчанию не сдаваться. -
window: продолжительность ожидания, чтобы определить, была ли перезагрузка успешной. По умолчанию не ждать и сразу считается успешным. должен быть назначенduration.
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
rollback_config
Version 3.7 file format and up
Как следует выполнить откат службы в случае сбоя непрерывного обновления:
-
parallelism: Количество контейнеров, откатываемых одновременно. Если установлено значение 0, все контейнеры будут откатываться одновременно. -
delay: время ожидания перед откатом каждой группы контейнеров (по умолчанию 0). -
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: Количество контейнеров, обновляемых одновременно. Если установлено значение 0, все контейнеры будут откатываться одновременно. -
delay: сколько ждать перед обновлением каждой группы контейнеров (по умолчанию 0). -
failure_action: действие, которое должно выполняться при сбое обновления. возможноcontinueилиpause(по умолчаниюpause) -
monitor: Период, в течение которого статус неудачного обновления обновляется на мониторе (ns|us|ms|s|m|h) По умолчанию0s. -
max_failure_ratio: допустимый процент сбоев при обновлении (по умолчанию 0) -
order: Порядок операций по обновлению. возможноstop-firstилиstart-first(по умолчаниюstop-first)
NOTE:
orderДействует только в версии 3.4 и выше.
version: "3.7"
services:
vote:
image: dockersamples/examplevotingapp_vote:before
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
order: stop-first
NOT SUPPORTED FOR DOCKER STACK DEPLOY
следующие подопции (дляdocker-compose upиdocker-compose runподдерживается) находится вdocker stack deployНе поддерживается в:
- build
- cgroup_parent
- container_name
- devices
- tmpfs
- external_links
- links
- network_mode
- restart
- security_opt
- sysctls
- userns_mode
Tip: See the section on how to configure volumes for services, swarms, and docker-stack.yml files. Volumes are supported but to work with swarms and services, they must be configured as named volumes or associated with services that are constrained to nodes with access to the requisite volumes.
devices
Список устройств для сопоставления. Его использование и команда docker--deviceтакой же.
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
NOTE: эти параметры игнорируются при развертывании стека в режиме роя.
смотрите такжеdeploying a stack in swarm mode.
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
Переопределите значение точки входа по умолчанию, определенное в файле dockerfile.
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
NOTE: установить
entrypointне только превосходит любыеENTRYPOINTПо умолчанию, также очищает любой DockerfileCMDПо умолчанию. Итак, в DockerfileCMDбудет игнорироваться.
env_file
Импортировать значения переменных среды из заданного файла. Может быть одним значением или списком.
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
заdocker-compose -f FILEСказать,env_fileПуть относится кFILEв папке.
существуетenvironmentПеременные среды, объявленные в, переопределяют введенные здесь значения.
В соответствующем файле каждая строка должна использоватьVAR=VALformat определяет переменную среды. заголовок строки#Представляется строкой комментария, игнорируется как пустая строка.
# Set Rails/Rack environment
RACK_ENV=development
NOTE: если служба определена
buildэлемент, в процессе сборки,env_fileОпределенные переменные среды не видны. использовать толькоbuildподвариантыargsдля определения значений переменных среды во время сборки.
VALЗначение используется как есть и не может быть изменено. Например, если значение заключено в кавычки, то представление значения также содержит кавычки.
Также необходимо позаботиться о порядке файлов переменных среды. Значение переменной, определенное в более позднем файле переменных среды, перезапишет старое значение, определенное ранее.
environment
Добавьте переменные среды. Можно использовать либо массив, либо словарь. Любое логическое значение: true, false, yes, no и т. д. должно быть заключено в кавычки как строковый литерал.
Значение переменных среды только со значениями ключа зависит от хост-среды среды выполнения docker-compose, что полезно для предотвращения утечки конфиденциальной информации.
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
NOTE: если служба определена
buildэлемент, в процессе сборки,env_fileОпределенные переменные среды не видны. использовать толькоbuildподвариантыargsдля определения значений переменных среды во время сборки.
expose
Откройте порты для связанных служб. Эти порты не публикуются на хосте. Для экспонирования можно указать только внутренние порты.
expose:
- "3000"
- "8000"
external_links
будетdocker-compose.ymlКонтейнеры, запущенные снаружи, привязаны к данному сервису.
и устаревшие вариантыlinksимеют аналогичную семантику.
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
NOTE: эти параметры игнорируются при развертывании стека в режиме роя.
смотрите такжеdeploying a stack in swarm mode.
Более рекомендуемый подход - пройтиnetworksСоздайте подсеть для связи между контейнерами.
extra_hosts
Добавьте сопоставления имен хостов. Эти сопоставления добавляются к/etc/hostsсередина. Эта функция эквивалентна параметру командной строки--add-host.
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
healthcheck
since v2.1
Используется для подтверждения работоспособности службы. видетьHEALTHCHECK Dockerfile instruction.
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
interval, timeoutиstart_periodследует указать какdurations.
Note:
start_periodДоступно только в версии 3.4 и выше.
testДолжно быть одно строковое значение или список. Если это список, то первый элемент должен бытьNONE, CMD, CMD-SHELLодин. Если строка неявно представляетCMD-SHELLпрефикс.
# Hit the local web app
test: ["CMD", "curl", "-f", "http://localhost"]
Как в примере выше, но неявно вызывая/bin/sh, и следующие формы эквивалентны.
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
test: curl -f https://localhost || exit 1
Чтобы отключить любое направление проверки работоспособности по умолчанию, указанное в образе, используйтеdisable: true. Это и указаниеtest: ["NONE"]эквивалентны.
healthcheck:
disable: true
image
Указывает имя изображения.
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
Если изображение не существует на хосте, Compose попытается извлечь его, если вы также не укажетеbuildпункт.
init
since v3.7
Запустите процесс инициализации в контейнере и перенаправьте сигнал. Установить какtrueВключите эту функцию для службы.
version: "3.7"
services:
web:
image: alpine:latest
init: true
Процесс инициализации по умолчанию использует двоичные исполняемые файлы.Tini, при необходимости он будет установлен на хосте демона.
/usr/libexec/docker-init. Вы также можете настроить демон для использования другого двоичного файла черезinit-path, видетьconfiguration option.
isolation
Указывает уровень изоляции/технологию контейнера. В Linux поддерживает толькоdefaultценность. В Windows приемлемые значения:default, processиhyperv.
labels
Добавьте теги метаданных в контейнеры, см.Docker labels. Ему может быть задан массив или словарь.
Мы рекомендуем вам использовать обратную аннотацию DNS для определения ваших меток, что может эффективно избежать конфликтов имен меток.
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
links
Уже устаревшая функция. будут удалены в ближайшее время.
Свяжите другой сервис с этим контейнером. Вы можете указать как имя службы, так и псевдоним ссылки (SERVICE:ALIAS), вы также можете пропустить псевдонимы ссылок.
web:
links:
- db
- db:database
- redis
Служба, которая была связана, будет именем хоста (т. е. псевдонимом ссылки).ALIAS) можно посетить.
Ссылки не нужны для связи между службами. По умолчанию любая служба может обращаться к другим службам по имени службы. видетьLinks topic in Networking in Compose.
В ссылке тоже указана зависимость, но это ужеdepends_onзадача, поэтому ссылка не нужна.
logging
Указывает конфигурацию пересылки журналов для службы.
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
driverЗадается имя драйвера, которое совпадает с--log-driverэквивалентны. По умолчаниюjson-file.
driver: "json-file"
driver: "syslog"
driver: "none"
Доступные драйверы переадресации могут ссылаться наdocs.docker.com/config/cont…
использоватьoptionпараметры для указания диска, как в--log-optТуда. НапримерsyslogУкажите так:
driver: "syslog"
options:
syslog-address: "tcp://192.168.0.42:123"
Драйвер пересылки журналов по умолчанию:json-file. Для этого вы можете указать размер разреза журнала и максимальное количество сохраняемых файлов истории журнала:
version: "3.7"
services:
some-service:
image: some-service
logging:
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
network_mode
сетевая модель.
и--networkзначение такое же. но дополнительная поддержкаservice:[service name]модель.
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
NOTE: эти параметры игнорируются при развертывании стека в режиме роя.
смотрите такжеdeploying a stack in swarm mode.
NOTE:
network_mode: "host"не может иlinksсмешивание.
networks
Сеть, к которой нужно присоединиться. Целевая сеть находится вdocker-compose.ymlВверхnetworksопределяется в статье.
services:
some-service:
networks:
- some-network
- other-network
ALIASES
Указывает псевдоним (то есть имя хоста) службы в сети. Другие контейнеры в той же сети могут использовать имя службы или псевдоним службы для подключения к контейнерному экземпляру службы.
теперь, когдаaliasesЭто распространяется на всю сеть, и одна и та же служба может иметь разные псевдонимы в разных сетях.
services:
some-service:
networks:
some-network:
aliases:
- alias1
- alias3
other-network:
aliases:
- alias2
Более сложный и полный пример:
version: "3.7"
services:
web:
image: "nginx:alpine"
networks:
- new
worker:
image: "my-worker-image:latest"
networks:
- legacy
db:
image: mysql
networks:
new:
aliases:
- database
legacy:
aliases:
- mysql
networks:
new:
legacy:
IPV4_ADDRESS, IPV6_ADDRESS
Укажите статический IP-адрес.
Обратите внимание, что в соответствующей конфигурации сети верхнего уровня должны бытьipamБлок настроен с подсетью, и статический IP-адрес соответствует определению подсети.
If IPv6 addressing is desired, the
enable_ipv6option must be set, and you must use a version 2.x Compose file. IPv6 options do not currently work in swarm mode.
Пример:
version: "3.7"
services:
app:
image: nginx:alpine
networks:
app_net:
ipv4_address: 172.16.238.10
ipv6_address: 2001:3984:3989::10
networks:
app_net:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "2001:3984:3989::/64"
pid
pid: "host"
Настраивает службу на использование режима PID хоста. Это позволяет сервисному процессу внутри контейнера и на уровне хост-ОС совместно использовать адресное пространство PID. Это типичная концепция операционной системы Linux/Unix, поэтому здесь она описываться не будет. Роль такого совместного использования обеспечивает безопасную связь IPC с использованием адресного пространства PID.
ports
Откройте порт для хоста.
Note: функция экспозиции порта и
network_mode: hostне совместимы.
короткая форма
Можно указать порты хоста и контейнера (HOST:CONTAINER), чтобы завершить сопоставление, или просто укажите порт контейнера для автоматического сопоставления кактот же хост-портЭфемерный порт (начиная с 32768).
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
длинный формат
Допускаются развернутые определения:
ports:
- target: 80
published: 8080
protocol: tcp
mode: host
Смысл очевиден, поэтому я опускаю объяснение.
NOTE: Длинный формат допустим только в версии 3.2 и более поздних.
restart
noявляется политикой перезапуска по умолчанию. На этом этапе, независимо от того, как контейнер выйдет или выйдет из строя, он не будет автоматически перезапущен.
уточнитьalwaysВ любом случае контейнер будет перезапущен.
on-failureПолитику можно перезапустить, только если контейнер не может выйти.
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped
NOTE: эти параметры игнорируются при развертывании стека в режиме роя. (Ты можешь использовать
restart_policyДобивайтесь своих целей)смотрите такжеdeploying a stack in swarm mode.
secrets
Из каждой конфигурации службы предоставьте доступ к верхнему уровнюsecretsОпределенный вход. Поддерживаются как длинные, так и короткие форматы.
короткая форма
Краткая форма указывает только имя конфиденциального содержимого. Это позволяет контейнеру монтировать соответствующий контент в/run/secrets/<secret_name>местоположение и доступ к нему.
В следующем примере используется краткая форма, пустьredisв состоянии получить доступmy_secretиmy_other_secret.my_secretКонкретное содержание определяется в./my_secret.txt,my_other_secretопределяется как внешний ресурс, например, черезdocker secret createпуть предопределен. Если соответствующий внешний ресурс не может быть найден, развертывание стека завершится ошибкой и вызовет ошибку.secret not foundОшибка.
version: "3.7"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- my_secret
- my_other_secret
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
длинный формат
Полная форма позволяет более точно определить, как конфиденциальное содержимое используется в контейнере стека.
-
source: имя конфиденциального содержимого, определенного в Docker. -
target: монтируется в контейнер/run/secrets/имя файла в . Использовать, если не указаноsourceназвание. -
uid&gid: UID и GID файла, смонтированного внутри контейнера. 0, если не указано. Недействительно в Windows. -
mode: Восьмеричные разрешения для файлов, смонтированных внутри контейнера. В Docker 1.13.1 по умолчанию0000, но в более новых версиях есть0444. Смонтированный файл недоступен для записи. Бит выполнения может быть установлен, но обычно не имеет значения.
Ниже приведен пример:
version: "3.7"
services:
redis:
image: redis:latest
deploy:
replicas: 1
secrets:
- source: my_secret
target: redis_secret
uid: '103'
gid: '103'
mode: 0440
secrets:
my_secret:
file: ./my_secret.txt
my_other_secret:
external: true
Длинные и короткие форматы можно смешивать, если вы определяете несколько конфиденциальных материалов.
security_opt
Переопределяет семантику меток по умолчанию для каждого контейнера.
security_opt:
- label:user:USER
- label:role:ROLE
Обычно это связано с seccomp — длинной темой, связанной с настройкой безопасности, поэтому я не буду ее здесь подробно описывать.
NOTE: эти параметры игнорируются при развертывании стека в режиме роя. (Ты можешь использовать
restart_policyДобивайтесь своих целей)смотрите такжеdeploying a stack in swarm mode.
stop_grace_period
Укажите время ожидания, если контейнер не заблокируетсяSIGTERMсигнал (или черезstop_signalопределены другие сигналы) нормально завершает работу, а затем принудительно очищает соответствующий процесс экземпляра контейнера по истечении этого времени (черезSIGKILLСигнал).
stop_grace_period: 1s
stop_grace_period: 1m30s
По умолчанию он будет ждать 10 секунд.
stop_signal
Установите альтернативный сигнал для корректного завершения работы экземпляра контейнера. используется по умолчанию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
NOTE: эти параметры игнорируются при развертывании стека в режиме роя. (Ты можешь использовать
restart_policyДобивайтесь своих целей)смотрите такжеdeploying a stack in swarm mode.
tmpfs
since v2
Смонтируйте временную файловую систему в контейнер. Может быть одним значением или списком.
tmpfs: /run
tmpfs:
- /run
- /tmp
NOTE: эти параметры игнорируются при развертывании стека в режиме роя. (Ты можешь использовать
restart_policyДобивайтесь своих целей)смотрите такжеdeploying a stack in swarm mode.
since v3.6
Смонтируйте временную файловую систему в контейнер. Параметр Size может указывать размер файловой системы в байтах. Значение по умолчанию не ограничено.
- type: tmpfs
target: /app
tmpfs:
size: 1000
ulimits
Переопределяет значение ulimits по умолчанию, указанное внутри контейнера. Целое число может быть указано как один предельный предел, или может быть указано отображение для представления мягких/жестких предельных пределов соответственно.
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
userns_mode
userns_mode: "host"
Отключите пространства имен пользователей. Если демон Docker настроен для работы в пользовательском пространстве имен.
NOTE: эти параметры игнорируются при развертывании стека в режиме роя. (Ты можешь использовать
restart_policyДобивайтесь своих целей)смотрите такжеdeploying a stack in swarm mode.
volumes
Смонтируйте путь хоста или именованный том.
Вы можете смонтировать путь хоста к службе без необходимости находиться на верхнем уровне.volumesопределить его в.
Если вы хотите повторно использовать том для нескольких служб, он должен быть на верхнем уровне.volumesопределите его и назовите.
допустимыйservices, swarms, and stack filesИспользуйте именованные тома в .
NOTE: на вершине
volumesопределить именованный том в службеvolumesуказать его в списке.Рано
volumes_fromБольше не используется.может относиться кUse volumes and Volume Plugins.
В следующем примере показан именованный томmy_data, и используется дляwebСлужить. существуетwebтакже используйте папку хоста в./staticмонтируется в контейнер; вdbмонтирует хост-файл к соответствующему файлу в контейнере и использует другой именованный томdbdata.
version: "3.7"
services:
web:
image: nginx:alpine
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
db:
image: postgres:latest
volumes:
- "/var/run/postgres/postgres.sock:/var/run/postgres/postgres.sock"
- "dbdata:/var/lib/postgresql/data"
volumes:
mydata:
dbdata:
короткая форма
можно использоватьHOST:CONTAINERформате или с режимом доступаHOST:CONTAINER:ro.
Относительный путь в хосте может быть смонтирован.
volumes:
# Just specify a path and let the Engine create a volume
- /var/lib/mysql
# Specify an absolute path mapping
- /opt/data:/var/lib/mysql
# Path on the host, relative to the Compose file
- ./cache:/tmp/cache
# User-relative path
- ~/configs:/etc/configs/:ro
# Named volume
- datavolume:/var/lib/mysql
длинный формат
Длинные формы обеспечивают более точный контроль.
-
type: тип крепления естьvolume,bind,tmpfsиnpipe -
source: Исходное местоположение монтирования. Может быть путем к хосту, именем тома, определенным в томах верхнего уровня и т. д. Если он установленtmpfsто этот параметр не имеет смысла. -
target: путь точки монтирования внутри контейнера. -
read_only: логическое значение для установки возможности записи тома. -
bind: настройка дополнительных параметров привязки.-
propagation: Режим распространения для привязки.
-
-
volume: настроить дополнительные параметры громкости-
nocopy: логическое значение для отключения копирования данных (по умолчанию при первом создании тома содержимое контейнера будет скопировано на том)
-
-
tmpfs: настроить дополнительные параметры tmpfs-
size: емкость tmpfs в байтах.
-
-
consistency: Требования к согласованности при монтаже:consistentХост и контейнер имеют одинаковый вид,cachedОперации чтения буферизуются, представление хоста является субъектом,delegatedОперации чтения и записи буферизуются, а представление контейнера является основным телом.
version: "3.7"
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- type: volume
source: mydata
target: /data
volume:
nocopy: true
- type: bind
source: ./static
target: /opt/app/static
networks:
webnet:
volumes:
mydata:
Длинный формат доступен после версии 3.2.
VOLUMES FOR SERVICES, SWARMS, AND STACK FILES
при работе с сервисами, роями илиdocker-stack.ymlВ этом сценарии следует отметить, что служба может быть развернута на любом узле в рое, и всякий раз, когда служба перезапускается после обновления, она может больше не находиться на исходном узле.
Если том с указанным именем не существует, Docker автоматически создаст анонимный том для указанной службы. Анонимные тома не являются постоянными, поэтому они также уничтожаются при выходе и удалении связанного экземпляра контейнера.
Если вы хотите сохранить свои данные, используйте именованные тома и выберите соответствующий драйвер тома, который должен быть межхостовым, чтобы данные могли перемещаться между разными хостами. В противном случае вам следует установить ограничения для службы, чтобы служба развертывалась только на определенных узлах, где соответствующая служба объема работает правильно.
Например,votingapp sample in Docker Labsизdocker-stack.ymlфайл определяетdbсервис, работающий с postgresql. он использует именованный томdb-dataЧтобы сохранить данные базы данных, swarm ограничивает этот том запуском только наmanagerНа этом узле так вообще проблем нет. Вот исходный код:
version: "3.7"
services:
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
CACHING OPTIONS FOR VOLUME MOUNTS (DOCKER DESKTOP FOR MAC)
В Docker 17.04 CE Edge и более поздних версиях (и даже в версиях 17.06CE Edge и Stable) вы можете настроить параметры ограничения согласованности для того, как тома синхронизируются между контейнером и хостом. Эти признаки включают в себя:
-
consistentТочно. Хост и контейнер имеют одинаковое представление, которое является политикой по умолчанию. -
cachedГлавный компьютер имеет преимущественную силу. Операции чтения тома буферизуются, представление хоста является субъектом, -
delegatedКонтейнер имеет преимущественную силу. Операции чтения и записи в том буферизуются, а представление контейнера является телом.
Это специально адаптировано для Docker Desktop для Mac. из-за уже известногоosxfxЧто касается причин использования функции общего доступа к файлам, разумная установка флага согласованности может улучшить проблемы с производительностью при доступе к смонтированным томам внутри и снаружи контейнера.
Ниже приведенcachedПримеры томов:
version: "3.7"
services:
php:
image: php:7.1-fpm
ports:
- "9000"
volumes:
- .:/var/www/project:cached
В случае, когда операции чтения и записи буферизуются, даже если что-то изменяется в контейнере (для типичной архитектуры, такой как веб-сайт PHP, часто пишется ./config.php), это не будет немедленно отражено в приемнике. От хоста записи в контейнер будут нагромождены.
Следует учитывать согласованность объемов внутри и снаружи контейнера.Performance tuning for volume mounts (shared filesystems).
Я не могу перевести его в том виде, в каком он здесь, потому что это привело бы к длинной странице, а я не смог организовать язык по этому вопросу.
domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir
Эти конфигурации имеют одно значение. иdocker runсоответствует соответствующему параметру командной строки .mac_addressУже заброшенная установка.
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
privileged: true
read_only: true
shm_size: 64M
stdin_open: true
tty: true
указанная продолжительность периода времени
Существуют такие параметры конфигурации, какintervalилиtimeout(обаchecksuboptions), принимает строковый период времени или значение параметра периода времени. Они должны иметь такой формат:
2.5s
10s
1m30s
2h32m
5h34m56s
Единицы суффикса, которые могут быть добавлены к значениям:us, ms, s, m, а такжеh.
Не требует пояснений.
указать значение байта
Существуют такие параметры конфигурации, какbuildподвариантыshm_size, который принимает значение параметра размера емкости, разделенное строками. Они должны иметь такой формат:
2b
1024kb
2048k
300m
1gb
Допустимые единицы суффикса включаютb, k, mиg. также,kb, mbиgbтакже является законным. Чистые десятичные значения недопустимы.
Руководство по форматированию тома -volumes
Раздел томов верхнего уровня может объявлять и создавать именованные тома (без использованияvolume_from), эти тома можно использовать вvolumesуказано в подразделе. Таким образом, мы можем повторно использовать их даже в нескольких службах. команда докераdocker volumeПодкоманды содержат больше справочной информации.
Относительно использования томов вы также можете обратиться кUse volumesиVolume Plugins.
Вот пример с двумя службами, папка хранения данных базы данных является общей для двух служб, поэтому база данных может использовать эту папку хранения, а служба резервного копирования также может использовать ее для выполнения задачи резервного копирования:
version: "3.7"
services:
db:
image: db
volumes:
- data-volume:/var/lib/db
backup:
image: backup-service
volumes:
- data-volume:/var/lib/backup/data
volumes:
data-volume:
верхняяvolumesЗапись под разделом может быть пустой без указания деталей, в этом случае будет применяться драйвер тома по умолчанию (обычно этоlocalобъемный диск).
Но вы также можете настроить его со следующими параметрами:
driver
Указывает, какой драйвер тома будет использоваться. Как правило, значение по умолчанию будетlocal. Если драйвер тома недействителен или не работает, наdocker-compose upDocker Engine вернет ошибку.
driver: foobar
driver_opts
При необходимости укажите набор параметров пары ключ-значение, которые будут переданы драйверу тома. Таким образом, эти наборы параметров относятся к драйверу тома, см. соответствующую документацию по драйверу тома.
volumes:
example:
driver_opts:
type: "nfs"
o: "addr=10.40.0.199,nolock,soft,rw"
device: ":/docker/example"
external
Если установленоtrue, что указывает на то, что соответствующий том был создан вне файла оркестровки компоновки. В настоящее времяdocker-compse upНе будет предпринято никаких попыток создать том, и будет возвращена ошибка, если том еще не существует.
Для v3.3 и более ранних версий формата compose:externalнельзя использовать в сочетании с другими параметрами конфигурации тома, такими какdriver, driver_opts, labelsи Т. Д. Но для версии 3.4 и выше этого ограничения больше нет.
В следующем примере Compose ищет файл с именемdataвнешний том и смонтировать его наdbсервис, вместо того, чтобы пытаться создать файл с именем[projectname]_dataновый объем.
version: "3.7"
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
external: true
external.nameУстарело в v3.4+, используйте его сразу после этогоname.
Вы также можете указать только имя тома (в этом случаеdataСчитается псевдонимом тома, когда на том есть ссылка в текущем файле оркестровки):
volumes:
data:
external:
name: actual-name-of-volume
External volumes are always created with docker stack deploy
в настоящее время используетdocker stack deployПри развертывании в рой внешние тома всегда создаются автоматически, если они не существуют. Для получения дополнительной информации см.moby/moby#29976,
labels
использоватьDocker labelsДобавьте метаданные в контейнер. Может быть в формате массива или в формате словаря.
Мы рекомендуем вам использовать обратную DNS-нотацию для префикса ключей таблицы метаданных с обратным именем домена, чтобы избежать потенциальных конфликтов с ключами таблицы с тем же именем в других приложениях:
labels:
com.example.description: "Database volume"
com.example.department: "IT/Ops"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Database volume"
- "com.example.department=IT/Ops"
- "com.example.label-with-empty-value"
name
since v3.4+
Укажите пользовательское имя для тома. Значение имени можно использовать для разрешения томов с именами со специальными символами. Обратите внимание, что это значение используется как есть, кавычки не игнорируются, а имена стеков не имеют префикса.
version: "3.7"
volumes:
data:
name: my-app-data
nameможно использовать сexternalКомбинация:
version: "3.7"
volumes:
data:
external: true
name: my-app-data
Руководство по веб-форматированию -networks
верхняя главаnetworksПозволяет настроить сеть (создать интрасеть), которую вы хотите создать и использовать.
- Полные инструкции по использованию функций сетевой среды Docker в Compose, а также всех параметров сетевого драйвера см.Networking guide.
- заDocker Labsи примеры использования учебных пособий, связанных с сетью, пожалуйста, внимательно прочитайтеDesigning Scalable, Portable Docker Container Networks.
driver
Указывает драйвер для этой сети.
Драйвер по умолчанию определяется параметрами запуска Docker Engine. Как правило, параметры запуска встроены для использования на хостах с одним узлом.bridgeводить, покаswarm modeиспользуется вoverlayводить машину.
Docker Engine вернет ошибку, если драйвер недоступен.
driver: overlay
bridge
По умолчанию Docker используется на каждом хост-узле.bridgeводить машину. Чтобы узнать, как работает мостовая сеть, см.Docker LabsВарианты использования сетевого коучинга:Bridge networking.
overlay
overlayводить в несколькихswarm modeМежду узлами устанавливается именованная подсеть, которая представляет собой виртуальную сеть между узлами.
- существует
swarm modeкак построитьoverlayсети и используйте это, чтобы служба работала правильно на разных хостах, см.Docker LabsВарианты использования сетевого коучинга:Overlay networking and service discovery. - Если вы хотите исследовать
overlayКак завершить построение виртуальной сети и поток пакетов между хостами, вы можете обратиться кOverlay Driver Network Architecture.
host or none
Используйте сетевой стек хоста или не используйте сеть.
и аргументы командной строки--net=hostа также--net=noneэквивалентны.
Эти две модели драйвера и сети можно использовать только дляdocker stackсреди. если вы используетеdocker composeДля соответствующих инструкций, пожалуйста, используйтеnetwork_modeуказать их.
If you want to use a particular network on a common build, use [network] as mentioned in the second yaml file example.
Используйте встроенные сетевые модели, такие какhostиnone, есть небольшой синтаксис, на который стоит обратить внимание: если вы используетеhostилиnoneТакие имена определяют внешнюю сеть (обратите внимание, что вам на самом деле не нужно их создавать, оба являются частью встроенной сетевой модели Docker), затем при ссылке на них в файле оркестрации Compose вам нужно использоватьhostnetилиnonet, нравится:
version: "3.7"
services:
web:
networks:
hostnet: {}
networks:
hostnet:
external: true
name: host
---
services:
web:
...
build:
...
network: host
context: .
...
services:
web:
...
networks:
nonet: {}
networks:
nonet:
external: true
name: none
driver_opts
Задает набор параметров, представленных набором пар ключ-значение, которые необходимо передать сетевому драйверу. Они тесно связаны с драйвером, поэтому конкретные доступные параметры должны быть указаны в соответствующей документации драйвера.
driver_opts:
foo: "bar"
baz: 1
attachable
since v3.2+
можно использовать только дляdriver: overlayместо действия.
если установленоtrue, автономные контейнеры также могут быть подключены к сети. Если автономные экземпляры контейнера подключены к оверлейной сети, службы в контейнере могут взаимодействовать с отдельными экземплярами контейнера. Обратите внимание, что к этой оверлейной сети можно даже подключать экземпляры контейнеров из других демонов Docker.
networks:
mynet1:
driver: overlay
attachable: true
enable_ipv6
Включите IPv6 в этой сети/подсети.
Не поддерживается в v3+.
enable_ipv6Требует использования формата оркестровки v2 и не может использоваться в режиме роя.
ipam
Настройте конфигурацию IPAM. Каждая подконфигурация является необязательным параметром.
-
driver: собственный драйвер IPAM вместо стандартного -
config: список, содержащий один или несколько блоков конфигурации. Каждый блок конфигурации имеет следующие подпараметры:-
subnet: определение подсети в формате CIDR для определения сегмента сети.
-
Полный пример:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
NOTE: добавить IPAM как
gatewayДоступно только в v2.
internal
По умолчанию Docker также подключается к сети с мостом для обеспечения внешнего подключения. Если вы хотите создать внешнюю изолированную оверлейную сеть, установите для этого параметра значениеtrue.
labels
использоватьDocker labelsДобавьте метаданные в контейнер. Может быть в формате массива или в формате словаря.
Мы рекомендуем вам использовать обратную DNS-нотацию для префикса ключей таблицы метаданных с обратным именем домена, чтобы избежать потенциальных конфликтов с ключами таблицы с тем же именем в других приложениях:
labels:
com.example.description: "Financial transaction network"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Financial transaction network"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
external
Если установленоtrue, сеть создается и управляется вне файла оркестровки Compose. В настоящее времяdockercompose upНе пытается ее создать и возвращает ошибку, если сеть не существует.
Для v3.3 и более ранних форматовexternalне соdriver, driver_opts, ipam, internalИ так далее. Это ограничение было снято после версии 3.4+.
В следующем примереproxyэто ворота во внешний мир, через которые Compose будет искатьdocker network create outsideучредилoutsideвнешней сети, а не пытаться автоматически создать сеть с именем[projectname]_outsideНовая сеть:
version: "3.7"
services:
proxy:
build: ./proxy
networks:
- outside
- default
app:
build: ./app
networks:
- default
networks:
outside:
external: true
external.nameУстарело в v3.5 и более поздних версиях, используйте вместо этогоname.
Вы также можете указать отдельное сетевое имя, на которое будет ссылаться файл компоновки Compose.
name
since v3.5
Задайте собственное имя для сети. Значение имени можно использовать для разрешения томов с именами со специальными символами. Обратите внимание, что это значение используется как есть, кавычки не игнорируются, а имена стеков не имеют префикса.
version: "3.7"
networks:
network1:
name: my-app-net
nameС участиемexternalИспользуйте вместе:
version: "3.7"
networks:
network1:
external: true
name: my-app-net
Руководство по форматированию элементов конфигурации -configs
ВверхconfigsОбъявления разделов определяют элемент конфигурации или его ссылку, которая может быть авторизована для использования службами в стеке. Источник элемента конфигурации может бытьfileилиexternal.
-
file: содержимое элемента конфигурации находится в хост-файле. -
external: если установленоtrue, указывая на то, что элемент конфигурации создан. Docker не будет пытаться создать его, а вместо этого сгенерирует его, если он не существует.config not foundОшибка. -
name: имя элемента конфигурации в Docker. Значение имени можно использовать для разрешения томов с именами со специальными символами. Обратите внимание, что это значение используется как есть, кавычки не игнорируются, а имена стеков не имеют префикса.
В следующем примере при развертывании как части стекаmy_first_configавтоматически создается и называется<stack_name>_my_first_config, что касаетсяmy_second_configуже есть.
configs:
my_first_config:
file: ./config_data
my_second_config:
external: true
Другое изменение заключается в том, что элемент внешней конфигурации имеетnameОпределено, этот элемент конфигурации можно использовать в Composeredis_configДля справки и использования имен:
configs:
my_first_config:
file: ./config_data
my_second_config:
external:
name: redis_config
Вам все еще нужно объявить каждую службу в стекеconfigsглаву, чтобы получить доступ к элементам конфигурации, см.grant access to the config.
Руководство по форматированию элемента конфиденциальной информации -secrets
ВверхsecretsОператор раздела определяет элемент конфиденциальной информации или его ссылку, которая может быть авторизована для использования службами в стеке. Источником элемента конфиденциальной информации может бытьfileилиexternal.
-
file: содержимое элемента конфиденциальной информации находится в хост-файле. -
external: если установленоtrue, указывающий, что элемент конфиденциальной информации создан. Docker не будет пытаться создать его, а вместо этого сгенерирует его, если он не существует.secret not foundОшибка. -
name: имя элемента конфиденциальной информации в Docker. Значение имени можно использовать для разрешения томов с именами со специальными символами. Обратите внимание, что это значение используется как есть, кавычки не игнорируются, а имена стеков не имеют префикса.
В следующем примере при развертывании как части стекаmy_first_secretавтоматически создается и называется<stack_name>_my_first_secret, что касаетсяmy_second_secretуже есть.
secrets:
my_first_secret:
file: ./secret_data
my_second_secret:
external: true
Другое изменение заключается в том, что элемент внешней конфигурации имеетnameОпределено, этот элемент конфигурации можно использовать в Composeredis_secretУпоминание и использование имени.
Создать файл v3.5 и выше
secrets:
my_first_secret:
file: ./secret_data
my_second_secret:
external: true
name: redis_secret
Создать файл v3.4 и более ранние версии
my_second_secret:
external:
name: redis_secret
Вам все еще нужно объявить каждую службу в стекеsecretраздел, чтобы получить доступ к элементам конфиденциальной информации, см.grant access to the secret.
замена переменной
Переменные среды можно использовать в файлах оркестровки Compose. когдаdocker-composeВо время выполнения Compose извлекает значения переменных из переменных среды оболочки. Например, предположим, что переменные среды операционной системы содержатPOSTGRES_VERSION=9.3определение, то следующее определение
db:
image: "postgres:${POSTGRES_VERSION}"
Эквивалентно
db:
image: "postgres:9.3"
Если переменная среды не существует или представляет собой пустую строку, она обрабатывается как пустая строка.
ты можешь пройти.envфайл для установки значений по умолчанию для переменных окружения. Compose будет автоматически искать файлы в текущей папке.envфайл, чтобы получить значение переменной среды.
IMPORTANT: Уведомление
.envфайл только вdocker-compose upдействителен в сцене, в то время как вdocker stack deployон не будет использоваться.
два синтаксиса$VARIABLEи${VARIABLE}доступны. Также в формате v2.1 также могут использоваться следующие формы, похожие на синтаксис оболочки:
-
${VARIABLE:-default}вернусьdefault, если переменная окруженияVARIABLEПустая строка или не задана. -
${VARIABLE-default}вернусьdefault, если переменная окруженияVARIABLEЕсли не установлено.
Точно так же следующий синтаксис помогает указать явное значение:
-
${VARIABLE:?err}выдаст сообщение об ошибкеerr, если переменная окруженияVARIABLEЕсли пусто или не задано. -
${VARIABLE?err}выдаст сообщение об ошибкеerr, если переменная окруженияVARIABLEЕсли не установлено.
Другие функции синтаксиса оболочки не поддерживаются, например${VARIABLE/foo/bar}.
Если требуется знак доллара, используйте?. В настоящее время?Больше не участвует в интерпретации подстановки переменных среды. Например:
web:
build: .
command: "?VAR_NOT_INTERPOLATED_BY_COMPOSE"
Если вы забудете это правило и воспользуетесь$Для одного символа Compose предупредит вас:
The VAR_NOT_INTERPOLATED_BY_COMPOSE is not set. Substituting an empty string.
нет
since v3.4
Расширяя поля, можно повторно использовать фрагменты конфигурации оркестровки. Они могут быть в произвольной форме, если вы определяете их на верхнем уровне документа yaml с именами разделов, начинающимися сx-начало:
version: '3.4'
x-custom:
items:
- a
- b
options:
max-size: '12m'
name: "custom"
NOTE
Начиная с версии 3.7 (для серии 3.x) или начиная с версии 2.4 (для серии 2.x), поля расширения также можно размещать в разделах верхнего уровня Службы, Тома, Сети, Элементы конфигурации и Конфиденциальные информационные элементы первого уровня.
Нравится:
version: '3.7' services: redis: # ... x-custom: items: - a - b options: max-size: '12m' name: "custom"
Под свободной формой мы подразумеваем, что эти определения не интерпретируются Compose. Однако когда вы куда-то вставляете ссылки на них, они расширяются до точки вставки, а затем интерпретируются Compose в контексте. Это используетYAML anchorsграмматика.
Например, если несколько ваших служб будут использовать одни и те же параметры ведения журнала:
logging:
options:
max-size: '12m'
max-file: '5'
driver: json-file
Вы можете определить это следующим образом:
x-logging:
&default-logging
options:
max-size: '12m'
max-file: '5'
driver: json-file
services:
web:
image: myapp/web:latest
logging: *default-logging
db:
image: mysql:latest
logging: *default-logging
пройти черезYAML merge typeсинтаксис, вы также можете переопределить некоторые подпараметры при вставке определений полей расширения. Например:
version: '3.4'
x-volumes:
&default-volume
driver: foobar-storage
services:
web:
image: myapp/web:latest
volumes: ["vol1", "vol2", "vol3"]
volumes:
vol1: *default-volume
vol2:
<< : *default-volume
name: volume02
vol3:
<< : *default-volume
driver: default
name: volume-local
Справочник по составлению документации
- User guide
- Installing Compose
- Compose file versions and upgrading
- Get started with Docker
- Samples
- Command line reference
Заканчивать
- оригинал:docs.docker.com/compose/com….
- Перевод:GitHub.com/andnature/doc….