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 стартует до готовности БД