README · by ansango
← Volver al libro

Volúmenes y redes en Docker

Volúmenes Docker para persistencia de datos y redes para comunicación entre contenedores

~2 min de lectura
Resumen

Dos conceptos clave para crear aplicaciones Docker robustas: volúmenes para persistir datos y redes para que los contenedores se comuniquen entre sí por nombre.

Volúmenes

Un volumen es un mecanismo para almacenar datos fuera del contenedor. Sin volúmenes, cuando borras un contenedor, pierdes todos sus datos. Con volúmenes, los datos persisten.

Tipos de volúmenes

1. Named volumes (volúmenes nombrados)

Almacenados en una ubicación gestionada por Docker (típicamente /var/lib/docker/volumes/). Son portátiles y fáciles de gestionar.

docker volume create mi-volumen
docker run -v mi-volumen:/data imagen

El directorio /data dentro del contenedor está vinculado al volumen mi-volumen.

2. Bind mounts (montajes vinculados)

Vinculan una ruta específica del host al contenedor. Útiles en desarrollo.

docker run -v /ruta/del/host:/ruta/contenedor imagen
docker run -v $(pwd):/app imagen  # Directorio actual
Los bind mounts dependen de la estructura del host. No son portátiles entre máquinas. Para producción, usa volúmenes nombrados.

3. tmpfs mounts

Volúmenes en memoria. Se pierden cuando el contenedor se detiene.

docker run --tmpfs /cache imagen
Los tmpfs mounts son ideales para datos temporales o caché que no necesitas persistir.

Comandos de volumen

# Listar volúmenes
docker volume ls

# Crear un volumen
docker volume create mi-volumen

# Inspeccionar un volumen
docker volume inspect mi-volumen

# Eliminar un volumen
docker volume rm mi-volumen

# Eliminar volúmenes sin usar
docker volume prune
Base de datos con persistencia

Aunque elimines el contenedor, los datos persisten en postgres-data:

Redes

Una red Docker permite que los contenedores se comuniquen entre sí por nombre de contenedor (DNS interno).

Tipos de redes

1. bridge (por defecto)

Red aislada donde los contenedores pueden comunicarse por nombre.

docker network create mi-red
docker run -d --name app1 --network mi-red imagen1
docker run -d --name app2 --network mi-red imagen2

# Dentro de app1, ping app2 funciona:
docker exec app1 ping app2

2. host

El contenedor comparte la red del host (sin aislamiento).

docker run --network host imagen
Los contenedores con

--network host pierden el aislamiento de red. Usa solo si realmente necesitas rendimiento de red máximo, y ten cuidado con conflictos de puertos.

3. none

Sin red. El contenedor está aislado.

docker run --network none imagen

Comandos de red

# Listar redes
docker network ls

# Crear una red
docker network create mi-red

# Inspeccionar una red
docker network inspect mi-red

# Conectar un contenedor a una red existente
docker network connect mi-red contenedor-existente

# Desconectar
docker network disconnect mi-red contenedor-existente

# Eliminar una red
docker network rm mi-red
Aplicación + Base de datos

Desde dentro de app, puedes conectar a la base de datos usando el hostname db.

Alias DNS

Puedes dar alias a un contenedor en la red:

docker network connect --alias database app-network db

Ahora dentro de app, puedes usar database como hostname.

Volúmenes y redes en Docker Compose

En Docker Compose, volúmenes y redes se declaran en docker-compose.yml:

version: '3.9'
services:
  app:
    image: mi-app:1.0
    volumes:
      - app-data:/data  # Volumen nombrado
      - ./local:/app/local  # Bind mount
    networks:
      - app-network

  db:
    image: postgres:15
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - app-network

volumes:
  app-data:
  db-data:

networks:
  app-network:
    driver: bridge
Buenas prácticas

Próximos pasos

Referencias