источник
Что касается установки 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-levelconfigs
configuration). В противном случае развертывание всего стека контейнеров завершится ошибкой.
Поддерживаются два различных формата вариантов синтаксиса. Для более подробной информации следует обратиться к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_swappiness
etc записи в версиях до версии 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=VAL
format определяет переменную среды. заголовок строки#
Представляется строкой комментария, игнорируется как пустая строка.
# 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_ipv6
option 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
(обаcheck
suboptions), принимает строковый период времени или значение параметра периода времени. Они должны иметь такой формат:
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 up
Docker 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….