docker: volumes, bind mounts


Manage data in Docker


У докера есть два вариант хранения данных на хостовой тачке для контейнеров:volumes и bind mounts. Если используется linux, то есть еще вариант tpmfs.

Volumes

хранится в области файловой системы хостовой тачки управляемой докером (в папке /var/lib/docker/volumes/). Данный вид хранения данных самый лучший для докера.

Bind mounts

хранится в любой части файловой системы хостовой тачки и данные могут быть модифицированны кем угодно.

tmpfs

данные хранятся в оперативной памяти хостовой тачки.

Volumes:

Создается и управляется докером. Том создается командой docker volume create, либо том будет создан в процессе создания контейнера или сервиса.
При удалении контейнера, том автоматически не удаляется(если конечно не использовалась спец. опция: docker container rm -v ), поэтому все не используемые тома удаляются командой docker volume prune
Отличие volumes от bind mount, что данный том изолирован от функционала хостовой тачки.
Данные тома можно монтировать единовременно нескольким контейнерам.
Когда монтируется том, то он может быть анонимный или именованным. Разницы между ними нет, кроме того что анонимный том это том с случайно сгенерированным именем.
Помимо всего данные тома могут быть не только локальными, а еще могут располагаться на удаленном сервере или в облаке.

Bind mounts:

Когда используется bind mount то файл или папка хостовой тачки монтируются в контейнер. При монтировании необходимо указать полный путь папки/файла расположенного на хостовой тачке. Если в контейнере не существует точки монтирования, то она создается автоматически при необходимости. Bind mounts позволяет получить доступ к конфиденциальной информации хостовой тачки. Т.е. если что-то не нужное примонтировать в контейнер, то его процессы могут модифицировать данный хостовой тачки.

tmpfs:

Данные не хранятся на диске не хоста не контейнера. Данные доступны только в течении жизни контейнера. Этот способ хранения данных используется для хранения конфиденциальной информации. Например swarm использует tmpfs для монтирования «секретов».

Докер для всех видов томов рекомендует использовать ключ —mount вместо обычного —volume и —tmpfs, т.к. у него более ясный синтаксис.

Пример bind mounts:

1. Создадим файл index.html с содержимым:
It's bind mounts

echo "It's bind mounts" > index.html

2. Создадим контейнер:
docker container run -d --name mynginx --rm --mount type=bind,src=/home/Docker/nginx/index.html,dst=/usr/share/nginx/html/index.html -p 80:80  nginx

В качестве src необходимо указывать именно полный путь до файла/папки.

3. Проверяем - откраем в браузере http://127.0.0.1

Пример Volumes:

1. Создаем том:
docker volume create webvol

2. Проверяем:
docker volume ls
DRIVER              VOLUME NAME
local               webvol

3. Запускаем контейнер:
docker container run --rm -p 80:80 --name mynginx --mount type=volume,src=webvol,dst=/webvol -d nginx
где
type=volume - тип монтирования volume
src=webvol - указываем том созданный командой docker volume create
dst=/webvol - куда монтируется том, данная папка была создана автоматически т.к. ее небыло

4. Проверяем:
docker container exec mynginx ls -alF /webvol
total 8
drwxr-xr-x 2 root root 4096 Jun 21 05:22 ./
drwxr-xr-x 1 root root 4096 Jun 21 05:24 ../


 

Dockerfile VOLUME

В Dockerfile за монтирование томов отвечает опция VOLUME, т.е. будет создаваться анонимный том, аналог команде «docker volume create» (без опций).
Пример:

1. Создаем файл Dockerfile со след. содержимым:
FROM busybox
VOLUME ["/dockervolume"]

2. Собираем образ:
docker image build -t volumetask  .

3. Смотрим какие тома есть в данный момент:
docker volume ls
DRIVER              VOLUME NAME

4. Запускаем контейнер:
docker container run --rm -dit --name volumetask volumetask  sh

5. Проверяем:
docker container exec volumetask ls -alF /dockervolume
total 8
drwxr-xr-x    2 root     root          4096 Jun 21 05:34 ./
drwxr-xr-x    1 root     root          4096 Jun 21 05:34 ../

docker volume ls
DRIVER              VOLUME NAME
local               5902500df17051ae85fb7c7e018602cab57c3d1f6df68fb7ba1a5602c20d16c8


 

Найти инфу какой том куда примонтирован в контейнере можно командой:
docker container inspect ИМЯ/ID_контейнера
смотреть раздел Mounts

docker container inspect volumetask -f {{.Mounts}}
[{volume 5902500df17051ae85fb7c7e018602cab57c3d1f6df68fb7ba1a5602c20d16c8 /var/lib/docker/volumes/5902500df17051ae85fb7c7e018602cab57c3d1f6df68fb7ba1a5602c20d16c8/_data /dockervolume local  true }]


 

Совместное использование одних данных контейнерами

у команды docker container run есть опция --volumes-from ИМЯ/ID_контейнера — позволяющая монтировать папку из одного контейнера в другой контейнер, при этом контейнер источник может быть выключен.
Пример:

1. Создадим контейнер, который будет хранилищем данных и примантируем с хостовой тачки папку в папку /mnt/test контейнера:
docker container run --name datavol -dit --rm -v /home/Docker/test:/mnt/test busybox sh

2. Создадим контейнер и мантируем в него туже самую папку из контейнера хранилища:
docker run -dit --rm --volumes-from datavol --name debian debian bash

3. Проверяем:
На хостовой машине создадим тестовый файл в папке /home/Docker/test
cd /home/Docker/test
touch testfile.txt

Смотрим, что файл доступен в обоих контейнерах:
docker container exec debian ls -alF /mnt/test
total 20
drwxr-xr-x 2 root root 4096 Jun 21 06:20 ./
drwxr-xr-x 1 root root 4096 Jun 21 06:18 ../
-rw-r--r-- 1 root root   16 Jun 21 06:20 testfile

docker container exec datavol ls -alF /mnt/test
total 20
drwxr-xr-x 2 root root 4096 Jun 21 06:20 ./
drwxr-xr-x 1 root root 4096 Jun 21 06:18 ../
-rw-r--r-- 1 root root   16 Jun 21 06:20 testfile

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *