services
Define los componentes de la aplicación. Cada clave es un nombre de servicio que se convierte en hostname dentro de la red interna.
Estructura, claves de configuración y comportamiento de red en Docker Compose. Recorra cada sección para ver ejemplos y explicaciones detalladas.
Estructura
Concepto 1 de 10
Documento YAML que describe la aplicación multicontenedor. Compose lo busca automáticamente en el directorio de trabajo actual.
El archivo compose.yml (también aceptado como docker-compose.yml) se ubica habitualmente en la raíz del proyecto. Define los servicios, volúmenes y redes que componen la aplicación.
# Estructura típica del proyectomi-proyecto/├── app/│ ├── main.py│ └── requirements.txt├── Dockerfile├── docker-compose.yml└── .envConcepto 2 de 10
Aplicación Flask + PostgreSQL + Adminer. Ilustra las claves más frecuentes de un archivo Compose.
Seleccione un servicio o un bloque para resaltarlo en el archivo.
Aplicación Flask. Se construye a partir del Dockerfile del proyecto (build: .), publica el puerto 8000, arma DATABASE_URL con variables del .env y depende de db.
Base de datos PostgreSQL. Usa la imagen postgres:16 del registry, recibe sus credenciales como variables de entorno y guarda sus datos en el volumen pgdata. No publica puertos en el host: solo es accesible desde la red interna.
Interfaz web para administrar la base de datos. Usa la imagen adminer del registry, publica el puerto 8080 y depende de db.
Bloque de nivel superior que declara el volumen nombrado pgdata, montado por el servicio db.
compose.ymlservices: web: build: . ports: - "8000:8000" environment: - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} depends_on: - db restart: unless-stopped db: image: postgres:16 environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} volumes: - pgdata:/var/lib/postgresql/data restart: unless-stopped adminer: image: adminer ports: - "8080:8080" depends_on: - db restart: unless-stopped volumes: pgdata:
Concepto 3 de 10
Los bloques de nivel superior que componen la estructura del archivo Compose.
Define los componentes de la aplicación. Cada clave es un nombre de servicio que se convierte en hostname dentro de la red interna.
Declara volúmenes nombrados gestionados por Docker. Existen independientemente del ciclo de vida de los contenedores.
Define redes explícitas. Si no se declara, Compose crea automáticamente una red por defecto para el proyecto.
Claves de configuración
Concepto 4 de 10
Las opciones de configuración más utilizadas al definir un servicio en Compose.
Seleccione una clave para ver su función y resaltar dónde aparece en el ejemplo completo.
Construye la imagen a partir de un Dockerfile en la ruta especificada.
Especifica una imagen preexistente del registry.
Mapea puertos entre el host y el contenedor. Formato "HOST:CONTENEDOR".
Define variables de entorno para el contenedor.
Monta volúmenes nombrados o bind mounts en el contenedor.
Declara dependencias de arranque entre servicios.
Política de reinicio del contenedor (no, always, on-failure, unless-stopped).
compose.ymlservices: web: build: . ports: - "8000:8000" environment: - DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} depends_on: - db restart: unless-stopped db: image: postgres:16 environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} volumes: - pgdata:/var/lib/postgresql/data restart: unless-stopped adminer: image: adminer ports: - "8080:8080" depends_on: - db restart: unless-stopped volumes: pgdata:
Concepto 5 de 10
Dos formas de especificar la imagen de un servicio con propósitos y comportamientos distintos.
Indica cómo construir la imagen a partir del código fuente. build: . usa el directorio actual como contexto y busca el Dockerfile allí. Se emplea en servicios desarrollados como parte del proyecto.
Indica qué imagen debe ejecutar el servicio. Puede provenir de un registry como postgres:16 o corresponder al nombre de una imagen construida localmente.
Concepto 6 de 10
Desacoplan la persistencia de datos del ciclo de vida del contenedor.
services: db: image: postgres:16 volumes: - pgdata:/var/lib/postgresql/data
# Nivel superior: declara el volumen nombradovolumes: pgdata:Compare qué ocurre con los datos de un servicio al eliminar y volver a crear su contenedor, con y sin volumen nombrado.
Contenedor proyecto-app-1
Capa escribible:
Volumen proyecto_datos
Contenido:
Guarde algunos registros y luego elimine y vuelva a crear el contenedor.
Concepto 7 de 10
Compose carga automáticamente las variables del archivo .env ubicado en el mismo directorio.
POSTGRES_USER=adminPOSTGRES_PASSWORD=secretPOSTGRES_DB=myapp# compose.yml — las variables ${...} se resuelven desde .envenvironment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}La interpolación y la precedencia de variables se exploran en detalle en Conceptos 04.
Redes y dependencias
Concepto 8 de 10
Ordena el arranque pero no garantiza disponibilidad funcional del servicio dependiente.
depends_on indica que Compose debe crear primero el servicio del cual otro depende. Sin embargo, un contenedor en ejecución no implica que el servicio interno esté listo para aceptar conexiones.
depends_on: - dbdepends_on: db: condition: service_healthy
# En el servicio db:healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 5s timeout: 3s retries: 5Avance paso a paso para comparar el arranque de web y db con cada forma de depends_on.
db—web—Ejecute docker compose up y avance paso a paso.
Los pasos son ilustrativos: los tiempos reales dependen del equipo y del servicio.
Concepto 9 de 10
Compose crea automáticamente una red por defecto y conecta a ella todos los servicios del proyecto.
mi-proyecto_default (red creada automáticamente)
Accede a db por hostname
Puerto 5432 interno
Accede a db por hostname
Los servicios se comunican usando el nombre del servicio como hostname dentro de la red interna. No es necesario gestionar direcciones IP manualmente.
Concepto 10 de 10
Permiten segmentar la comunicación entre servicios cuando se requiere mayor control.
services: web: networks: - frontend - backend db: networks: - backend adminer: networks: - backend
networks: frontend: backend:web
web, db, adminer
Active o desactive la pertenencia de cada servicio a cada red y observe qué pares pueden comunicarse. Un servicio sin redes explícitas queda conectado a la red default del proyecto.
Autoevaluación
Cinco preguntas rápidas para verificar las ideas clave de la lectura. Cada respuesta incluye una explicación.
0/5 respuestas correctas