Docker Data Management
21/02/2018
Docker позволяет иметь персистентное хранилище в виде томов (volume) в противовес эфемерному слою контейнера в рамках слоевой файловой системы. Строго говоря есть еще bind mounts и tmpfs, но они встречаются достаточно редко в повседневной практике. Я лишь отмечу только, что данные volume хранятся в строго определенном месте (/var/lib/docker/volumes/
), данные bind mounts хранятся где угодно на файловой системе, а данные tmpfs располагаются исключительно в памяти. Я буду использовать термины “том” или “volume” здесь как взаимозаменяемые.
Volume можно смонтировать к нескольким контейнерам, что говорит нам о возможности совместного использования одних и тех же данных. Например, я позволяю нескольким Ruby приложениям в разных контейнерах таким образом использовать одно и тоже хранилище гемов. Такой расклад существенно сокращает время на установку гемов при изменениях в Gemfile
, т.к. нет надобности пересобирать новый образ с измененым списком заивсимостей.
Важно отметить:
- Если папка в контейнере, куда монтируется volume, пустая, то она заполнится данными из volume.
- Если папка в контейнере, куда монтируется volume, уже содержит данные, то она будет затенена данными из volume. Никакого слияния данных не произойдет.
В целом тома делятся на именованные (с заранее заданным именем) и анонимные (автогенерируемое уникальное имя). Давайте взглянем, как это выглядит для локального хранилища томов:
$ ls /var/lib/docker/volumes
11a9c0ccd7b4316aef59eee447e834c4c830c7a989df22c511a8028542374878
9bfa9079d8596e0626521c2acf3995f241434da32408712931835093fc1c7529
metadata.db
rubygems-2.4.1
dockercomposeexamplepropject_named_volume
Первые два являются анонимными томамим, а последние два именными, причем самый последний имеет префикс папки проекта с docker-compose.
Вот как выглядят команды монтирования именованого volume:
$ docker run -ti --rm --mount source=named-volume-x,target=/x alpine
и анонимного volume:
$ docker run -ti --rm --mount target=/y alpine
Поддержка томов осуществляется с помощью драйвера (volume driver). Не путайте со storage driver, которые обслуживают эфемерный (верхний) слой файловой системы контейнера. По умолчанию это локальный диск, на котором расположен Docker хост. Но это могут быть и облачные хранилища, и удаленные диски, да и в принципе все что угодно, что может хранить данные.
И на последок, том может быть смонтирован с определенными правами доступа – только на чтение (--mount source=named-volume-x,destination=/x,readonly
), только на запись или на оба дейтсвия.