7. Тома (Volumes)
По умолчанию данные в контейнере существуют только пока контейнер работает. Когда контейнер удаляется, все его данные теряются. Для сохранения данных Docker предоставляет три механизма монтирования.
Три типа монтирования
Заголовок раздела «Три типа монтирования»1. Named Volumes (именованные тома)
Заголовок раздела «1. Named Volumes (именованные тома)»Управляются 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 prune2. Bind Mounts (монтирование директорий хоста)
Заголовок раздела «2. Bind Mounts (монтирование директорий хоста)»Монтирует конкретную директорию или файл с хост-машины в контейнер. Идеально для разработки.
# Монтировать текущую директорию в /appdocker 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-alpine3. tmpfs Mounts (временное хранилище в памяти)
Заголовок раздела «3. tmpfs Mounts (временное хранилище в памяти)»Хранится только в памяти RAM. Не записывается на диск. Используется для временных секретных данных.
# Монтировать tmpfsdocker run -d \ --mount type=tmpfs,target=/tmp \ --mount type=tmpfs,target=/run,tmpfs-size=100m \ myappСинтаксис -v vs —mount
Заголовок раздела «Синтаксис -v vs —mount»# -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Тома в Docker Compose
Заголовок раздела «Тома в Docker Compose»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