Обмен данными между контейнерами Docker.

Обмен данными между контейнерами Docker.

О параметре -v. Если первый аргумент после параметра начинается на с «/» «~/» , то в этом случае монтируется каталог хост-системы во внутрь докера: -v /path:/path/in/container — монтируется каталог /path из хост-системы в каталог /path/in/container внутри контейнера. Если слеш не указан, то монтируется том docker во внутрь докера: -v path:/path/in/container — создаётся том path и монтируется в каталог /path/in/container внутри контейнера.

1. Создание независимых томов.

Появившаяся в выпуске Docker 1.9 команда docker volume create позволяет создать том, не связывая его с каким-либо конкретным контейнером. Мы будем использовать эту команду для добавления тома с именем DataVolume1:

# docker volume create --name DataVolume1

Для проверки создаём контейнер на основе Debian 10 и монтируем том DataVolume1 во внутрь контейнера, используя параметр -v:
# docker run -ti --rm -v DataVolume1:/datavolume1 debian:10

При создании контейнера использован интерактивный режим ( параметр -i) и доступ к терминалу ( параметр -t ), поэтому сразу попадаем во внутрь контейнера.

Создадим в каталоге datavolume1 файл Example1.txt:

# echo "Example1" > /datavolume1/Example1.txt

Т.к. при создании использована опция --rm , при выходе из контейнера он самоликвидируется.

Создаём новый контейнер на основе CentOS 7:
# docker run --rm -ti -v DataVolume1:/datavolume1 centos:7

Проверяем наличие ранее созданного файла и его содержимое:
# cat /datavolume1/Example1.txt
Example1

Том можно одновременно подключать к нескольким контейнерам docker (см. пункт 4).

Содержимое томов можно увидеть в хост-системе в каталоге /var/lib/docker/volumes

 

2.Создание тома, который сохраняется при удалении контейнера.

Создаём новый контейнер:

# docker run -ti --name=Container2 -v DataVolume2:/datavolume2 debian:10

При этом создаётся новый том DataVolume2.

Создадим в каталоге datavolume2 файл Example2.txt:

# echo "Example2" > /datavolume2/Example2.txt
# cat /datavolume2/Example2.txt

При выходе из контейнера и его перезапуске подключенный том сохраняется и автоматически подключается:
# docker start -ai Container2

# cat /datavolume2/Example2.txt

Том невозможно удалить пока существует контейнер. Команда удаления выдаст ошибку:

# docker volume rm DataVolume2

Предварительно требуется удалить контейнер, затем можно удалить том.

3. Создание тома из существующего каталога с данными.

В общем случае, независимое создание тома с помощью docker volume create и создание тома при создании контейнера эквивалентны, за одним исключением. Если мы создадим том одновременно с контейнером и предоставим путь к каталогу, содержащему данные в базовом образе, эти данные будут скопированы в том.

В качестве примера создадим контейнер и добавим том данных в /var, каталог, содержащий данные в базовом образе:

# docker run -ti --rm -v DataVolume3:/var debian:10

Все содержимое из каталога /var базового образа копируется в том, и мы можем смонтировать этот том в новом контейнере.
На этот раз вместо того, чтобы полагаться на команду bash базового образа по умолчанию, мы выполним нашу собственную команду ls, которая покажет содержимое тома без входа в оболочку:

# docker run --rm -v DataVolume3:/datavolume3 debian:10 ls datavolume3

Каталог datavolume3 теперь содержит копию содержимого каталога /var базового образа.

 

4. Совместное использование тома несколькими контейнерами Docker.

До сих пор мы прикрепляли объем к одному контейнеру за раз. Часто мы хотим, чтобы несколько контейнеров подключались к одному и тому же объему данных. Это относительно просто сделать, но есть одно важное предостережение: в настоящее время Docker не обрабатывает блокировку файлов. Если вам нужно несколько контейнеров для записи на том, приложения, работающие в этих контейнерах, должны быть сконструированы для записи в общие хранилища данных, чтобы предотвратить повреждение данных.

 

Nicko

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