# Тома (volumes)
Тома (volumes) – файлы или каталоги, смонтированные на хосте и не являющиеся частью каскадно-объединенной файловой системы.
Другие контейнеры могут совместно использовать их, и все изменения будут сразу же фиксироваться в файловой системе хоста.
Устаревшее: В качестве точки монтирования можно определить любой другой каталог хоста в команде docker run (например, docker run -d -v /host/dir:/container/dir test/web-server).
В Dockerfile bind mounts не работает - а это и не надо делать, т к это определяется при старте образа/через compose.
Способы хранения данных:
1. Временное (удаляется при остановке контейнера)
1. по умолчанию изолировано на диске
2. tmpfs в оперативной памяти
2. Постоянное
1. обычные тома Docker
2. bind mounts - прямое монтирование папки в контейнер
**Драйвера volumes**
Драйвер | Описание |
local | Драйвер по умолчанию. Только точки монтирования, доступные на хосте. |
| И еще штук 30 драйверов, [список драйверов](https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins) |
**Управление томами при запуске контейнера из консоли:**
Если тома нет - будет создан
Основная команда | Параметр | Описание |
docker run ... --mount | type= | Тип тома:
- volume
- bind
- tmpfs
|
| source(src)= | Имя тома или не указывается для анонимных |
| destination(dst)= | точка монтирования в контейнере |
| volume-driver= | local по умолчанию, локальный том |
| volume-opt= | опция=значение
```bash
volume-opt=type=nfs,volume-opt=device=:
```
|
| readonly | только для чтения |
docker run ...
\--volumes-from ContID
|
| связывание с томами контейнера |
Пример:
```bash
--mount 'type=volume,src=data-volume,dst=/var/opt/project,volume-driver=local,readonly'
```
Без пробелов после запятых.
**Создание и управление томами независимо от контейнеров**
Основная команда | Параметр | Описание |
docker volume | create --name my\_volume
create my\_volume
| Создание тома.
/var/lib/docker/volumes/имя тома/\_data - расположение файлов
По умолчанию на хосте в каталоге установки Docker (обычно каталог /var/lib/docker/). /var/lib/docker/volumes/
|
| ls | местоположение определенных томов, по имени или ID тома. |
| inspect my\_volume | информация о томе |
| rm my\_volume | удаление тома |
| prune | удаление всех томов, которыми не пользуются контейнерами. Но иногда после удаления контейнера данные не обновляются |
docker system prune |
| очистка ресурсов docker. Потом - повторное удаление томов. |
**Примеры:**
Автоматическое создание том с именем test-data в /var/lib/docker/volumes/test-data/_data
```bash
docker run -ti -d --name alpine-container -v test-data:/var/lib/app/content alpine
```
**Монтирование в другую точку.**
Нужно создать директорию.
```bash
mkdir /home/avimanyu/test-data
docker run -ti -d --name alpine-container -v /home/avimanyu/test-data:/var/lib/app/content alpine
```
**Архивировать том datavol в dbdata и восстановить его в том dbdata2 контейнера dbstore2**
Создание тома datavol в контейнере dbdata
```bash
docker run -it --mount 'type=volume,src=datavol,dst=/datavol' --name dbstore ubuntu /bin/bash
```
Создание временного контейнера, примонтирование тома из dbdata, создание тома backup и сохранение архива datavol в backup и удаление временного контейнера
```bash
docker run --rm --volumes-from dbstore --mount 'type=volume,src=backup,dst=/backup' --name tmpubn ubuntu tar cvf /backup/backup.tar /datavol
```
Создание тома datavol2 в контейнере dbdata2
```bash
docker run -it --mount 'type=volume,src=datavol2,dst=/datavol' --name dbstore2 ubuntu /bin/bash
```
Создание временного контейнера, примонтирование тома из dbstore2, создание тома backup и сохранение архива datavol в backup и удаление временного контейнера
```bash
docker run --rm --volumes-from dbstore2 --mount 'type=volume,src=backup,dst=/backup' ubuntu bash -c "cd /datavol && tar xvf /backup/backup.tar --strip 1"
```