Тома и сети Docker: данные и связи для контейнеров
Коротко: Контейнеры эфемерны: тома (volumes) хранят данные постоянно вне контейнера, сети связывают контейнеры друг с другом.
Подробнее: Файловая система контейнера принадлежит его жизненному циклу: при удалении данные в ней пропадают. Для баз данных, загрузок и конфигураций поэтому нужны тома. А чтобы несколько контейнеров (например, веб-приложение и база данных) могли общаться, Docker использует сети.
Подробности
Тома и bind mount
- Том (volume): хранилище, управляемое Docker.
docker run -v data:/var/lib/postgresql/data postgresсоздаёт томdataи подключает его к контейнеру. Он переживает удаление контейнера. - Bind mount: папка хоста монтируется напрямую (
-v $(pwd)/code:/app). Удобно для разработки, так как изменения сразу видны в контейнере. - tmpfs: память в RAM, теряется при остановке.
docker volume ls
docker volume inspect data
docker volume rm data
Сети
Контейнеры в пользовательской bridge-сети обращаются друг к другу по именам контейнеров как по именам хостов:
docker network create appnet
docker run -d --name db --network appnet postgres
docker run -d --name web --network appnet -p 8080:80 my-app
В приложении адрес базы данных тогда db:5432. Только с -p (публикация порта) сервис доступен также с хоста или из интернета; без него он остаётся скрытым в сети, что хорошо для безопасности (не публикуйте базу данных).
Docker Compose
В compose.yaml вы описываете несколько контейнеров вместе с томами и сетями:
services:
web:
build: .
ports: ["8080:3000"]
depends_on: [db]
db:
image: postgres:17
volumes: [dbdata:/var/lib/postgresql/data]
volumes:
dbdata:docker compose up -d запускает всё, docker compose down останавливает (тома остаются, кроме случая с -v).
Примечания
Данные, хранящиеся в томах, нужно резервировать, как любую другую базу данных (резервные копии!). Права между хостом и контейнером (идентификаторы пользователей) — частое препятствие при bind mount. Сетевые режимы вроде host снимают изоляцию. В Kubernetes эти задачи берут на себя PersistentVolume и Service.
См. также: Docker, Dockerfile, Основы Kubernetes, Стратегия резервного копирования