Postgres con Docker Compose
Por qué Compose en vez del docker run largo
Sección titulada «Por qué Compose en vez del docker run largo»El comando de Levantar Postgres con docker run funciona, pero hay que recordarlo (o guardarlo en algún lado) cada vez. Con Compose, la definición vive versionada junto al proyecto — cualquiera que clona el repo levanta la misma base de datos con un solo comando.
Setup completo
Sección titulada «Setup completo»services: db: image: postgres:16 restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} ports: - "5432:5432" volumes: - datos-postgres:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 5s timeout: 3s retries: 5
volumes: datos-postgres:POSTGRES_USER=userPOSTGRES_PASSWORD=secretoPOSTGRES_DB=miapp.env(ver Variables con Compose para por qué el .env va aparte y en .gitignore)
Levantar
Sección titulada «Levantar»docker compose up -d dbCon db al final se levanta solo ese servicio — útil si el docker-compose.yml del proyecto tiene además la app y no se la quiere levantar todavía.
restart: unless-stopped
Sección titulada «restart: unless-stopped»restart: unless-stoppedHace que el contenedor se reinicie automáticamente si se cae o si la máquina/Docker Desktop se reinicia — cómodo para un servicio de base de datos que se espera tener corriendo de fondo todo el tiempo mientras se trabaja, sin tener que acordarse de levantarlo a mano después de cada reinicio.
Cuando la app también está en el mismo Compose
Sección titulada «Cuando la app también está en el mismo Compose»services: app: build: . environment: DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} depends_on: db: condition: service_healthy db: # ... igual que arribaNotar @db:5432 (no @localhost:5432) — desde adentro de otro contenedor en la misma red de Compose, el hostname es el nombre del servicio, no localhost (ver Redes). localhost:5432 sí es correcto al conectarse desde afuera de Docker (un cliente en tu máquina — ver la próxima guía).
Consideraciones
Sección titulada «Consideraciones»- Si el proyecto ya tiene la app corriendo nativa (sin Docker) y solo se quiere Postgres en contenedor, mantener
dben su propiodocker-compose.ymlseparado es un patrón perfectamente válido — no hace falta meter todo el proyecto en Compose para aprovechar esto. restart: unless-stoppedsignifica que undocker stop dbmanual sí lo deja detenido (no lo revive solo) — pero un reinicio de Docker Desktop o de la máquina sí lo vuelve a levantar.