Tutoriales

7 consejos avanzados de Docker Compose para administradores de sistemas Linux

mayoría compose.yaml Los archivos se convirtieron lentamente en fragmentos largos, copiados y pegados, con frágiles dependencias de inicio. Docker Compose incluye varias funciones integradas para hacer que sus pilas sean más limpias, reutilizables y predecibles.

Imagine una pequeña pila de red Pitón agentes de aplicación, trabajador, PostgreSQL y Nginx definidos en un archivo compose.yaml documento. A medida que la pila crece, terminas repitiendo la misma configuración entre servicios.

Peor aún, después de reiniciar, la aplicación puede iniciarse antes de que PostgreSQL esté realmente listo, provocando fallos hasta que todo se solucione.

Las soluciones comunes son agregar comandos de suspensión o mantener varios archivos de redacción casi idénticos. Ambos enfoques rápidamente se vuelven más difíciles de mantener que la propia pila.

Docker componer v2 Se han proporcionado mejores soluciones. Funciones como anclajes, controles de estado, perfiles, inclusiones y monitoreo reducen la duplicación, manejan adecuadamente las dependencias del servicio y agilizan los flujos de trabajo de desarrollo.

Muchas de estas funciones están disponibles en Redactar 2.17 y 2.24por lo que son fácilmente ignorados.


Boletín semanal de TechMint

conseguir Aprenda el curso intensivo de 7 días de Linux Únase a más de 34.000 profesionales de Linux que leen gratis todos los jueves.

Revise su correo electrónico para ver el enlace mágico para comenzar.

Algo salió mal. Por favor inténtalo de nuevo.

Cómo elegimos estas funciones de Docker Compose

Las siete funciones funcionan a través del modelo de proyecto de Docker Compose, donde Compose ensambla y analiza su configuración antes de construir el contenedor.

Están integrados en la especificación Compose, no requieren complementos de terceros y se demuestran utilizando una única pila de ejemplo. /home/tecmint/webapp en nuestro servidor de prueba 192.168.122.248.

Verifique su versión de Docker Compose antes de comenzar

Dado que algunas de estas funciones se han introducido o ampliado en versiones recientes de Compose, primero verifique que esté utilizando Docker Compose v2 Complementos en lugar de legado docker-compose Orden:

docker compose version

Debería ver un resultado similar al siguiente:

Docker Compose version v2.39.2

Tu versión puede ser diferente. Para los ejemplos de esta guía, recomendamos Docker Compose v2.24 O actualice la versión para garantizar que la funcionalidad requerida esté disponible.

1. Reutilice la configuración del servicio a través de anclajes YAML y campos de extensión x

Después de confirmar su versión de Compose, el problema más común es la configuración duplicada, porque si web y worker Los servicios utilizan la misma política de reinicio y límites de registro, y mantener estas configuraciones por separado significa que cada cambio debe realizarse dos veces.

existir ubuntu y Durbanabra el archivo Redactar nano:

cd ~/webapp && nano compose.yaml

existir LokiLinux, AlmaLinuxy RHELla instalación mínima puede no incluir nanoasí que usa vi en cambio:

cd ~/webapp && vi compose.yaml

Agregue la siguiente configuración:

yaml
# /home/tecmint/webapp/compose.yaml
x-common: &common
  restart: unless-stopped
  logging:
    driver: json-file
    options:
      max-size: "10m"
      max-file: "3"

services:
  web:
    

Here is what the syntax does:

  • x-common Es un campo de extensión que Compose ignora al crear servicios, por lo que puede usarse para almacenar configuraciones reutilizables.
  • &common Cree un ancla YAML para proporcionar un nombre reutilizable para la configuración compartida.
  • merges the anchored settings into each service. Values defined directly under a service override the shared values.
  • max-size y max-file Limite cada archivo de registro a 10MB Y mantener hasta tres archivos ayuda a evitar que los registros del contenedor consuman demasiado espacio en el disco.

Guarde el archivo y salga del editor. Luego deja que Compose renderice la configuración final:

docker compose config

Pantalla de salida restart: unless-stopped La configuración de registro es la misma en ambos servicios, incluso si solo define esta configuración una vez.

2. Inicie los servicios en secuencia, condición de dependencia: service_healthy

Ahora que los servicios comparten configuraciones comunes, la siguiente pregunta es secuencia de arranque. una llanura depends_on Solo asegúrese de que el contenedor de la base de datos se inicie antes que la aplicación.

No espera a que PostgreSQL esté listo para aceptar conexiones, por lo que la aplicación aún puede fallar con el siguiente error: connection refused Se produjo un error durante el inicio.

Abierto compose.yaml Agrega uno nuevamente db servicios para realizar controles de salud y realizar web Depende de su estado de salud:

# /home/tecmint/webapp/compose.yaml
services:
  db:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      retries: 10
      start_period: 10s
  web:
    

The important settings are:

  • test correr pg_isreadyinformando el éxito cuando PostgreSQL esté listo para aceptar la conexión.
  • interval La base de datos se verifica cada 5 segundos.
  • retries Se permite un máximo de 10 errores de verificación consecutivos antes de que un contenedor se considere en mal estado.
  • start_period Dé a PostgreSQL 10 segundos para inicializarse antes de que una comprobación de estado fallida cuente para el límite de reintentos.
  • condition: service_healthy Le indica a Compose que inicie la web solo después de una verificación exitosa del estado del repositorio.
  • restart: true Dile a Compose que reinicie las dependencias web Cuando Compose reinicia explícitamente el servicio db Atender.

este ${DB_PASSWORD} El valor se lee desde un .env Los archivos se encuentran en el mismo directorio del proyecto. Guarde el archivo y comience a apilar --wait:

docker compose up -d --wait

este --wait La opción hace que Compose espere hasta que el servicio esté activo o normal antes de devolver el control al shell.

Si la verificación del estado del repositorio nunca tiene éxito, Compose informa el error de dependencia en lugar de permitir web Comenzar desde una base de datos no disponible le dará una falla obvia en la verificación de estado para investigar, en lugar de un bucle de falla de la aplicación.

Si esto finalmente funciona»La aplicación comienza antes que la base de datos.”Comparte tu problema con cualquiera que todavía tenga sueño 30 en el script de inicio.

3. Utilice perfiles para ejecutar servicios opcionales bajo demanda

Una vez que la pila principal se lanzó con éxito, la siguiente pregunta son los servicios opcionales. Por ejemplo, es posible que necesite administrador Útil para solucionar problemas de bases de datos, pero no hay razón para ejecutar siempre su interfaz web.

Abierto compose.yaml Y agregue los siguientes servicios en Servicios:

# /home/tecmint/webapp/compose.yaml
  adminer:
    image: adminer
    ports:
      - "8081:8080"
    profiles: ["debug"]

Asignación de configuración de perfil administrador para depurar perfiles, por lo que Compose omite los servicios asignados a perfiles inactivos, mientras que los servicios sin perfiles siempre se inician.

Entonces el inicio normal se irá administrador detener:

docker compose up -d

Cuando necesite la interfaz de administración de bases de datos, habilite el perfil:

docker compose --profile debug up -d

También puede habilitar el archivo de configuración COMPOSE_PROFILES Variables ambientales. Por ejemplo, agregue lo siguiente a .env Habilite perfiles de depuración sin indicadores de línea de comando:

COMPOSE_PROFILES=debug

Esto mantiene las herramientas de solución de problemas ocasionales alejadas de su pila normal y al mismo tiempo las pone a disposición mediante un solo comando.

4. Utilice include para dividir archivos de redacción grandes

ascompose.yaml A medida que crece, mantener cada servicio en un archivo se vuelve más difícil de navegar, por lo que el elemento de inclusión le permite dividir los servicios relacionados en archivos Compose separados mientras los mantiene como parte del mismo proyecto.

Crear un db directorio y un nuevo archivo de redacción. existir ubuntu y Durban:

mkdir -p db && nano db/compose.yaml

existir LokiLinux, AlmaLinuxy RHEL:

mkdir -p db && vi db/compose.yaml

Mueva el servicio de base de datos del ejemplo anterior a este archivo:

# /home/tecmint/webapp/db/compose.yaml
services:
  db:
    image: postgres:17
    env_file: db.env
    volumes:
      - ./data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      retries: 10

Las rutas dentro de los archivos Compose incluidos se resuelven en relación con ese archivo. entonces, db.env y ./data referirse a /home/tecmint/webapp/db/db.env y /home/tecmint/webapp/db/data/.

Ahora agregue el siguiente contenido al archivo principal. compose.yaml y borrar su viejo db Atender:

# /home/tecmint/webapp/compose.yaml
include:
  - db/compose.yaml

tu existente depends_on La configuración puede continuar consultando el archivo adjunto. db Atender:

depends_on: db: condition: service_healthy

Compose combina la configuración incluida en el modelo del proyecto, por lo que web Aún se puede confiar en los servicios db Aunque los dos servicios están definidos en archivos diferentes.

Después de realizar los cambios, verifique la configuración resultante:

docker compose config

Si accidentalmente guardas otro db Si los servicios tienen el mismo nombre a nivel de proyecto, Compose informa un conflicto en lugar de elegir una configuración de forma silenciosa.

Si su archivo de redacción se reduce a la mitad, compártalo con sus compañeros de equipo que se desplazan por 400 filas. compose.yamyo todos los días.

5. Utilice development.watch para sincronizar el código con el contenedor en tiempo real.

Dividir los perfiles de Compose puede mantener los proyectos organizados, pero el desarrollo aún puede volverse repetitivo si tiene que reconstruir la imagen web después de cada cambio de código.

Compose Watch Los cambios nativos se pueden sincronizar directamente en contenedores en ejecución. Abierto compose.yaml y agregue la sección de desarrollo a web Atender:

# /home/tecmint/webapp/compose.yaml
    develop:
      watch:
        - action: sync
          path: ./app
          target: /app
          ignore:
            - __pycache__/
        - action: rebuild
          path: requirements.txt

Estas dos acciones de vigilancia tienen diferentes propósitos:

  • action: sync Copiar cambios de ./app Ingresar /app No es necesario reconstruir la imagen.
  • ignore excluir Pitón Sincronización de caché de código de bytes.
  • action: rebuild Al reconstruir la imagen. requirements.txt Cambie, asegurándose de instalar las dependencias recién agregadas.

Guarde el archivo e inicie Compose Watch:

docker compose watch

Compose Watch Adecuado para flujos de trabajo de desarrollo, así que mantenga esta configuración en la computadora donde está modificando activamente el código fuente de la aplicación.

6. Utilice !reset y !override para eliminar valores heredados

Las implementaciones de producción normalmente colocan un segundo archivo Compose encima de la configuración base. Sin embargo, Compose suele fusionar valores de varios archivos. Por ejemplo, agregar otra entrada de puerto no elimina el puerto publicado por el archivo base.

Redactar proporciona !reset y !override Las etiquetas YAML controlan explícitamente este comportamiento.

Crear archivos de cobertura de producción. existir Ubuntu y Debian:

nano compose.prod.yaml

o con vi existir LokiLinux, AlmaLinuxy RHEL:

vi compose.prod.yaml

Agregue la siguiente configuración:

# /home/tecmint/webapp/compose.prod.yaml
services:
  web:
    ports: !override
      - "127.0.0.1:8080:8000"
  adminer:
    ports: !reset []

Estas etiquetas se comportan de manera diferente:

  • !override Reemplaza completamente el valor en el archivo de redacción base. Publicado aquí sólo en la web. 127.0.0.1:8080en lugar de fusionar el puerto de producción con el puerto existente.
  • !reset [] Eliminar valores heredados. Aquí, el puerto de publicación del administrador se borra para que el servicio no quede expuesto a través del puerto del host en producción.

Guarde el archivo y verifique la configuración combinada:

docker compose -f compose.yaml -f compose.prod.yaml config

abajo webBuscando host_ip: 127.0.0.1. este adminer El servicio ya no debería haber publicado entradas de puertos.

Notas de la versión: este !reset y !override Etiqueta requerida Docker Compose v2.24.4 o más nuevo. Si utiliza estas funciones, actualice los requisitos de la versión anterior en esta guía. v2.24 llegar v2.24.4+.

Si alguna vez te has preguntado por qué»Eliminado” Los puertos siguen apareciendo en producción; compártalos con su equipo de operaciones.

7. Incrustar archivos de configuración en línea con el contenido de configuración.

desde web Ahora, escuchando solo en la máquina local, la pila requiere un proxy inverso para aceptar solicitudes externas. El elemento de configuración de nivel superior de Docker Compose le permite mantener su configuración de Nginx directamente dentro de él compose.yaml En lugar de mantener perfiles separados.

Abierto compose.yaml Y agregue la siguiente configuración:

# /home/tecmint/webapp/compose.yaml
configs:
  nginx_conf:
    content: |
      server {
        listen 80;
        location / {
          proxy_pass 
          proxy_set_header Host $$host;
        }
      }

services:
  proxy:
    image: nginx:stable
    ports:
      - "80:80"
    configs:
      - source: nginx_conf
        target: /etc/nginx/conf.d/default.conf

La configuración funciona de la siguiente manera:

  • content Almacene la configuración de Nginx directamente en archivos de Compose. Cuando se inicia el servicio, Compose lo pone a disposición del contenedor.
  • source Hace referencia a la configuración de Compose nombrada y el destino especifica dónde aparece en el contenedor.
  • proxy_pass Reenviar solicitudes entrantes de Nginx a web atender puerto 8000.

Hay un detalle importante en la configuración de Nginx. Compose realiza una interpolación variable dentro del contenido, por lo que $host Se interpretará como una variable de composición. escríbelo como $$host Escapa del signo del dólar y pasa. $host No hay cambios en Nginx.

No $$Compose puede advertir que el host no está configurado y reemplazarlo con un valor nulo, lo que hace que la configuración de Nginx no sea válida o sea incorrecta.

Consejos para utilizar estas funciones de Docker Compose de forma segura

Cuando varios archivos Compose participan en la configuración final del proyecto, ejecute la configuración de Docker Compose antes de la implementación. Valida la configuración y muestra el modelo que utilizará Compose, lo que facilita la detección de fusiones o anulaciones inesperadas.

Sin embargo, tenga en cuenta su resultado: las variables de entorno analizadas pueden aparecer en texto sin formato. Si el resultado completo contiene contraseñas, claves API u otros secretos, nunca lo publique en una edición pública, publicación en un foro o ticket de soporte.

Proteja el archivo de entorno que contiene las credenciales:

chmod 600 .env db/db.env

también agregarlos a .gitignore Para que no cometan accidentalmente:

.env
db/db.env

Para compilaciones más rápidas, mantenga los archivos innecesarios fuera del contexto de compilación de Docker .dockerignore. Como mínimo, considere excluir los directorios de metadatos de Git y de datos de PostgreSQL:

.git
db/data

Esto reduce la cantidad de datos que Docker tiene que enviar como contexto de compilación y puede acelerar las reconstrucciones.

en conclusión

Estas siete funciones de Compose resuelven problemas comunes sin requerir herramientas adicionales:

  • YAML anchors y x- fields Reduzca las configuraciones de servicios duplicadas.
  • Healthchecks y service_healthy Impide que un servicio se inicie antes de que sus dependencias estén listas.
  • Profiles Mantenga los servicios opcionales fuera de la pila predeterminada.
  • include Divida grandes proyectos de Compose en archivos manejables.
  • Compose Watch Sincronice los cambios de código durante el desarrollo.
  • !reset y !override Le brinda un control preciso al superponer archivos de Compose.
  • configs.content Guarde directamente el pequeño archivo de configuración en él. compose.yaml.

Juntas, estas características hacen que los proyectos de Compose sean más fáciles de mantener, más seguros de implementar y más rápidos de usar durante el desarrollo.

Si utiliza otras funciones de Compose para mantener sus proyectos ordenados o evitar problemas de implementación comunes, compártalas en los comentarios.

Si este artículo fue útil, Con alguien de tu equipo.

Boletín semanal de TechMint

conseguir Aprenda el curso intensivo de 7 días de Linux Únase a más de 34.000 profesionales de Linux que leen gratis todos los jueves.

Revise su correo electrónico para ver el enlace mágico para comenzar.

Algo salió mal. Por favor inténtalo de nuevo.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba