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

Docker Compose

Compose 简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。

  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。

  • 最后,执行 docker-使用 compose up 命令来启动并运行整个应用程序。

docker-以下为 compose.yml 的配置案例(配置参数参考下文):

# yaml 配置示例
version: ''3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

Compose 安装

Linux

En Linux, podemos descargar su paquete binario desde Github para usarlo, la dirección de la última versión publicada:https://github.com/docker/compose/releases.

Ejecute el siguiente comando para descargar la versión estable actual de 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 otras versiones de Compose, reemplace 1.24.1.

Aplicar permisos de ejecución al archivo binario:

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

Crear un enlace simbólico:

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

Verifique si la instalación fue exitosa:

$ docker-compose --version
cker-versión de compose 1.24.1, build 4667896b

Atención: Para alpine, se necesitan los siguientes paquetes dependientes: py-pip, python-dev, libffi-dev, openssl-dev, gcc, libc-dev, y make.

macOS

La versión de escritorio de Docker para Mac y Docker Toolbox ya incluyen Compose y otras aplicaciones de Docker, por lo tanto, los usuarios de Mac no necesitan instalar Compose por separado. Las instrucciones de instalación de Docker pueden consultarse Instalación Docker en MacOS.

windows PC

La versión de escritorio de Docker para Windows y Docker Toolbox ya incluyen Compose y otras aplicaciones de Docker, por lo tanto, los usuarios de Windows no necesitan instalar Compose por separado. Las instrucciones de instalación de Docker pueden consultarse Instalación Docker en Windows.

Usar

1、准备

Crear un directorio de prueba:

$ mkdir composetest
$ cd composetest

En el directorio de prueba, cree un archivo llamado app.py y pegue el siguiente contenido:

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)

En este ejemplo, redis es el nombre de host del contenedor redis en la red de la aplicación, que utiliza el puerto 6379.

En el directorio composetest, cree otro archivo llamado requirements.txt con el siguiente contenido:

flask
redis

2Cree el archivo Dockerfile

En el directorio composetest, cree un archivo llamado Dockerfile con el siguiente contenido:

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"]

Explicación del contenido del Dockerfile:

  • FROM python:3.7-alpine: Desde Python 3.7 La imagen comienza a construir la imagen.

  • WORKDIR /code: Establecer el directorio de trabajo como /code.

  • ENV FLASK_APP app.py
    ENV FLASK_RUN_HOST 0.0.0.0

    Configurar las variables de entorno para el comando flask.

  • RUN apk add --no-cache gcc musl-dev linux-headers: Instale gcc para que paquetes de Python como MarkupSafe y SQLAlchemy puedan compilarse y acelerarse.

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

    Copie requirements.txt e instale las dependencias de Python.

  • COPY . .: Copie el directorio actual del proyecto . al directorio de trabajo de la imagen .

  • CMD ["flask", "run"]: El contenedor proporciona el comando de ejecución predeterminado: flask run.

3Cree docker-compose.yml

Cree un directorio llamado docker en el directorio de prueba-El archivo compose.yml, luego pegue el siguiente contenido:

docker-archivo de configuración compose.yml

# Configuración yaml
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

Este archivo Compose define dos servicios: web y redis。

  • web:Este servicio web utiliza la imagen construida desde el directorio actual del Dockerfile. Luego, une el contenedor y el anfitrión a los puertos expuestos 5000。Este ejemplo de servicio utiliza el puerto predeterminado del servidor web Flask 5000 。

  • redis:Este servicio redis utiliza la imagen pública Redis de Docker Hub.

4、Utilice el comando Compose para construir y ejecutar su aplicación

En el directorio de prueba, ejecute los siguientes comandos para iniciar la aplicación:

docker-compose up

Si desea ejecutar el servicio en segundo plano, puede agregar -d parámetro:

docker-compose up -d

Referencia de instrucciones de configuración yml

version

Especificar la versión de compose de la que depende esta yml.

build

Especificar la ruta de contexto para construir la imagen:

Por ejemplo, el servicio webapp, especificado como desde la ruta de contexto ./dir/La imagen construida por Dockerfile:

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

o, como objeto con la ruta especificada en el contexto, y Dockerfile y args opcionales:

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: Ruta de contexto.

  • dockerfile: Especificar el nombre del archivo Dockerfile de la imagen de construcción.

  • args: Agregar parámetros de construcción, que son variables de entorno que solo se pueden acceder durante el proceso de construcción.

  • labels: Establecer las etiquetas de la imagen de construcción.

  • target: Construcción en múltiples capas, se puede especificar qué capa construir.

cap_add, cap_drop

Agregar o eliminar las funcionalidades del núcleo del anfitrión que posee el contenedor.

cap_add:
  - ALL # Habilitar todos los permisos
cap_drop:
  - SYS_PTRACE # Cerrar permisos ptrace

cgroup_parent

Asignar un grupo cgroup padre al contenedor significa que heredará las limitaciones de recursos de ese 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 地址。

labelsConfiguración de etiquetas en el servicio. Pueden usarse las etiquetas del contenedor (configuración同级 a deploy) para sobrescribir las etiquetas debajo de deploy.

modeConfiguración del modo proporcionado por el servicio.

  • replicatedConfiguración de servicio replicado, copiar el servicio especificado a los equipos del clúster.

  • globalConfiguración de servicio global, el servicio se desplegará en cada nodo del clúster.

  • Ilustración: En la imagen siguiente, los cuadrados amarillos representan el estado de ejecución del modo replicated, y los cuadrados grises representan el estado de ejecución del modo global.

replicas: mode Para replicated, se necesita configurar este parámetro con el número de nodos específicos que se ejecutarán.

resourcesConfiguración de los límites del uso de recursos del servidor, por ejemplo, en el ejemplo anterior, se configura el porcentaje de cpu y el uso de memoria necesarios para la ejecución del clúster de redis. Evitar usar demasiados recursos para evitar anomalies.

restart_policyConfiguración de cómo reiniciar el contenedor al salir del contenedor.

  • condition: Opcional none, on-failure o any (por defecto any).

  • delay: Tiempo de espera antes de reiniciar (por defecto 0).

  • max_attempts: Número de intentos de reinicio del contenedor. Si se excede, ya no se intentará (por defecto: intenta siempre).

  • window: Tiempo de espera de reinicio del contenedor configurado (por defecto 0).

rollback_configConfiguración de cómo rollback el servicio en caso de fallo de actualización.

  • parallelism: Número de contenedores a rollback a la vez. Si se establece en 0, todos los contenedores se rollbackarán al mismo tiempo.

  • delay: Tiempo de espera entre el rollback de cada grupo de contenedores (por defecto 0s).

  • failure_action: ¿Qué hacer si el rollback falla? Una de las opciones es continue o pause (por defecto pause).

  • monitor: Observar el tiempo (ns|us|ms|s|m|h) durante el cual cada contenedor ha fallado después de una actualización (por defecto 0s).

  • max_failure_ratio: Tasa de fallo tolerable durante el rollback (por defecto 0).

  • order:orden de operaciones durante el rollback. Uno de ellos es stop-first(rollback en serie),o start-first (rollback en paralelo) (por defecto stop-first )。

update_configConfiguración de cómo actualizar el servicio, útil para actualizaciones de configuración de deslizamiento.

  • parallelism: Número de contenedores actualizados a la vez.

  • delay: Tiempo de espera entre la actualización de un grupo de contenedores.

  • failure_action: ¿Qué hacer si la actualización falla? Una de las opciones es continue, rollback o pause (por defecto: pause).

  • monitor: Observar el tiempo (ns|us|ms|s|m|h) durante el cual cada contenedor ha fallado después de una actualización (por defecto 0s).

  • max_failure_ratio:tasa de fallo permitida durante el proceso de actualización.

  • order:orden de operaciones durante el rollback. Uno de ellos es stop-first(rollback en serie),o start-first(rollback en paralelo)(por defecto stop-first)。

Notasólo admite V3.4 y versiones superiores.

devices

Especificar la lista de mapeos de dispositivos.

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

dns

Definir servidor DNS personalizado, puede ser un solo valor o múltiples valores en una lista.

dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

dns_search

Definir dominio de búsqueda DNS personalizado. Puede ser un solo valor o una lista.

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

entrypoint

Sobrescribe el entrypoint predeterminado del contenedor.

entrypoint: /code/entrypoint.sh

también puede ser en el siguiente 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

Agregar variables de entorno desde el archivo. Puede ser un solo valor o múltiples valores en una lista.

env_file: .env

también puede ser en formato de lista:

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

environment

Añadir variable de entorno. Puede usar un array o un diccionario, cualquier valor booleano debe estar entre comillas para asegurarse de que el analizador YML no lo convierta en True o False.

environment:
  RACK_ENV: 'desarrollo'
  MOSTRAR: 'true'

 

expose

Expone el puerto, pero no lo mapea al host anfitrión, solo es accesible por el servicio que se conecta.

Sólo se puede especificar el puerto interno como parámetro:

expose:
 - "3000"
 - "8000"

extra_hosts

Añadir mapeo de nombre de host. Similar al cliente docker --add-host。

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

lo anterior se ejecutará en el contenedor interno de este servicio: /etc/hosts crea un mapeo de relación entre la dirección IP y el nombre del 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 checking program
  interval: 1m30s # Set the check interval
  timeout: 10s # Set the timeout time for checking
  retries: 3 # Set the number of retries
  start_period: 40s # After startup, start checking the program after how many seconds

image

Specify the image to be run by the container. 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 log recording configuration.

driver: Specifies the log recording driver for the service container, with the default value being 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"# Size of a single file is200k
    max-file: "10"# Maximum10files

When the file limit is reached, old files will be automatically deleted.

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

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, referencing the entries under the top-level networks.

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use un driver personalizado
    driver: custom-driver-1
  other-network:
    # Use un driver personalizado que tome opciones especiales
    driver: custom-driver-2

aliases :Los otros contenedores en la misma red pueden conectarse al servicio del contenedor correspondiente utilizando el nombre del servicio o este alias.

restart

  • no:Es la política de reinicio predeterminada, que no reinicia el contenedor en ninguna circunstancia.

  • always:El contenedor se reinicia siempre.

  • on-failure:Sólo reiniciar el contenedor si sale del contenedor de manera anormal (estado de salida no 0).

  • unless-stopped:Reiniciar el contenedor siempre que salga del contenedor, pero sin considerar los contenedores que ya estaban parados cuando se inició el servicio Docker.

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

Nota: en el modo de集群 swarm, utilice restart_policy.

secrets

Almacenar datos sensibles, como contraseñas:

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

Modificar la etiqueta schema predeterminada del contenedor.

security-opt:
  - label:user:USER # Establecer la etiqueta de usuario del contenedor
  - label:role:ROLE # Establecer la etiqueta de rol del contenedor
  - label:type:TYPE # Establecer la etiqueta de política de seguridad del contenedor
  - label:level:LEVEL # Establecer la etiqueta de nivel de seguridad del contenedor

stop_grace_period

Especificar cuánto tiempo esperar después de que el contenedor no pueda manejar SIGTERM (o cualquier señal stop_signal) antes de enviar la señal SIGKILL para cerrar el contenedor.

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

El tiempo de espera predeterminado es 10 segundos.

stop_signal

Configurar la señal de reemplazo para detener el contenedor. Por defecto se utiliza SIGTERM.

A continuación, un ejemplo, usar SIGUSR1 Reemplazar la señal SIGTERM para detener el contenedor.

stop_signal: SIGUSR1

sysctls

Configurar los parámetros del núcleo en el contenedor, que se puede usar en formato de array o diccionario.

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

tmpfs

Instalar un sistema de archivos temporal en el contenedor. Puede ser un valor único o una lista de múltiples valores.

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

ulimits

Sobrescribir el ulimit predeterminado del contenedor.

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

volumes

Montar el volumen de datos del anfitrión o el archivo en el contenedor.

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