Docker: volumes и сети

Volumes — механизм постоянного хранения данных для контейнеров; сети (networks) — изолированные каналы связи между контейнерами внутри Docker.

Зачем нужно

Контейнер по умолчанию stateless: при удалении все его данные теряются. Volumes решают эту проблему — данные БД, загруженные файлы, логи сохраняются независимо от жизненного цикла контейнера. Docker-сети позволяют контейнерам общаться по имени (не по IP), что делает конфигурацию предсказуемой.

Где используется

  • PostgreSQL/MySQL в Docker: данные хранятся в named volume
  • Nginx + Node.js: оба контейнера в одной сети, Nginx проксирует на Node
  • Разработка: bind mount проецирует локальный код в контейнер (hot reload)

Основной контент

Типы хранилищ

Тип Где хранится Когда использовать
Named volume Управляется Docker (/var/lib/docker/volumes/) БД, персистентные данные в продакшне
Bind mount Конкретная папка на хосте Разработка — проброс кода
tmpfs Только в RAM Временные файлы, секреты

Named volumes

# Создание volume
docker volume create pgdata

# Использование
docker run -d \
  --name postgres \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  postgres:16

# Просмотр
docker volume ls
docker volume inspect pgdata

# Удаление
docker volume rm pgdata

Bind mount для разработки

# Монтируем текущую директорию в контейнер
docker run -d \
  --name dev-app \
  -p 3000:3000 \
  -v $(pwd):/app \
  -v /app/node_modules \     # анонимный volume для node_modules (не заменяется хостовым!)
  myapp:dev

Docker-сети

# Создать пользовательскую сеть (bridge)
docker network create mynet

# Запустить контейнеры в одной сети
docker run -d --name db --network mynet postgres:16
docker run -d --name api --network mynet -p 3000:3000 myapp

# Контейнеры обращаются друг к другу по имени:
# api -> postgres://db:5432/mydb

# Просмотр
docker network ls
docker network inspect mynet

В docker-compose (volumes + сети)

services:
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - backend

  api:
    build: .
    volumes:
      - .:/app              # bind mount для разработки
      - /app/node_modules   # изоляция node_modules
    networks:
      - backend
    depends_on:
      - db
    environment:
      DATABASE_URL: postgres://user:pass@db:5432/mydb

volumes:
  pgdata:

networks:
  backend:

Частые ошибки

  • Хранение данных БД без volume: при docker rm всё теряется
  • Bind mount в продакшне вместо named volume: зависит от структуры папок хоста
  • Контейнеры в разных сетях не видят друг друга — забыли явно указать общую сеть
  • Не указывать depends_on — api стартует до готовности БД

Связанные темы

Ресурсы