English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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: {}
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.
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.
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.
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:
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
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.
Cree un directorio llamado docker en el directorio de prueba-El archivo compose.yml, luego pegue el siguiente contenido:
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.
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
Especificar la versión de compose de la que depende esta yml.
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.
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
Asignar un grupo cgroup padre al contenedor significa que heredará las limitaciones de recursos de ese 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 地址。
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.
Especificar la lista de mapeos de dispositivos.
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
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
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
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
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
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'
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"
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
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
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
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"
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.
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.
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
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
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.
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
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
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
Sobrescribir el ulimit predeterminado del contenedor.
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
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"