English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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: {}
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.
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.
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.
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:
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
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.
Crie um diretório chamado docker no diretório de teste-O arquivo compose.yml, então cole o seguinte conteúdo:
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.
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
Especificar qual versão do compose esta yml está seguindo.
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.
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
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: ["bundle", "exec", "thin", "-p", "3000"]
指定自定义容器名称,而不是生成的默认名称。
container_name: my-web-container
设置依赖关系。
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 完全启动 之后才启动。
指定与服务的部署和运行有关的配置。只在 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.
Especificar a lista de mapeamento de dispositivos.
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
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
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
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
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
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'
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"
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
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
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
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"
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.
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.
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
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
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.
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
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
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
Substituir o ulimit padrão do container.
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
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"