Source: Docker compose file reference
← Renderedmarkdown source:
---
description: Compose file version 3 reference
tags: docker
title: Docker compose file reference
---
[Compose file version 3 reference](https://docs.docker.com/compose/compose-file/compose-file-v3/#long-syntax-3)
example
```yaml
version: "3.9"
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:
max_replicas_per_node: 1
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:
```
## Структура
Часть параметров можно записывать с полным синтаксисом, часть - в виде сокращенного.
- [build](https://docs.docker.com/compose/compose-file/compose-file-v3/#build) Параметры конфигурации, которые применяются во время сборки.
- `context` - либо путь к каталогу, содержащему Dockerfile, либо URL-адрес репозитория git
- `dockerfile` - альтернативный докерфайл
- `args` - аргументы сборки, которые являются переменными среды, доступными только во время процесса сборки
- `cache_from` - список имеджей, которые движок использует для разрешения кеша
- labels - метадата в виде [docker labels](https://docs.docker.com/config/labels-custom-metadata/)
- `network` - сетевые контейнеры, к которым подключаются инструкции RUN во время сборки
- `shm_size` - размер раздела /dev/shm для контейнеров этой сборки
- `target` - создает этап для [многоэтапной сборки](https://docs.docker.com/develop/develop-images/multistage-build/)
- `cap_add`, `cap_drop` - опции контейнера (игнорируется в [[docker-swarm]] моде)
- `cgroup_parent` контрольная группа контейнеров (игнорируется в сварм-моде)
- [command](https://docs.docker.com/compose/compose-file/compose-file-v3/#command) можно переопределить команду по умолчанию
```yaml
command: bundle exec thin -p 3000
```
- [configs](https://docs.docker.com/compose/compose-file/compose-file-v3/#configs). Доступ к конфигурациям для каждой службы с помощью конфигурации для каждой службы. Оба варианта синтаксиса
configs configuration reference
- [container_name](https://docs.docker.com/compose/compose-file/compose-file-v3/#container_name). Можно задать уникальное имя контейнера вместо автосгенеренного. игнорируется в сворме.
- [credential_spec](https://docs.docker.com/compose/compose-file/compose-file-v3/#credential_spec). Спецификация учетных данных для управляемой учетной записи службы. Этот параметр используется только для служб, использующих контейнеры Windows
- [depends_on](https://docs.docker.com/compose/compose-file/compose-file-v3/#depends_on) - зависимость от другого контейнера. Контейнеры поднимутся в порядке установленных зависимостей.
> - `docker-compose up` starts services in dependency order.
> - `docker-compose up SERVICE` automatically includes SERVICE’s dependencies.
> - `docker-compose stop` stops services in dependency order.
Установление зависимостей не ожидает готовности чего либо внутри контейнера. Опция игнорируется в сорм-моде.
- [deploy](https://docs.docker.com/compose/compose-file/compose-file-v3/#deploy) - конфигурация, связанная с развертыванием и запуском служб. Подпараметры вступают в силу только при развертывании в swarm через [docker stack deploy](https://docs.docker.com/engine/reference/commandline/stack_deploy/) и игнорируются при запуске `docker-compose up` и `docker-compose`, за исключением `resources`
- `endpoint_mode` метод обнаружения службы для внешних клиентов, подключающихся к swarm
- `labels` эти метки устанавливаются только для службы, а не для каких-либо контейнеров службы
- `mode` тип контейнера в сворме
- `placement` размещение ограничений и предпочтений
- `max_replicas_per_node`
- `replicas` количество контейнеров, которые должны быть запущены в любой момент времени
- `resources` - квоты ресрусов (ЦПУ, память)
- `restart_policy` как перезапускать контейнеры при выходе. Заменяет `restsrt`
- `rollback_config` как следует выполнить откат службы в случае неудачного обновления
- `update_config` как сервис должен быть обновлен. Полезно для настройки последовательных обновлений
> Не поддерживается:
>
> - build
> - cgroup_parent
> - container_name
> - devices
> - tmpfs
> - external_links
> - links
> - network_mode
> - restart
> - security_opt
> - userns_mode
- [devices](https://docs.docker.com/compose/compose-file/compose-file-v3/#devices). Список сопоставлений устройств. Использует тот же формат, что и параметр создания клиента `docker --device`.
- [dns](https://docs.docker.com/compose/compose-file/compose-file-v3/#dns). Пользовательские DNS-серверы
- [dns_search](https://docs.docker.com/compose/compose-file/compose-file-v3/#dns_search). Пользовательские домены DNS
- [entrypoint](https://docs.docker.com/compose/compose-file/compose-file-v3/#entrypoint). Переопределяет точку входа по умолчанию (если в Dockerfile есть инструкция CMD, она тоже игнорируется).
```yaml
entrypoint: /code/entrypoint.sh
```
- [env_file](https://docs.docker.com/compose/compose-file/compose-file-v3/#env_file). Переменные окружения из файла. Переменные среды, объявленные в `environment`, переопределяют эти значения — это остается истинным, даже если эти значения пусты или не определены. Порядок задания списка файлов имеет значение - файлы в списке обрабатываются сверху вниз
```yaml
env_file:
- ./common.env
- ./apps/web.env
- /opt/runtime_opts.env
```
Если в службе указан `build`, переменные, определенные в `.env`, автоматически не отображаются во время сборки. Используйте подпараметр `args` в `build`, чтобы определить переменные среды времени сборки.
- [environment](https://docs.docker.com/compose/compose-file/compose-file-v3/#environment). Переменные среды. Вы можете использовать либо массив, либо словарь. Любые логические значения (true, false, yes, no) должны быть заключены в кавычки
так:
```yaml
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
```
или так:
```yaml
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
```
Аналогично - эти переменные не видны автоматически в `build` - нужно задать `args`
- [expose](https://docs.docker.com/compose/compose-file/compose-file-v3/#expose). Указание портов, не публикуя их на хост-машине — они будут доступны только связанным службам. Можно указать только внутренний порт
```yaml
expose:
- "3000"
- "8000"
```
- [external_links](https://docs.docker.com/compose/compose-file/compose-file-v3/#external_links). Ссылка на контейнеры, запущенные за пределами этого docker-compose.yml или даже за пределами Compose, особенно для контейнеров, которые предоставляют общие службы. Контейнеры, созданные извне, должны быть подключены по крайней мере к одной из тех же сетей, что и служба, которая на них ссылается. Игнорируется в сворме.
- [extra_hosts](https://docs.docker.com/compose/compose-file/compose-file-v3/#extra_hosts). Сопоставления имен хостов. Используйте те же значения, что и в параметре клиента `docker --add-host`
- [healthcheck](https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck). Настройка проверки, которая запускается, чтобы определить, являются ли контейнеры для этой службы «работоспособными»
```yaml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
```
- [image](https://docs.docker.com/compose/compose-file/compose-file-v3/#image). Jбраз, с которого будет запускаться контейнер. Может быть либо репозиторием/тегом, либо ID образа
- [init](https://docs.docker.com/compose/compose-file/compose-file-v3/#init). Запускает init внутри контейнера для передачи сигналов и запуска процессов.
- [isolation](https://docs.docker.com/compose/compose-file/compose-file-v3/#isolation). Технология изоляции контейнера. В Linux поддерживается только значение по умолчанию. В Windows допустимыми значениями являются значения default, process и hyperv
- [labels](https://docs.docker.com/compose/compose-file/compose-file-v3/#labels-2)
- [links](https://docs.docker.com/compose/compose-file/compose-file-v3/#links). Ссылка на контейнеры в другом сервисе. Легаси. Использовать `external_links`. Игнорируется в сворм-моде.
- [logging](https://docs.docker.com/compose/compose-file/compose-file-v3/#logging). Конфигурации логгирования внутри контейнера
- [network_mode](https://docs.docker.com/compose/compose-file/compose-file-v3/#network_mode). Сетевой режим. Используйте те же значения, что и параметр `docker client --network`, а также специальную форму `service:[service name]`. Игнорируется свормом.
- [networks](https://docs.docker.com/compose/compose-file/compose-file-v3/#networks). Сети, к которым нужно присоединиться, ссылаясь на [записи под ключом сети верхнего уровня](https://docs.docker.com/compose/compose-file/compose-file-v3/#network-configuration-reference).
```yaml
services:
some-service:
networks:
- some-network
- other-network
```
[Конфигурация для network](https://docs.docker.com/compose/compose-file/compose-file-v3/#network-configuration-reference)
[Руководство по сетиям в compose](https://docs.docker.com/compose/networking/)
- `aliases`. Псевдонимы (альтернативные имена хостов) для этой службы в сети. Другие контейнеры в той же сети могут использовать либо имя службы, либо этот псевдоним для подключения к одному из контейнеров службы.
- `ipv4_address`, `ipv6_address` Статический IP-адрес для контейнеров для этой службы при подключении к сети
- [pid](https://docs.docker.com/compose/compose-file/compose-file-v3/#pid). Устанавливает режим PID в режим PID хоста. Это включает совместное использование контейнером и операционной системой хоста адресного пространства PID.
- [ports](https://docs.docker.com/compose/compose-file/compose-file-v3/#ports). Открывает порты. Поддерживает короткий и длинный синтаксис. Можно задавать диапазоны.
Короткий:
- Укажите оба порта (`HOST:CONTAINER`)
- Укажите только порт контейнера (в качестве порта хоста выбирается эфемерный порт хоста).
- Укажите IP-адрес узла для привязки к обоим портам (по умолчанию `0.0.0.0`, что означает все интерфейсы): (`IPADDR:HOSTPORT:CONTAINERPORT`). Если `HOSTPORT` пуст (например, `127.0.0.1::80`), для привязки на хосте выбирается эфемерный порт.
```yaml
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"
- "127.0.0.1::5000"
- "6060:6060/udp"
- "12400-12500:1240"
```
Длинный:
- `target`: порт внутри контейнера
- `published`: общедоступный порт
- `protocol`: протокол порта (tcp или udp)
- `mode`: хост для публикации порта хоста на каждом узле или вход для порта в режиме сворма для балансировки нагрузки.
```yaml
ports:
- target: 80
published: 8080
protocol: tcp
mode: host
```
- [profiles](https://docs.docker.com/compose/compose-file/compose-file-v3/#profiles). определяет список именованных профилей для включения службы. Если не установлено, служба всегда включена. [Подробнее](https://docs.docker.com/compose/profiles/)
```yaml
profiles: ["frontend", "debug"]
profiles:
- frontend
- debug
```
- [restart](https://docs.docker.com/compose/compose-file/compose-file-v3/#restart). Политика перезапуска. `no` — это политика перезапуска по умолчанию, и она не перезапускает контейнер ни при каких обстоятельствах. Если указано `always`, контейнер всегда перезапускается. Политика `on-failure` перезапускает контейнер, если код выхода указывает на ошибку при отказе. `unless-stopped` всегда перезапускает контейнер, за исключением случаев, когда контейнер остановлен (вручную или иным образом). Игнорируется в сворме.
- [secrets](https://docs.docker.com/compose/compose-file/compose-file-v3/#secrets). Доступ к шифрованным переменным для каждой службы с помощью конфигурации секретов для каждой службы. Поддерживаются оба синтаксиса. [Подробнее](https://docs.docker.com/engine/swarm/secrets/)
С точки зрения сервисов Docker Swarm секрет — это блок данных, например пароль, закрытый ключ SSH, сертификат SSL или другой фрагмент данных, который не следует передавать по сети или хранить в незашифрованном виде в dockerfile или в папке вашего приложения. Вы можете использовать секреты Docker для централизованного управления этими данными и безопасной передачи их только тем контейнерам, которым необходим доступ к ним. Секреты шифруются во время передачи и далее в докерсварм. Данный секрет доступен только тем службам, которым был предоставлен явный доступ к нему, и только во время выполнения этих служебных задач.
Короткий. Указывается только секретное имя. Это предоставляет контейнеру доступ к секрету и монтирует его в /run/secrets/<secret_name> внутри контейнера. И исходное имя, и целевая точка монтирования установлены на секретное имя.
```yaml
version: "3.9"
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`: идентификатор секрета, как он определен в этой конфигурации.
- `target`: имя файла, который будет смонтирован в /run/secrets/ в контейнерах задач службы. По умолчанию используется источник, если он не указан.
- `uid` и `gid`: числовой UID или GID, которому принадлежит файл в /run/secrets/ в контейнерах задач службы. Оба значения по умолчанию равны 0, если не указано иное.
- `mode` разрешения для файла, который будет смонтирован в /run/secrets/ в контейнерах задач службы, в восьмеричном представлении.
```yaml
version: "3.9"
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
```
Еще пример
```yaml
version: '3'
secrets:
db_user:
external: true
db_password:
external: true
services:
postgres_db:
image: postgres
secrets:
- db_user
- db_password
environment:
- POSTGRES_USER_FILE=/run/secrets/db_user
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
```
[Конфигурация secrets](https://docs.docker.com/compose/compose-file/compose-file-v3/#secrets-configuration-reference)
- [security_opt](https://docs.docker.com/compose/compose-file/compose-file-v3/#security_opt). Схема маркировки по умолчанию для каждого контейнера. Игнорируется в сворме.
- [stop_grace_period](https://docs.docker.com/compose/compose-file/compose-file-v3/#stop_grace_period). Как долго ждать при попытке остановить контейнер, если он не обрабатывает SIGTERM (или любой другой сигнал остановки, указанный с помощью stop_signal), перед отправкой SIGKILL.
- [stop_signal](https://docs.docker.com/compose/compose-file/compose-file-v3/#stop_signal). Устанавливает пользовательский сигнал для остановки контейнера.
- [sysctls](https://docs.docker.com/compose/compose-file/compose-file-v3/#sysctls). Параметры ядра для установки в контейнере
- [tmpfs](https://docs.docker.com/compose/compose-file/compose-file-v3/#tmpfs). Расположение монитруемых внутри контейнера временных файловых систем.
- [ulimits](https://docs.docker.com/compose/compose-file/compose-file-v3/#ulimits)
- [userns_mode](https://docs.docker.com/compose/compose-file/compose-file-v3/#userns_mode). Отключает пространство имен пользователей для этой службы, если демон Docker настроен с пространствами имен пользователей. Игнорируется в сворме.
- [volumes](https://docs.docker.com/compose/compose-file/compose-file-v3/#volumes). Пути хоста или именованные тома, заданные как подопции к службеДоступно оба синтаксиса.
Тома можно смонтировать на уровне службы. Это полезно так-же чтобы использовать том в нескольких службах.
```yaml
version: "3.9"
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:
```
В этом примере показан именованный том (`mydata`), используемый веб-службой, и монтирование привязки, определенное для одной службы (первый путь в томах службы БД). Служба db также использует именованный том с именем `dbdata` (второй путь в томах службы db), но определяет его, используя старый строковый формат для монтирования именованного тома. **Именованные тома должны быть перечислены под ключом томов верхнего уровня.**
[Подробнее о томах](https://docs.docker.com/storage/volumes/) и в [docker plugins](https://docs.docker.com/engine/extend/plugins_volume/)
Короткий синтаксис. Используется общий формат `[SOURCE:]TARGET[:MODE]`, где `SOURCE` может быть либо путем к хосту, либо именем тома. `TARGET` — это путь к контейнеру, в котором смонтирован том. Стандартные режимы: `ro` только для чтения и `rw` для чтения и записи (по умолчанию). Вы можете смонтировать относительный путь на хосте, который расширяется относительно каталога используемого файла конфигурации. Относительные пути всегда должны начинаться с `.` или же `..`
```yaml
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`: тип монтирования `bind`, `tmpfs` или `npipe`
- `source`: источник монтирования, путь на хосте для монтирования. Или имя тома, определенное в ключе томов верхнего уровня. Неприменимо для монтирования `tmpfs`.
- `target`: путь в контейнере, куда смонтирован том
- `read_only`: флаг, чтобы сделать том доступным только для чтения
- `bind`: настроить дополнительные параметры связывания
- `propagation`: режим распространения, используемый для привязки
- `volume`: настроить дополнительные параметры тома
- `nocopy`: флаг для отключения копирования данных из контейнера при создании тома
- `tmpfs`: настроить дополнительные параметры tmpfs
- `size`: размер монтирования tmpfs в байтах
```yaml
version: "3.9"
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:
```
При создании привязанных монтирований использование длинного синтаксиса требует, чтобы папка, на которую делается ссылка, была создана заранее. Использование короткого синтаксиса создает папку на лету, если она не существует.
При работе с сервисами, докер-свормом и файлами docker-stack.yml помните, что контейнеры, поддерживающие сервис, могут быть развернуты на любом узле, и каждый раз при обновлении сервиса это может быть другой узел.
При отсутствии именованных томов с указанными источниками Docker создает анонимный том для каждой задачи, поддерживающей службу. Анонимные тома не сохраняются после удаления связанных контейнеров.
Если вы хотите, чтобы ваши данные сохранялись, используйте именованный том и драйвер тома, поддерживающий работу с несколькими хостами, чтобы данные были доступны с любого узла. Или установите ограничения для службы, чтобы ее задачи развертывались на узле, на котором присутствует том.
Например, файл docker-stack.yml для примера приложения определяет службу с именем db, которая запускает базу данных postgres. Он настроен как именованный том для сохранения данных сворме и ограничен запуском только на узлах менеджера.
```yaml
version: "3.9"
services:
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
```
[Подробнгее о конфигурации томов](https://docs.docker.com/compose/compose-file/compose-file-v3/#volume-configuration-reference) для создания томо, используемых в нескольких службах. Базовый пример
```yaml
version: "3.9"
services:
db:
image: db
volumes:
- data-volume:/var/lib/db
backup:
image: backup-service
volumes:
- data-volume:/var/lib/backup/data
volumes:
data-volume:
```
Параметры:
- `driver`. Укажите, какой драйвер тома следует использовать для этого тома. По умолчанию используется любой драйвер, который был настроен для использования Docker Engine, который в большинстве случаев является локальным
- `driver_opts`. Список параметров драйвера.
- `external`. Если установлено значение true, указывает, что этот том был создан вне Compose. `docker-compose up` не пытается его создать и выдает ошибку, если он не существует.
В приведенном ниже примере вместо попытки создать том с именем [projectname]_data Compose ищет существующий том с простым названием data и монтирует его в контейнеры службы БД.
```yaml
version: "3.9"
services:
db:
image: postgres
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
external: true
```
- `labels`
- `name`. Задайте собственное имя для этого тома. Поле имени можно использовать для ссылки на тома, содержащие специальные символы. Имя используется как есть и не будет ограничиваться именем стека.
- [domainname, hostname, ipc, mac_address, privileged, read_only, shm_size, stdin_open, tty, user, working_dir](https://docs.docker.com/compose/compose-file/compose-file-v3/#domainname-hostname-ipc-mac_address-privileged-read_only-shm_size-stdin_open-tty-user-working_dir). Каждое из них представляет собой одно значение, аналогичное его аналогу вщслук кгт. Обратите внимание, что mac_address является устаревшей опцией.
```yaml
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
```
## [Переменные в compose](https://docs.docker.com/compose/compose-file/compose-file-v3/#variable-substitution)
Поддерживается синтаксис `$VARIABLE` и `${VARIABLE}`. Кроме того, при использовании формата файла 2.1 можно указать встроенные значения по умолчанию, используя типичный синтаксис оболочки:
- `${VARIABLE:-default}` принимает значение по умолчанию, если `VARIABLE` не установлена или пуст в среде
- `${VARIABLE-default}` оценивается как значение по умолчанию, только если `VARIABLE` не установлен в среде
Точно так же следующий синтаксис позволяет указывать обязательные переменные:
- `${VARIABLE:?err}` завершается с сообщением об ошибке, содержащим `err`, если `VARIABLE` не установлена или пуста в среде
- `${VARIABLE?err}` завершается с сообщением об ошибке, содержащим ошибку, если `VARIABLE` не установлена в среде.
Другие расширенные функции оболочки, такие как `${VARIABLE/foo/bar}`, не поддерживаются.
Для использования знака `$` или экранирования переменных используйте `$$`
## [Дополнительные поля](https://docs.docker.com/compose/compose-file/compose-file-v3/#extension-fields)
Возможно повторное использование фрагментов конфигурации с помощью полей расширения. Эти специальные поля могут иметь любой формат, если они расположены в корне вашего файла Compose и их имена начинаются с последовательности символов x. Содержимое этих полей игнорируется Compose, но их можно вставить в определения ваших ресурсов с помощью привязок YAML. Привязки можно переопределять частично.
```yaml
version: "3.9"
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
```
Смотри еще:
- [[docker]]
- [[docker-compose]]
- [[docker-swarm]]
[docker-swarm]: docker-swarm "Docker swarm"
[docker]: ../lists/docker "Docker"
[docker-compose]: docker-compose "Docker compose"