Explicación detallada de las instrucciones del archivo de plantilla docker-compose

El archivo de plantilla es el núcleo del uso de componer y hay muchas instrucciones clave involucradas. La mayoría de las instrucciones son similares al significado de los parámetros relacionados con la ejecución de Docker.
El nombre del archivo de plantilla predeterminado es "docker-compose.yml" y el formato es el formato YAML.

version: "3"

services:
  webapp:
    image: examples/web
    ports:
      - "80:80"
    volumes:
      - "/data"

Nota: Cada servicio debe usar la instrucción de imagen para especificar la imagen o la instrucción de compilación (se requiere dockerfile) para compilar y generar automáticamente la imagen requerida.
Si usa el comando de compilación, las opciones establecidas en el Dockerfile (por ejemplo: CMD, EXPOSE, VOLUME, ENV, etc.) se obtendrán automáticamente y no es necesario repetir la configuración en compose.yml.

El significado de la instrucción y la
compilación de uso
especifica la ruta del directorio de archivos donde se encuentra el Dockerfile (puede ser una ruta absoluta o una ruta relativa) y debe estar en la ruta de docker-compose.yml.
Compose lo usará para crear automáticamente esta imagen y luego lo usará.

version: '3'
services:

  webapp:
    build: ./dir

También puede usar el comando de contexto para especificar la ruta a la carpeta donde se encuentra el Dockerfile.
Utilice la instrucción dockerfile para especificar el nombre del archivo Dockerfile.
Utilice la instrucción arg para especificar las variables al crear la imagen.

version: '3'
services:

  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate
      args:
        buildno: 1

Use cache_from para especificar el caché para construir la imagen

build:
  context: .
  cache_from:
    - alpine:latest
    - corp/web_app:3.14

cap_add, cap_drop
especifican la asignación de capacidad del kernel (capacidad) del contenedor.

Por ejemplo, dejar que el contenedor tenga todas las capacidades se puede especificar como:

cap_add:
  - ALL

La capacidad de eliminar NET_ADMIN se puede especificar como:

cap_drop:
  - NET_ADMIN

comando
anula el comando ejecutado por defecto después de que se inicia el contenedor.

command: echo "hello world"

Las configuraciones
solo se usan en modo enjambre

cgroup_parent
especifica el grupo cgroup padre, lo que significa que heredará el límite de recursos del grupo.
Por ejemplo, un nombre de grupo cgroup se crea cgroups_1.

cgroup_parent: cgroups_1

container_name
especifica el nombre del contenedor. De forma predeterminada, se utilizará el formato de nombre de proyecto_nombre de servicio_número de serie.

container_name: docker-web-container

Nota: Después de especificar el nombre del contenedor, el servicio no se puede escalar porque Docker no permite que varios contenedores tengan el mismo nombre.

La implementación
solo se usa para
dispositivos en modo Swarm para
especificar la relación de asignación de dispositivos.

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

depende_on
resuelve el problema de la dependencia del contenedor y la secuencia de inicio. En el siguiente ejemplo, redis db se iniciará antes que web

version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres

Nota: El servicio web no espera a que se inicie el "inicio completo" de redis db.


servidor DNS personalizado dns . Puede ser un valor o una lista.

dns: 8.8.8.8

dns:
  - 8.8.8.8
  - 114.114.114.114

dns_search
configura el dominio de búsqueda DNS. Puede ser un valor o una lista.

dns_search: example.com

dns_search:
  - domain1.example.com
  - domain2.example.com

tmpfs
monta un sistema de archivos tmpfs en el contenedor.

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

env_file
obtiene variables de entorno de un archivo, que puede ser una ruta de archivo o una lista independientes.

Si especifica el archivo de plantilla Compose mediante docker-compose -f FILE, la ruta de la variable en env_file se basará en la ruta del archivo de plantilla.

Si hay un nombre de variable que entra en conflicto con la directiva medioambiental, siga la convención y prevalecerá esta última.

env_file: .env

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

Cada línea del archivo de variable de entorno debe ajustarse al formato, y se admiten las líneas de comentarios que comienzan con #.

# common.env: Set development environment
PROG_ENV=development

entorno
establece variables de entorno. Puede utilizar dos formatos: matriz o diccionario.

Una variable con solo un nombre dado obtendrá automáticamente el valor de la variable correspondiente en el host que ejecuta Compose, que puede usarse para evitar fugas de datos innecesarias.

environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

Si se usa verdadero | falso, sí | no y otras palabras que expresan un significado booleano en el nombre o valor de la variable, es mejor ponerlo entre comillas para evitar que YAML analice automáticamente cierto contenido en la semántica booleana correspondiente. Estas palabras específicas incluyen

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

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"

external_links
Nota: No se recomienda utilizar este comando.
Enlace a un contenedor fuera de docker-compose.yml, ni siquiera a un contenedor externo administrado por Compose.

external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

extra_hosts es
similar al parámetro --add-host en Docker, que especifica información adicional de asignación de nombres de host.

extra_hosts:
 - "googledns:8.8.8.8"
 - "dockerhub:52.1.157.61"

Las siguientes dos entradas se agregarán al archivo / etc / hosts en el contenedor de servicios después del inicio.

8.8.8.8 googledns
52.1.157.61 dockerhub

healthcheck
usa comandos para verificar si el contenedor está en buen estado.

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3

La imagen se
especifica como el nombre de la imagen o el ID de la imagen. Si el espejo no existe localmente, Compose intentará tirar del espejo.

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

Las etiquetas
agregan información de metadatos de Docker para el contenedor. Por ejemplo, puede agregar información auxiliar al contenedor.

labels:
  com.startupteam.description: "webapp for a startup team"
  com.startupteam.department: "devops department"
  com.startupteam.release: "rc3 for v1.0"

enlaces
Nota: No se recomienda esta directiva.
Enlace a contenedores en otros servicios. Se acepta el formato de nombre de servicio (también utilizado como alias) o nombre de servicio: alias de servicio (SERVICIO: ALIAS).

links:
- db
- db:database
- redis

logging
configura las opciones de registro.

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

Actualmente, se admiten tres tipos de controladores de registro.

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

opciones Configure los parámetros relevantes del controlador de registro.

options:
  max-size: "200k"
  max-file: "10"

P.ej:

nginx:
  image: nginx:1.12.1
  restart: always
  logging:
    driver: "json-file"
    options:
      max-size: "5g"

O agregue cuando comience la línea de comando:

docker run -d --log-opt max-size=1g nginx

O modifique el archivo del demonio de la ventana acoplable:

{
    
    
        "log-opts": {
    
    
                "max-size": "1G"
        }
}

network_mode
establece el modo de red. Utilice el mismo valor que el parámetro --network de Docker Run.

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.

version: "3"
services:

  some-service:
    networks:
     - some-network
     - other-network

networks:
  some-network:
  other-network:

P.ej:

 version: '3'
                services: 
                    nginx: 
                        image: nginx:v1
                        container_name: mynginx
                        command: ip addr
                        networks: 
                            app_web:                                # 调用 networks 定义的 app_we 网络
                            ipv4_address: 172.18.0.4				# IP V4 格式
                networks:
                    app_web:
                        driver: bridge								# 指定日志记录驱动程序
                        ipam:							# 自定义 IPAM 配置. 这是一个具有多个属性的对象, 每个属性都是可选的
                            driver: default				# IPAM 驱动程序, bridge 或者 default
                            config:						# 配置项
                                - subnet: 172.18.0.0/24	#子网,网段

El pid
comparte el espacio de nombres del proceso con el sistema anfitrión. Los contenedores con esta opción activada, así como entre el contenedor y el sistema host, pueden acceder y operar entre sí a través del ID de proceso.

pid: "host"

los puertos
exponen la información del puerto.
Utilice el formato puerto de host: puerto del contenedor (HOST: CONTAINER), o simplemente especifique el puerto del contenedor (el host seleccionará el puerto al azar).

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

Nota: Al usar el formato HOST: CONTAINER para mapear puertos, si usa un puerto de contenedor menor que 60 y no está entre comillas, es posible que obtenga resultados incorrectos, porque YAML analizará automáticamente el formato numérico de xx: yy como 60 hexadecimal . Para evitar este problema, se recomienda que todas las cadenas numéricas adopten el formato de cadena entre comillas.

Los secretos
almacenan datos confidenciales, como la contraseña del servicio mysql.

version: "3.1"
services:

mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
  secrets:
    - db_root_password
    - my_other_secret

secrets:
  my_secret:
    file: ./my_secret.txt
  my_other_secret:
    external: true

security_opt
especifica los atributos predeterminados (usuario, rol, tipo, nivel, etc.) del mecanismo de etiqueta de la plantilla de contenedor. Por ejemplo, configure el nombre de usuario y el nombre de función de la etiqueta.

security_opt:
    - label:user:USER
    - label:role:ROLE

stop_signal
establece otra señal para detener el contenedor. SIGTERM se utiliza por defecto para detener el contenedor.

stop_signal: SIGUSR1

sysctls
configura los parámetros del kernel del contenedor.

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

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

ulimits
especifica el valor límite ulimits del contenedor.

Por ejemplo, el número máximo especificado de procesos es 65535 y el número especificado de identificadores de archivos es 20000 (límite flexible, la aplicación se puede modificar en cualquier momento, no puede exceder el límite estricto) y 40000 (límite estricto del sistema, solo el usuario root puede aumentar).

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


La configuración de la ruta de montaje del volumen de datos de los volúmenes. Se puede configurar como ruta de host (HOST: CONTAINER) o nombre del volumen de datos (VOLUME: CONTAINER), y se puede configurar el modo de acceso (HOST: CONTAINER: ro).

La ruta de esta instrucción admite rutas relativas.

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

Si la ruta es el nombre del volumen de datos, el volumen de datos debe configurarse en el archivo.

version: "3"

services:
  my_src:
    image: mysql:8.0
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Otras instrucciones
Además, hay instrucciones que incluyen nombre de dominio, punto de entrada, nombre de host, ipc, mac_address, privileged, read_only, shm_size, restart, stdin_open, tty, user, working_dir, etc., que son básicamente los mismos que los parámetros correspondientes en Docker Run.

Especifique el archivo de entrada que se ejecutará después de que se inicie el contenedor de servicios.
De hecho, es ENTRYPOINT y CMD en el dockerfile.

entrypoint: /code/entrypoint.sh

Especifique el nombre de usuario de la aplicación que se ejecuta en el contenedor.

user: nginx

Especifique el directorio de trabajo en el contenedor.

working_dir: /code

Busque nombres de dominio, nombres de host, direcciones mac, etc. en el contenedor especificado.

domainname: your_website.com
hostname: test
mac_address: 08-00-27-00-0C-0A

Permita que algunos comandos privilegiados se ejecuten en el contenedor.

privileged: true

Especifica que la política de reinicio después de la salida del contenedor siempre es reiniciar. Este comando es muy efectivo para mantener el servicio en funcionamiento en todo momento, se recomienda configurarlo como siempre o salvo que se detenga en un entorno de producción.

restart: always

Montar el sistema de archivos raíz del contenedor en modo de solo lectura significa que el contenido del contenedor no se puede modificar.

read_only: true

Abra la entrada estándar, puede aceptar entrada externa.

stdin_open: true

Simular una pseudo terminal.

tty: true

Leer variables Los
archivos de plantilla de redacción admiten la lectura dinámica de las variables de entorno del sistema del host y las variables en el archivo .env en el directorio actual.
Por ejemplo, el siguiente archivo Compose leerá el valor de la variable $ {MONGO_VERSION} del entorno en el que se ejecuta y lo escribirá en la instrucción ejecutada.
Si se ejecuta MONGO_VERSION = 3.2 docker-compose up, se iniciará un contenedor duplicado mongo: 3.2; si se ejecuta MONGO_VERSION = 2.8 docker-compose up, se iniciará un contenedor duplicado mongo: 2.8.

Si hay un archivo .env en el directorio actual, las variables se leerán de este archivo cuando se ejecute el comando docker-compose.

Cree un nuevo archivo .env en el directorio actual y escriba el siguiente contenido.

# 支持 # 号注释
MONGO_VERSION=3.6

Al ejecutar docker-compose up, se iniciará un contenedor duplicado de mongo: 3.6.
Aquí solo se presentan algunas opciones de uso común, y otras necesitan consultar los documentos oficiales para aprender a usarlas.

Documento de ayuda:
https://yeasy.gitbooks.io/docker_practice/compose/compose_file.html

Supongo que te gusta

Origin blog.csdn.net/ZhanBiaoChina/article/details/105467835
Recomendado
Clasificación