Explicación detallada de DockerCompose + yaml de notas de Docker

Docker Compose

Introducción a redactar

Compose es una herramienta para definir y ejecutar aplicaciones Docker de varios contenedores. Con Compose, puede usar archivos YML para configurar todos los servicios requeridos por su aplicación. Luego, con un comando, todos los servicios se pueden crear e iniciar desde la configuración del archivo YML.

Si aún no comprende la configuración del archivo YML, puede leer primero el tutorial introductorio de YAML.

Tres pasos utilizados por Compose:

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

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

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

El caso de configuración de docker-compose.yml es el siguiente (consulte los parámetros de configuración a continuación):

Ejemplo

ejemplo de configuración de yaml
version: '3'
services:
  web:
    build: .
    ports:
   - "5000:5000"
    volumes:
   - .:/code
    - logvolume01:/var/log
    links:
   - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

utilizar

1. Prepárese para
crear un directorio de prueba:

$ mkdir composetest
$ cd composetest

Cree un archivo llamado app.py en el directorio de prueba y copie y pegue el siguiente contenido:

código de archivo 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.\n'.format(count)

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

Cree otro archivo llamado requirements.txt en el directorio composetest con el siguiente contenido:

flask
redis

2. Cree un 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 de Dockerfile:

FROM python:3.7-alpine: 从 Python 3.7 映像开始构建镜像。
WORKDIR /code: 将工作目录设置为 /code。
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
设置 flask 命令使用的环境变量。

RUN apk add --no-cache gcc musl-dev linux-headers: 安装 gcc,以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速。
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
复制 requirements.txt 并安装 Python 依赖项。

COPY . .: 将 . 项目中的当前目录复制到 . 镜像中的工作目录。
CMD ["flask", "run"]: 容器提供默认的执行命令为:flask run。

3. Cree docker-compose.yml
Cree un archivo llamado docker-compose.yml en el directorio de prueba y pegue el siguiente contenido:

archivo de configuración docker-compose.yml

# yaml 配置
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

El archivo Compose define dos servicios: web y redis.

web: este servicio web utiliza la imagen creada a partir del directorio actual del Dockerfile. Luego, une el contenedor y el host al puerto 5000 expuesto. Este servicio de muestra utiliza el puerto 5000 predeterminado del servidor web Flask.
redis: este servicio redis utiliza la imagen pública de Redis de Docker Hub.
4. Utilice el comando Compose para crear y ejecutar su aplicación.
En el directorio de prueba, ejecute el siguiente comando para iniciar la aplicación:

docker-compose up

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

docker-compose up -d

El comando de configuración de yml se refiere a la
versión para
especificar con qué versión de componer cumple este yml.

build se
especifica como la ruta de contexto de la imagen de construcción:

Por ejemplo, el servicio de la aplicación web se especifica como una imagen creada a partir de la ruta de contexto ./dir/Dockerfile:

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

O, como un objeto con una 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
  • contexto: ruta de contexto.
  • Dockerfile: especifique el nombre de archivo del Dockerfile para crear la imagen.
  • args: agregue parámetros de compilación, que son variables de entorno a las que solo se puede acceder durante el proceso de compilación.
  • etiquetas: establece las etiquetas para crear la imagen.
  • objetivo: construcción de múltiples capas, puede especificar qué capa construir.
  • cap_add , cap_drop
  • Agregue o elimine las funciones del kernel de la máquina host propiedad del contenedor.

cap_add:

  • TODOS # Activar todos los permisos

cap_drop:

  • SYS_PTRACE # Desactivar el permiso ptrace
    cgroup_parent
    especifica el grupo cgroup padre para el contenedor, lo que significa que se heredará el límite de recursos de este grupo.
cgroup_parent: m-executor-abcd

comando
anula el comando predeterminado iniciado por el contenedor.

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

container_name
especifica un nombre de contenedor personalizado en lugar del nombre predeterminado generado.

container_name: my-web-container

depende_en
establece dependencias.
docker-compose up: inicia los servicios en orden de dependencia. En el siguiente ejemplo, db y redis se inician antes de iniciar web.
docker-compose up SERVICE: incluye automáticamente las dependencias de SERVICE. En el siguiente ejemplo, docker-compose up web también creará e iniciará db y redis.
docker-compose stop: detiene los servicios en el orden de las dependencias. En el siguiente ejemplo, web se detiene antes de db y redis.

version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

Nota: El servicio web no espera a que redis db se inicie por completo.

Implementar
especifica la configuración relacionada con la implementación y operación del servicio. Solo es útil en modo enjambre.

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

Parámetros opcionales:

  • endpoint_mode: la forma de acceder a los servicios de clúster.

    • endpoint_mode: el
      clúster vip de Docker sirve una IP virtual externa. Todas las solicitudes llegarán a las máquinas dentro del servicio de clúster a través de esta ip virtual.
    • endpoint_mode: sondeo de
      DNS dnsrr (DNSRR). Todas las solicitudes se sondearán automáticamente para obtener una dirección IP en la lista de IP del clúster.
  • etiquetas: establece etiquetas en el servicio. Puede utilizar las etiquetas en el contenedor (la configuración al mismo nivel que la implementación) para sobrescribir las etiquetas en implementación.

  • modo: especifica el modo de prestación del servicio.

    • replicado: servicio de replicación, que replica el servicio especificado en las máquinas del clúster.

    • global: servicio global, el servicio se implementará en cada nodo del clúster.

Ilustración: El cuadrado amarillo en la figura siguiente es el funcionamiento del modo replicado y el cuadrado gris es el funcionamiento del modo global.
Inserte la descripción de la imagen aquí

  • réplicas: cuando se replica el modo, debe utilizar este parámetro para configurar el número de nodos en ejecución.

  • recursos: configure los límites del uso de recursos del servidor. Por ejemplo, en el ejemplo anterior, configure el porcentaje de uso de CPU y memoria para la operación del clúster de Redis. Evite el uso excesivo de recursos y las anomalías.

  • reiniciar_policy: Configure cómo reiniciar el contenedor cuando sale.

    • condición: opcional ninguno, en caso de falla o cualquiera (predeterminado: cualquiera).
    • retardo: establezca cuánto tiempo reiniciar después de la configuración (valor predeterminado: 0).
    • max_attempts: El número de intentos para reiniciar el contenedor. Si se excede el número, no más intentos (predeterminado: reintentar siempre).
    • ventana: establece el tiempo de espera de reinicio del contenedor (valor predeterminado: 0).
    • rollback_config: configure cómo revertir el servicio si la actualización falla.
  • Paralelismo: la cantidad de contenedores que se revertirán a la vez. Si se establece en 0, todos los contenedores se revertirán al mismo tiempo.

    • delay: El tiempo de espera entre reversiones de cada grupo de contenedores (el valor predeterminado es 0).
    • failure_action: Qué hacer si falla la reversión. Uno de continuar o pausar (pausar por defecto).
    • monitor: después de que se actualiza cada contenedor, el tiempo para observar continuamente si falla (ns | us | ms | s | m | h) (el valor predeterminado es 0s).
    • max_failure_ratio: la tasa de fallas que se puede tolerar durante la reversión (el valor predeterminado es 0).
    • orden: el orden de las operaciones durante la reversión. Uno de detener primero (reversión en serie) o comenzar primero (reversión en paralelo) (por defecto, detener primero).
    • update_config: configura cómo se debe actualizar el servicio, lo cual es útil para configurar actualizaciones continuas.
  • Paralelismo: el número de contenedores actualizados a la vez.

    • delay: El tiempo de espera entre la actualización de un conjunto de contenedores.
    • failure_action: Qué hacer si falla la actualización. Uno de continuar, retroceder o pausar (predeterminado: pausa).
    • monitor: después de que se actualiza cada contenedor, el tiempo para observar continuamente si falla (ns | us | ms | s | m | h) (el valor predeterminado es 0s).
    • max_failure_ratio: la tasa de fallas que se puede tolerar durante el proceso de actualización.
    • orden: el orden de las operaciones durante la reversión. Uno de detener primero (reversión en serie) o comenzar primero (reversión en paralelo) (por defecto, detener primero).
      Nota: Solo se admiten V3.4 y versiones posteriores.
  • dispositivos
    especifica la lista de asignación de dispositivos.

devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"
  • dns
    Servidor DNS personalizado, que puede ser un valor único o varios valores en una lista.
dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 9.9.9.9
  • Dominio de
    búsqueda DNS personalizado dns_search . Puede ser un valor único o una lista.
dns_search: example.com

dns_search:
  - dc1.example.com
  - dc2.example.com
  • El punto de entrada
    anula el punto de entrada predeterminado del contenedor.
entrypoint: /code/entrypoint.sh

También puede estar 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
    agrega variables de entorno del archivo. Puede ser un valor único o una lista de varios valores.
env_file: .env

También puede estar en formato de lista:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env
  • entorno
    Agrega variables de entorno. Puede usar matrices o diccionarios, cualquier valor booleano, los valores booleanos deben estar entre comillas para asegurarse de que el analizador YML no los convierta a verdadero o falso.
environment:
  RACK_ENV: development
  SHOW: 'true'
  • Exponga el
    puerto, pero no está asignado al host, solo se accede a él mediante servicios conectados.

Solo los puertos internos se pueden especificar como parámetros:

expose:
 - "3000"
 - "8000"
  • extra_hosts
    agrega mapeo de nombres de host. Similar al cliente de Docker --add-host.
extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

Lo anterior creará una relación de mapeo con la dirección IP y el nombre de host en / etc / hosts en el contenedor interno de este servicio:

162.242.195.82  somehost
50.31.209.229   otherhost
  • healthcheck se
    usa para detectar si el servicio Docker se está ejecutando correctamente .
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
  interval: 1m30s # 设置检测间隔
  timeout: 10s # 设置检测超时时间
  retries: 3 # 设置重试次数
  start_period: 40s # 启动后,多少秒开始启动检测程序
  • image
    especifica la imagen en la que se ejecuta el contenedor. Los siguientes formatos son todos posibles:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像id

  • Configuración de registro del servicio de registro .

controlador: especifique el controlador de registro del contenedor de servicios. El valor predeterminado es json-file. Hay tres opciones

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

Solo bajo el controlador de archivo json, los siguientes parámetros se pueden usar para limitar la cantidad y el tamaño de los registros.

logging:
  driver: json-file
  options:
    max-size: "200k" # 单个文件大小为200k
    max-file: "10" # 最多10个文件

Cuando se alcanza el límite de archivos, los archivos antiguos se eliminarán automáticamente.

Bajo el controlador syslog, puede usar syslog-address para especificar la dirección de recepción del registro.

logging:
  driver: syslog
  options:
    syslog-address: "tcp://192.168.0.42:123"
  • network_mode
    establece el modo de red.
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
  • redes

Configure la red a la que está conectado el contenedor, consulte la entrada debajo de las redes de nivel superior.

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use a custom driver
    driver: custom-driver-1
  other-network:
    # Use a custom driver which takes special options
    driver: custom-driver-2

alias: Otros contenedores en la misma red pueden usar el nombre del servicio o este alias para conectarse al servicio del contenedor correspondiente.

  • reiniciar
    no: es la estrategia de reinicio predeterminada, el contenedor no se reiniciará bajo ninguna circunstancia.
    always: el contenedor siempre se reinicia.
    si falla: cuando el contenedor sale de manera anormal (el estado de salida no es 0), el contenedor se reiniciará.
    a menos que se detenga: reinicie siempre el contenedor cuando salga, pero no tenga en cuenta los contenedores que se detuvieron cuando se inicia el demonio de Docker
    reiniciar: "no"
    reiniciar: siempre
    reiniciar: en caso de falla
    reiniciar: a menos que se detenga
    Nota: clúster de enjambre Modo, utilice reiniciar_policy en su lugar.

  • Los secretos
    almacenan 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
    modifica la etiqueta de esquema predeterminada del contenedor.
security-opt:
  - label:user:USER   # 设置容器的用户标签
  - label:role:ROLE   # 设置容器的角色标签
  - label:type:TYPE   # 设置容器的安全策略标签
  - label:level:LEVEL  # 设置容器的安全等级标签
  • stop_grace_period
    especifica cuánto tiempo esperar antes de enviar una señal SIGKILL para cerrar el contenedor cuando el contenedor no puede procesar SIGTERM (o cualquier señal stop_signal).
stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒 
默认的等待时间是 10 秒。
  • stop_signal
    establece una señal alternativa para detener el contenedor. SIGTERM se utiliza por defecto.

El siguiente ejemplo usa SIGUSR1 en lugar de la señal SIGTERM para detener el contenedor.

stop_signal: SIGUSR1
  • sysctls
    establece los parámetros del kernel en el contenedor, puede usar formato de matriz o diccionario.
sysctls:
  net.core.somaxconn: 1024
  net.ipv4.tcp_syncookies: 0

sysctls:
  - net.core.somaxconn=1024
  - net.ipv4.tcp_syncookies=0
  • tmpfs
    instala un sistema de archivos temporal en el contenedor. Puede ser un valor único o una lista de varios valores.
tmpfs: /run

tmpfs:
  - /run
  - /tmp
  • ulimits

Anula el ulimit predeterminado del contenedor.

ulimits:
  nproc: 65535
  nofile:
    soft: 20000
    hard: 40000
  • volúmenes
    para montar un volumen o un archivo de datos en el contenedor del host.
version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

Supongo que te gusta

Origin blog.csdn.net/BigData_Mining/article/details/108316515
Recomendado
Clasificación