Services, networks y volumes en Compose | Nicolás Garzón
networks
volumes
Texto
Copiar service → cómo se ejecuta un proceso
network → con quién puede comunicarse
volume → qué datos sobreviven a la instanciaUn diseño claro evita el anti-patrón de “todos los services en una sola red con todos los datos montados”. Cada relación debe existir por una necesidad concreta.
Un service describe una unidad lógica:
YAML
Copiar services :
api :
image : registry.example.com/api@sha256: ...
command : [ "node" , "dist/server.js" ]
environment :
PORT : "3000"
networks : [ backend, data]
image o build;
command/entrypoint;
environment;
healthcheck;
mounts;
networks;
ports;
resources;
restart policy;
labels;
dependencies.
El service name funciona como identidad DNS dentro de networks compartidas.
Aunque el nombre concreto cambie, otros services conectan a api.
YAML
Copiar container_name : api
crea un nombre global;
produce colisiones entre proyectos;
dificulta varias copias;
impide escalado normal;
acopla scripts a una instancia.
Bash
Copiar docker compose exec api .. .
docker compose logs apiYAML
Copiar services :
proxy :
networks : [ public, backend]
api :
networks : [ backend, data]
worker :
networks : [ data, queue]
db :
networks : [ data]
redis :
networks : [ queue]
networks :
public :
backend :
internal : true
data :
internal : true
queue :
internal : true Esta topología expresa flujo:
proxy no llega a database;
database no está en public;
worker no recibe tráfico web;
API accede solo a dependencies necesarias.
Una network no reemplaza auth; limita alcance.
Si no declaras networks, Compose crea una default network del proyecto y conecta services.
Es útil para aplicaciones simples, pero en sistemas con distintos niveles de confianza conviene modelar relaciones explícitas.
No declares diez networks si todas contienen los mismos services. El diseño debe aportar aislamiento real.
YAML
Copiar services :
db :
networks :
data :
aliases :
- postgres
- databaseÚtiles para compatibilidad o migración. Mantén un nombre canónico y retira aliases temporales.
YAML
Copiar networks :
edge :
external : true Compose espera que exista. Su lifecycle pertenece a otro sistema o proyecto.
reverse proxy compartido;
network creada por plataforma;
integración entre stacks.
acoplamiento entre proyectos;
permisos y naming global;
eliminación externa;
exposición accidental a otros services.
Documenta owner y procedimiento de creación.
YAML
Copiar services :
db :
volumes :
- db- data: /var/lib/postgresql/data
volumes :
db- data: Compose crea un named volume con prefijo del proyecto.
Texto
Copiar project_db-dataCambiar project name crea otro volume. Esto explica “mis datos desaparecieron” cuando en realidad se conectó un recurso diferente.
YAML
Copiar services :
api :
volumes :
- type : volume
source : uploads
target : /app/uploads
read_only : false
- type : bind
source : ./config.yaml
target : /app/config.yaml
read_only : true
- type : tmpfs
target : /tmp
tmpfs :
size : 67108864 La sintaxis larga hace visible tipo, lifecycle y permisos.
YAML
Copiar volumes :
db-data :
external : true Compose no lo crea ni elimina con down -v. Debe existir.
infraestructura administra storage;
varios deployments necesitan una identidad estable;
el volume debe sobrevivir al proyecto.
No lo uses para compartir arbitrariamente una database entre stacks.
YAML
Copiar volumes :
db-data :
labels :
com.nicoo.owner : platform
com.nicoo.purpose : postgresYAML
Copiar networks :
backend :
labels :
com.nicoo.environment : developmentLabels ayudan a inventario y limpieza. No son autorización.
YAML
Copiar services :
api :
read_only : true
tmpfs :
- /tmp: size=64m, noexec, nosuid
volumes :
- uploads: /app/uploadsDiseña paths escribibles mínimos.
Para volumes, el usuario del container debe tener UID/GID compatibles. Compose no corrige ownership automáticamente.
depends_on expresa relación de arranque; networks expresan reachability. Un service puede depender lógicamente de otro pero no compartir network por error.
A la inversa, compartir network no implica que deba iniciar antes.
Bash
Copiar docker compose up -d --scale worker = 3 Cada réplica comparte service name mediante DNS y puede recibir múltiples direcciones.
consumers idempotentes;
no usar host port fijo por réplica;
no usar container_name;
storage no exclusivo accidentalmente;
coordinación de jobs.
Un named volume compartido entre réplicas no garantiza que el workload soporte concurrencia.
YAML
Copiar services :
proxy :
image : caddy: 2
ports :
- "80:80"
- "443:443"
networks : [ edge, backend]
volumes :
- proxy- data: /data
api :
image : registry.example.com/api@sha256: ...
environment :
DATABASE_HOST : db
REDIS_HOST : redis
networks : [ backend, data, queue]
read_only : true
tmpfs :
- /tmp: size=64m, noexec, nosuid
worker :
image : registry.example.com/api@sha256: ...
command : [ "node" , "dist/worker.js" ]
networks : [ data, queue]
db :
image : postgres: 17
networks : [ data]
volumes :
- db- data: /var/lib/postgresql/data
redis :
image : redis: 8
networks : [ queue]
volumes :
proxy-data :
db-data :
networks :
edge :
backend :
internal : true
data :
internal : true
queue :
internal : true Bash
Copiar docker compose down -v Elimina named volumes del proyecto. Antes:
confirma project name;
lista volumes;
verifica backups;
distingue entorno efímero de datos reales.
Bash
Copiar docker compose config --volumes
docker compose config --networks Las opciones disponibles dependen de versión; docker compose config siempre es la referencia para el modelo resuelto.
comparten network;
nombre correcto;
container creado;
DNS del proyecto.
project name cambió;
source del mount cambió;
volume external distinto;
down -v;
path destino incorrecto.
UID/GID;
read-only;
bind host;
SELinux;
rootless.
Quita host port fijo o introduce proxy/load balancer.
Amplía reachability y oculta arquitectura.
Rompe escalado y múltiples proyectos.
Los despliegues fallan o se elimina el recurso fuera de Compose.
Puede producir corrupción o acoplamiento.
Crea recursos duplicados y datos “perdidos”.
Service es identidad lógica; container es instancia.
Networks modelan comunicación mínima.
Volumes modelan lifecycle de datos.
Project name participa en nombres reales.
External significa lifecycle administrado fuera de Compose.
Escalado exige eliminar nombres y puertos exclusivos.
Comprueba lo aprendido
Diseña networks mínimas para proxy, API, worker, Redis y PostgreSQL.
¿Por qué container_name impide escalar normalmente?
¿Qué significa realmente external: true?
¿Cómo diagnosticarías datos ausentes después de cambiar de directorio?
¿Cuándo es peligroso compartir un volume entre réplicas?
Healthchecks, readiness y depends_on , donde se diferencia un proceso iniciado de un servicio capaz de atender tráfico.