Перейти к содержимому

7. Тома (Volumes)

По умолчанию данные в контейнере существуют только пока контейнер работает. Когда контейнер удаляется, все его данные теряются. Для сохранения данных Docker предоставляет три механизма монтирования.

Управляются Docker Engine. Хранятся в /var/lib/docker/volumes/. Рекомендуются для продакшена.

Окно терминала
# Создать том
docker volume create mydata
# Запустить контейнер с томом
docker run -d \
--name postgres \
-v mydata:/var/lib/postgresql/data \
postgres:15
# Список томов
docker volume ls
# Информация о томе
docker volume inspect mydata
# Удалить том
docker volume rm mydata
# Удалить все неиспользуемые тома
docker volume prune

Монтирует конкретную директорию или файл с хост-машины в контейнер. Идеально для разработки.

Окно терминала
# Монтировать текущую директорию в /app
docker run -d \
-v $(pwd):/app \
-v $(pwd)/config.json:/app/config.json:ro \
node:20-alpine
# Или с флагом --mount (более явный синтаксис)
docker run -d \
--mount type=bind,source=$(pwd),target=/app \
node:20-alpine

Хранится только в памяти RAM. Не записывается на диск. Используется для временных секретных данных.

Окно терминала
# Монтировать tmpfs
docker run -d \
--mount type=tmpfs,target=/tmp \
--mount type=tmpfs,target=/run,tmpfs-size=100m \
myapp
Окно терминала
# -v (краткий синтаксис)
-v myvolume:/data # named volume
-v /host/path:/container/path # bind mount
-v /container/path # anonymous volume
# --mount (подробный синтаксис, предпочтительнее)
--mount type=volume,source=myvolume,target=/data
--mount type=bind,source=/host/path,target=/container/path
--mount type=tmpfs,target=/tmp
version: '3.8'
services:
postgres:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
app:
image: node:20
volumes:
- .:/app # bind mount для разработки
- /app/node_modules # анонимный том для node_modules
volumes:
postgres_data: # именованный том
Окно терминала
# Создать бэкап тома
docker run --rm \
-v mydata:/data \
-v $(pwd):/backup \
alpine tar czf /backup/backup.tar.gz -C /data .
# Восстановить из бэкапа
docker run --rm \
-v mydata:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/backup.tar.gz -C /data
# Скопировать данные между томами
docker run --rm \
-v source_vol:/source \
-v dest_vol:/dest \
alpine cp -a /source/. /dest/

Docker поддерживает подключаемые драйверы для томов:

  • local — стандартный, хранит данные локально
  • nfs — Network File System для распределённых систем
  • overlay — для Docker Swarm
  • aws-ebs — Amazon EBS (через плагин)
  • azure-file — Azure File Storage
Окно терминала
# Создать том с NFS драйвером
docker volume create \
--driver local \
--opt type=nfs \
--opt o=addr=192.168.1.1,rw \
--opt device=:/path/to/dir \
my_nfs_vol