English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Docker Compose

Introdução ao Compose

O Compose é uma ferramenta usada para definir e executar aplicativos Docker multic容器. Através do Compose, você pode usar arquivos YML para configurar todos os serviços necessários para o aplicativo. Em seguida, com um comando, você pode criar e iniciar todos os serviços a partir da configuração YML.

Três passos usados pelo Compose:

  • Use Dockerfile para definir o ambiente do aplicativo.

  • Usando docker-O compose.yml define os serviços que compõem o aplicativo, permitindo que eles executem juntos em um ambiente isolado.

  • Por fim, execute docker-Use o comando compose up para iniciar e executar todo o aplicativo.

docker-A configuração do arquivo compose.yml é apresentada a seguir (parâmetros de configuração referem-se ao texto a seguir):

# Exemplo de configuração yaml
versão: ''3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Instalação do Compose

Linux

No Linux, podemos baixar o pacote binário diretamente do Github para uso, o endereço da versão mais recente lançada:https://github.com/docker/compose/releases.

Execute o seguinte comando para baixar a versão estável atual do Docker Compose:

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Para instalar outras versões do Compose, substitua 1.24.1.

Aplicar permissões de execução ao arquivo binário:

$ sudo chmod +x /usr/local/bin/docker-compose

Crie um link simbólico:

$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Teste se a instalação foi bem-sucedida:

$ docker-compose --version
cker-versão do compose 1.24.1, build 4667896b

Atenção: Para o alpine, são necessários os seguintes pacotes de dependência: py-pip, python-dev, libffi-dev, openssl-dev, gcc, libc-dev, e make.

macOS

A versão do Docker Desktop e Docker Toolbox para Mac já inclui o Compose e outros aplicativos do Docker, portanto, os usuários do Mac não precisam instalar o Compose separadamente. As instruções de instalação do Docker podem ser consultadas Instalação Docker no MacOS.

windows PC

A versão do Docker Desktop e Docker Toolbox para Windows já inclui o Compose e outros aplicativos do Docker, portanto, os usuários do Windows não precisam instalar o Compose separadamente. As instruções de instalação do Docker podem ser consultadas Instalação Docker no Windows.

Usar

1、准备

Crie um diretório de teste:

$ mkdir composetest
$ cd composetest

No diretório de teste, crie um arquivo chamado app.py e cole o seguinte conteúdo:

composetest/app.py 文件代码

import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.
'.format(count)

Neste exemplo, redis é o nome do host do container redis na rede da aplicação e o porta usada pelo host 6379.

No diretório composetest, crie outro arquivo chamado requirements.txt com o seguinte conteúdo:

flask
redis

2Crie um arquivo Dockerfile

No diretório composetest, crie um arquivo chamado Dockerfile com o seguinte conteúdo:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

Dockerfile Content Explanation:

  • FROM python:3.7-alpine: Do Python 3.7 A imagem começa a construir a imagem.

  • WORKDIR /code: Defina o diretório de trabalho como /code.

  • ENV FLASK_APP app.py
    ENV FLASK_RUN_HOST 0.0.0.0

    Defina as variáveis de ambiente usadas pelo comando flask.

  • RUN apk add --no-cache gcc musl-dev linux-headers: Instale gcc para que pacotes Python como MarkupSafe e SQLAlchemy possam ser compilados e acelerados.

  • COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt

    Copie requirements.txt e instale dependências Python.

  • COPY . .: Copie o diretório atual do projeto . para o diretório de trabalho do container .

  • CMD ["flask", "run"]: O container fornece o comando de execução padrão: flask run.

3Crie docker-compose.yml

Crie um diretório chamado docker no diretório de teste-O arquivo compose.yml, então cole o seguinte conteúdo:

docker-arquivo de configuração compose.yml

# Configuração yaml
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

Este arquivo Compose define dois serviços: web e redis.

  • web: Este serviço web usa a imagem construída a partir do diretório atual do Dockerfile. Em seguida, ele liga o contêiner e o host às portas expostas 5000. Este exemplo de serviço usa a porta padrão do servidor web Flask 5000 。

  • redis: Este serviço redis usa a imagem pública Redis do Docker Hub.

4、 Use o comando Compose para construir e executar seu aplicativo

Execute os seguintes comandos no diretório de teste para iniciar o aplicativo:

docker-compose up

Se você quiser executar o serviço em segundo plano, você pode adicioná-lo -Parâmetro d:

docker-compose up -d

Referência das instruções de configuração do compose

version

Especificar qual versão do compose esta yml está seguindo.

build

Especificar o caminho de contexto da imagem de construção:

Por exemplo, o serviço webapp, especificado como do caminho de contexto ./dir/Imagem construída pelo Dockerfile:

version: "3.7"
services:
  webapp:
    build: ./dir

Ou, como um objeto com o caminho especificado no contexto, e Dockerfile e args opcionais:

version: "3.7"
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1
      labels:
        - "com.example.description=Accounting webapp"
        - "com.example.department=Finance"
        - "com.example.label-with-empty-value"
      target: prod
  • context: Caminho de contexto.

  • dockerfile: Especifica o nome do arquivo Dockerfile da imagem de construção.

  • args: Adicionar parâmetros de construção, que são variáveis de ambiente que só podem ser acessadas durante o processo de construção.

  • labels: Define as etiquetas da imagem de construção.

  • target: Construção em várias camadas, pode especificar qual camada construir.

cap_add, cap_drop

Adicionar ou remover funcionalidades do núcleo do host que o contêiner possui.

cap_add:
  - ALL # Ativa todas as permissões
cap_drop:
  - SYS_PTRACE # Desativa a permissão ptrace

cgroup_parent

Especificar o grupo cgroup pai para o contêiner significa que ele herdará os limites de recursos do grupo.

cgroup_parent: m-executor-abcd

command

覆盖容器启动的默认命令。

command: ["bundle", "exec", "thin", "-p", "3000"]

container_name

指定自定义容器名称,而不是生成的默认名称。

container_name: my-web-container

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

注意:web 服务不会等待 redis db 完全启动 之后才启动。

deploy

指定与服务的部署和运行有关的配置。只在 swarm 模式下才会有用。

version: "3.7"
services:
  redis:
    image: redis:alpine
    deploy:
      mode:replicated
      replicas: 6
      endpoint_mode: dnsrr
      labels: 
        description: "This redis service label"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

可以选参数:

endpoint_mode:访问集群服务的方式。

endpoint_mode: vip 
# Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr
# DNS 轮询 (DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。

labelsSet labels on the service. You can override the labels under deploy with labels on the container (deploy configuration at the same level).

modeSpecify the mode provided by the service.

  • replicatedReplicated service, replicate the specified service to the machines in the cluster.

  • globalGlobal service, the service will be deployed to each node of the cluster.

  • Illustration: The yellow blocks in the following figure represent the running status of the replicated mode, and the gray blocks represent the running status of the global mode.

replicas: mode When set to replicated, use this parameter to configure the specific number of nodes to run.

resourcesConfigure the limit of server resource usage, for example, in the above instance, configure the percentage of cpu and memory usage required for the redis cluster to run. Avoid using too much resource to cause exceptions.

restart_policyHow to restart the container when the container exits.

  • condition: Optional none, on-failure or any (default value: any).

  • delay: Set how long after restart (default value: 0).

  • max_attempts: The number of times to try to restart the container. If the number exceeds, stop trying (default value: keep retrying).

  • window: Set the container restart timeout time (default value: 0).

rollback_configHow to configure the rollback of the service in case of update failure.

  • parallelism: The number of containers to roll back at one time. If set to 0, all containers will rollback simultaneously.

  • delay: The time to wait between rolling back each container group (default 0s).

  • failure_action: What to do if the rollback fails. One of continue or pause (default pause).

  • monitor: After each container is updated, continuously observe the time of failure (ns|us|ms|s|m|h) (default 0s).

  • max_failure_ratio: The allowable failure rate during rollback (default 0).

  • order:ordem das operações durante o rollback. Uma delas stop-first(rollback sequencial),ou start-first (parallel rollback) (default stop-first).

update_configHow to configure the update of the service, which is very useful for rolling updates of the configuration.

  • parallelism: The number of containers to update at one time.

  • delay: The time to wait between updating a group of containers.

  • failure_action: What to do if the update fails. One of continue, rollback or pause (default: pause).

  • monitor: After each container is updated, continuously observe the time of failure (ns|us|ms|s|m|h) (default 0s).

  • max_failure_ratio:taxa de falha tolerável durante a atualização.

  • order:ordem das operações durante o rollback. Uma delas stop-first(rollback sequencial),ou start-first(rollback paralelo)(padrão stop-first).

Nota:Apenas suporta V3.4 e versões mais recentes.

devices

Especificar a lista de mapeamento de dispositivos.

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

dns

Servidor DNS personalizado, pode ser um único valor ou múltiplos valores de uma lista.

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search

Domínio de busca DNS personalizado. Pode ser um único valor ou uma lista.

dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

entrypoint

Substitui o entrypoint padrão do container.

entrypoint: /code/entrypoint.sh

Também pode ser no seguinte formato:

entrypoint:
    - php
    - -d
    - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
    - -d
    - memory_limit=-1
    - vendor/bin/phpunit

env_file

Adicionar variáveis de ambiente a partir de arquivos. Pode ser um único valor ou múltiplos valores de uma lista.

env_file: .env

Também pode ser no formato de lista:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

environment

Adicionar variáveis de ambiente. Você pode usar um array ou dicionário, qualquer valor booleano, o valor booleano precisa ser colocado entre aspas para garantir que o analisador YML não o converta em True ou False.

environment:
  RACK_ENV: 'development'
  SHOW: 'true'

 

expose

Expõe a porta, mas não mapeia para o host anfitrião, apenas pode ser acessado pelo serviço conectado.

Apenas pode especificar o porta interna como parâmetro:

expose:
 - "3000"
 - "8000"

extra_hosts

Adicionar mapeamento de nome de host. Semelhante ao cliente docker --add-host。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

o acima será dentro do container deste serviço /etc/hosts cria um mapeamento de endereço IP e nome de host:

162.242.195.82  somehost
50.31.209.229   otherhost

healthcheck

Used to check if the docker service is running healthily.

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"] # Set the detection program
  interval: 1m30s # Set the detection interval
  timeout: 10s # Set the detection timeout time
  retries: 3 # Set the number of retries
  start_period: 40s # After starting, how many seconds to start the detection program

image

Specify the image that the container runs. The following formats are all acceptable:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # Image ID

logging

Service logging configuration.

driver: Specifies the logging driver for the service container, the default value is json-file. There are three options

driver: "json"-file"
driver: "syslog"
driver: "none"

Only in json-Under the file driver, you can use the following parameters to limit the number and size of logs.

logging:
  driver: "json"-file
  options:
    max-size: "200k"# The size of a single file is200k
    max-file: "10"# Most10file

Old files will be automatically deleted when the file limit is reached.

Under the syslog driver, you can use syslog-The address specifies the receiving address of the log.

logging:
  driver: "syslog"
  options:
    syslog-address: "tcp://192.168.0.42:123"

network_mode

Set the network mode.

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks

Configure the network connection of the container, refer to the entries under the top-level networks.

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use um driver personalizado
    driver: custom-driver-1
  other-network:
    # Use um driver personalizado que aceita opções especiais
    driver: custom-driver-2

aliases :Os outros contêineres na mesma rede podem se conectar ao serviço correspondente usando o nome do serviço ou este alias.

restart

  • no:É a política de reinicialização padrão, que nunca reinicia o contêiner em nenhuma circunstância.

  • always:O contêiner sempre é reiniciado.

  • on-failure:Só reinicia o contêiner se ele sair anormalmente (estado de saída não 0).

  • unless-stopped:Sempre reinicia o contêiner ao sair, mas não considera os contêineres que já estavam parados no início do Docker daemon.

restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

Nota: No modo de cluster swarm, use restart_policy.

secrets

Armazene dados sensíveis, como senhas:

version: "3.1"
services:
mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
  secrets:
    - my_secret
secrets:
  my_secret:
    file: ./my_secret.txt

security_opt

Modifique a etiqueta schema padrão do contêiner.

security-opt:
  - label:user:USER # Defina a etiqueta de usuário do contêiner
  - label:role:ROLE # Defina a etiqueta de papel do contêiner
  - label:type:TYPE # Defina a etiqueta de política de segurança do contêiner
  - label:level:LEVEL # Defina a etiqueta de segurança do contêiner

stop_grace_period

Especifique por quanto tempo esperar antes de enviar o sinal SIGKILL para fechar o contêiner quando o contêiner não puder lidar com o SIGTERM (ou qualquer outro sinal stop_signal).

stop_grace_period: 1s # Esperar 1 segundos
stop_grace_period: 1m30s # Esperar 1 minutos 30 segundos

O tempo de espera padrão é 10 segundos.

stop_signal

Configure o sinal de substituição para parar o contêiner. Pelo padrão, use SIGTERM.

A seguir, exemplo, usando SIGUSR1 Substitua o sinal SIGTERM para parar o contêiner.

stop_signal: SIGUSR1

sysctls

Definir os parâmetros do kernel dentro do container, pode usar o formato de array ou dicionário.

sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0
sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0

tmpfs

Instalar um sistema de arquivos temporário dentro do container. Pode ser um único valor ou uma lista de múltiplos valores.

tmpfs: /run
tmpfs:
  - /run
  - /tmp

ulimits

Substituir o ulimit padrão do container.

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000

volumes

Montar o volume de dados do host ou o arquivo no container.

version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"