# Тома (volumes)

Тома (volumes) – файлы или каталоги, смонтированные на хосте и не являющиеся частью каскадно-объединенной файловой системы.   
Другие контейнеры могут совместно использовать их, и все изменения будут сразу же фиксироваться в файловой системе хоста.

<span style="background-color: rgb(248, 202, 198);">Устаревшее:</span> В качестве точки монтирования можно определить любой другой каталог хоста в команде 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**

<table border="1" id="bkmrk-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%9F%D0%B0%D1%80" style="border-collapse: collapse; width: 100%; height: 92.2188px;"><colgroup><col style="width: 26.4601%;"></col><col style="width: 73.5399%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Драйвер</td><td class="align-center" style="height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 32.625px;"><td style="height: 32.625px;">local</td><td style="height: 32.625px;">Драйвер по умолчанию. Только точки монтирования, доступные на хосте. </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">И еще штук 30 драйверов, [список драйверов](https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins)</td></tr></tbody></table>

**Управление томами при запуске контейнера из консоли:**

Если тома нет - будет создан

<table border="1" id="bkmrk-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%9F%D0%B0%D1%80-1" style="border-collapse: collapse; width: 100%; height: 398.984px;"><colgroup><col style="width: 22.0479%;"></col><col style="width: 16.8078%;"></col><col style="width: 61.1442%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Основная команда</td><td class="align-center" style="height: 29.7969px;">Параметр</td><td class="align-center" style="height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 103.625px;"><td style="height: 103.625px;">docker run ... --mount</td><td style="height: 103.625px;">type=</td><td style="height: 103.625px;">Тип тома:

- volume
- bind
- tmpfs

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">source(src)=</td><td style="height: 29.7969px;">Имя тома или не указывается для анонимных</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">destination(dst)=</td><td style="height: 29.7969px;">точка монтирования в контейнере</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">volume-driver=</td><td style="height: 29.7969px;">local по умолчанию, локальный том</td></tr><tr style="height: 99.7812px;"><td style="height: 99.7812px;">  
</td><td style="height: 99.7812px;">volume-opt=</td><td style="height: 99.7812px;">опция=значение

```bash
volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>
```

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">  
</td><td style="height: 29.7969px;">readonly</td><td style="height: 29.7969px;">только для чтения</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">docker run ...

\--volumes-from ContID

</td><td style="height: 46.5938px;">  
</td><td style="height: 46.5938px;">связывание с томами контейнера</td></tr></tbody></table>

Пример:

```bash
--mount 'type=volume,src=data-volume,dst=/var/opt/project,volume-driver=local,readonly'
```

Без пробелов после запятых.  
**Создание и управление томами независимо от контейнеров**

<table border="1" id="bkmrk-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%9F%D0%B0%D1%80-2" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 21.6925%;"></col><col style="width: 22.8789%;"></col><col style="width: 55.4287%;"></col></colgroup><thead><tr><td class="align-center">Основная команда</td><td class="align-center">Параметр</td><td class="align-center">Описание</td></tr></thead><tbody><tr><td>docker volume</td><td>create --name my\_volume

create my\_volume

</td><td>Создание тома.

/var/lib/docker/volumes/имя тома/\_data - расположение файлов

По умолчанию на хосте в каталоге установки Docker (обычно каталог /var/lib/docker/). /var/lib/docker/volumes/

</td></tr><tr><td>  
</td><td>ls</td><td>местоположение определенных томов, по имени или ID тома.</td></tr><tr><td>  
</td><td>inspect my\_volume</td><td>информация о томе</td></tr><tr><td>  
</td><td>rm my\_volume</td><td>удаление тома</td></tr><tr><td>  
</td><td>prune</td><td>удаление всех томов, которыми не пользуются контейнерами. Но иногда после удаления контейнера данные не обновляются</td></tr><tr><td>docker system prune</td><td>  
</td><td>очистка ресурсов docker. Потом - повторное удаление томов.</td></tr></tbody></table>

<div id="bkmrk-%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%3A">**Примеры:**</div><div id="bkmrk-%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0">Автоматическое создание том с именем test-data в /var/lib/docker/volumes/test-data/_data</div>```bash
docker run -ti -d --name alpine-container -v test-data:/var/lib/app/content alpine
```

<div id="bkmrk-%D0%9C%D0%BE%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2-%D0%B4%D1%80%D1%83%D0%B3%D1%83">**Монтирование в другую точку.**</div><div id="bkmrk-%D0%9D%D1%83%D0%B6%D0%BD%D0%BE-%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D1%82%D1%8C-%D0%B4%D0%B8%D1%80%D0%B5%D0%BA%D1%82">Нужно создать директорию.</div>```bash
mkdir /home/avimanyu/test-data
docker run -ti -d --name alpine-container -v /home/avimanyu/test-data:/var/lib/app/content alpine
```

<div id="bkmrk-%D0%90%D1%80%D1%85%D0%B8%D0%B2%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D1%82%D0%BE%D0%BC-dat">**Архивировать том datavol в dbdata и восстановить его в том dbdata2 контейнера dbstore2**  
Создание тома datavol в контейнере dbdata  
</div>```bash
docker run -it --mount 'type=volume,src=datavol,dst=/datavol' --name dbstore ubuntu /bin/bash
```

<div id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE-">Создание временного контейнера, примонтирование тома из dbdata, создание тома backup и сохранение архива datavol в backup и удаление временного контейнера  
</div>```bash
docker run --rm --volumes-from dbstore --mount 'type=volume,src=backup,dst=/backup' --name tmpubn ubuntu tar cvf /backup/backup.tar /datavol
```

<div id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D1%82%D0%BE%D0%BC%D0%B0-datavo">Создание тома datavol2 в контейнере dbdata2  
</div>```bash
docker run -it --mount 'type=volume,src=datavol2,dst=/datavol' --name dbstore2 ubuntu /bin/bash
```

<div id="bkmrk-%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B2%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE--1">Создание временного контейнера, примонтирование тома из dbstore2, создание тома backup и сохранение архива datavol в backup и удаление временного контейнера  
</div>```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"
```