руководство по оркестровке docker-compose (v3.7)

Docker

источник

Что касается установки 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-level configs 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.txtmy_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Не поддерживается в:

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_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(оба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

Справочник по составлению документации

Заканчивать