
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.
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-commonEs un campo de extensión que Compose ignora al crear servicios, por lo que puede usarse para almacenar configuraciones reutilizables.&commonCree 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-sizeymax-fileLimite 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:
testcorrerpg_isreadyinformando el éxito cuando PostgreSQL esté listo para aceptar la conexión.intervalLa base de datos se verifica cada 5 segundos.retriesSe permite un máximo de 10 errores de verificación consecutivos antes de que un contenedor se considere en mal estado.start_periodDé a PostgreSQL 10 segundos para inicializarse antes de que una comprobación de estado fallida cuente para el límite de reintentos.condition: service_healthyLe indica a Compose que inicie la web solo después de una verificación exitosa del estado del repositorio.restart: trueDile a Compose que reinicie las dependenciaswebCuando Compose reinicia explícitamente el serviciodbAtender.
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: syncCopiar cambios de./appIngresar/appNo es necesario reconstruir la imagen.ignoreexcluir Pitón Sincronización de caché de código de bytes.action: rebuildAl reconstruir la imagen.requirements.txtCambie, 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:
!overrideReemplaza 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:
contentAlmacene la configuración de Nginx directamente en archivos de Compose. Cuando se inicia el servicio, Compose lo pone a disposición del contenedor.sourceHace referencia a la configuración de Compose nombrada y el destino especifica dónde aparece en el contenedor.proxy_passReenviar solicitudes entrantes de Nginx awebatender 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 anchorsyx- fieldsReduzca las configuraciones de servicios duplicadas.Healthchecksyservice_healthyImpide que un servicio se inicie antes de que sus dependencias estén listas.ProfilesMantenga los servicios opcionales fuera de la pila predeterminada.includeDivida grandes proyectos de Compose en archivos manejables.Compose WatchSincronice los cambios de código durante el desarrollo.!resety!overrideLe brinda un control preciso al superponer archivos de Compose.configs.contentGuarde 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.









