При работе с Docker у вас есть два способа хранения данных: bind-монтирование (bind mount) и Docker Volume. Оба позволяют контейнерам сохранять данные между перезапусками, но работают по-разному. В этой статье мы разберем их отличия, плюсы и минусы, а также рассмотрим, как изменить директорию для хранения Docker Volume.
Bind-монтирование (bind mount)
Bind-монтирование позволяет контейнеру использовать существующую директорию на хосте. Вы указываете полный путь к папке на хосте, и контейнер получает доступ к файлам внутри неё.
Синтаксис в docker-compose.yml:
services:
  my-app:
    image: my-app:latest
    volumes:
      - /var/log/my-app:/app/logs  # прямой путь к директории на хосте
Как это работает?
	- Логи приложения будут записываться в /var/log/my-appна хосте.
- Контейнер может читать и записывать файлы в этой директории.
- Все изменения в контейнере сразу отражаются на хосте.
- Данные останутся после перезапуска/удаления контейнера.
- Позволяет редактировать файлы прямо на хосте.
Например, если вы хотите, чтобы ваш nginx внутри docker-контейнера читал статические файлы прямо с директории на хосте, лучше использовать bind-монтирование:
  nginx:
    container_name: "my-nginx"
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./static:/usr/share/nginx/html/static:ro
В нашем случае, static нужен только для раздачи файлов. Флаг :ro делает директорию доступной только для чтения, исключая любые записи от nginx.
 
Docker Volume
Docker Volume — это управляемое хранилище, которое Docker создает автоматически. В отличие от bind-монтирования, volumes хранятся внутри Docker и не привязаны к конкретному пути на хосте. 
Синтаксис в docker-compose.yml:
services:
  my-app:
    image: my-app:latest
    volumes:
      - logs-volume:/app/logs  # используем Volume
volumes:
  logs-volume:  # описание тома
Отметим, что если в секции volumes не указан явный том (в нашем случае,  logs-volume), Docker автометически создаст анонимный том, которым сложнее управлять:
services:
  my-app:
    volumes:
      - /app/logs
При перезапуске контейнера этот том может быть пересоздан, что приведёт к потере данных.
Как это работает?
 
Ключевые отличия между Docker Volume и Bind-монтированием
	
		
			| Особенность | Docker Volume | Bind-монтирование | 
	
	
		
			| Где хранятся данные? | В /var/lib/docker/volumes/...(управляется Docker) | В конкретной папке на хосте, указанной пользователем | 
		
			| Управление через Docker CLI | docker volume create,docker volume ls,docker volume inspect | Docker не управляет этими файлами | 
		
			| Доступность на разных ОС | Работает на всех системах одинаково | На Windows и Mac может требовать настройки (разные пути) | 
		
			| Изоляция данных | Доступен только через Docker | Данные сразу доступны на хосте | 
		
			| Производительность (на Linux) | Выше, так как данные хранятся в Docker-оптимизированном месте | Чуть медленнее, так как идёт работа с файловой системой хоста | 
		
			| Производительность (на Mac/Windows) | Медленнее, так как использует виртуализацию | Быстрее, потому что bind-монтирование работает напрямую | 
		
			| Легко ли сделать бэкап? | Да ( docker volume export) | Нет. Нужно вручную копировать файлы | 
		
			| Удаление данных | Данные остаются, даже если контейнер удалён | Данные остаются, если папка на хосте не удалена | 
		
			| Гибкость | Контролируется через Docker, подходит для контейнеризированных данных | Позволяет использовать уже существующие файлы и папки | 
	
 
Когда что использовать?
Используйте bind-монтирование, если:
	- Нужно работать с файлами прямо на хосте, вне Docker (например, разработка и деплой).
- Нужно монтировать конфигурационные файлы или статику (nginx,nginx.conf).
- Файлы уже есть на хосте, и они не должны храниться в Docker.
Используйте Docker Volume, если:
	- Нужно долговременное хранение данных в Docker.
- Данные не нужны на хосте напрямую (например, хранилище БД, MinIO, кэши).
- Вам важна производительность (Docker оптимизирует работу с томами).
- Нужно разделять данные между несколькими контейнерами (например, БД и бэкап-сервис).
 
Изменяем дефолтную директорию для Docker Volume
По умолчанию Docker хранит тома в /var/lib/docker/volumes/. Большой объем томов быстро заполнит системный раздел диска, что может привести к проблемам недостаточной памяти. Чтобы изменить это, нужно переопределить параметр data-root в файле конфигурации Docker:
1. Создайте новый каталог для хранения данных (например, /mnt/docker-data):
sudo mkdir -p /mnt/docker-data
2. Измените конфигурацию Docker: Откройте или создайте /etc/docker/daemon.json и добавьте:
{
  "data-root": "/mnt/docker-data"
}
3. Перезапустите Docker:
sudo systemctl restart docker
Теперь все новые тома будут храниться в /mnt/docker-data/volumes/ вместо /var/lib/docker/volumes/.