EMZETT.
Войти

Тома и сети 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, Стратегия резервного копирования