Введение
Docker — это контейнерная платформа, представляющая собой легкую, виртуализированную, портативную, программно-определяемую стандартизированную среду, которая позволяет программному обеспечению работать изолированно от другого ПО, запущенного на физическом хосте. Docker является определяющим компонентом непрерывной разработки и интеграции (CI/CD) в разработке ПО. Обеспечивая согласованную среду выполнения, Docker гарантирует, что программное обеспечение ведет себя одинаково независимо от физического хоста, на котором оно развернуто. Для подробного обзора экосистемы Docker ознакомьтесь с этой статьей.
Хотя контейнеры Docker являются самодостаточными, иногда им требуется совместный доступ к данным или сохранение данных на диск после остановки контейнера. Данные могут быть в виде баз данных, лог-файлов или пользовательских данных. Такие данные невозможно включить в файл конфигурации образа Docker, но они должны быть доступны для правильной работы вашего приложения. Совместное использование и сохранение данных в контейнерах Docker осуществляется с помощью Docker Volumes. Docker Volumes можно создавать во время создания контейнера или позже и подключать к контейнерам. В этом руководстве мы обсудим четыре различных способа совместного использования данных между контейнерами.
Предварительные требования
- Настройте сервер под управлением Ubuntu 20.04 и создайте пользователя без прав root с привилегиями sudo. Войдите в систему под этим пользователем, чтобы продолжить выполнение следующих шагов.
- Установите Docker — у нас есть руководство по теме Как установить и использовать Docker на Ubuntu, вам необходимо выполнить шаги 1, 2, 3 и 4. Это должно работать для любого дистрибутива Ubuntu.
Обратите внимание, что хотя мы работаем с Ubuntu 20.04, инструкции и команды для Docker будут работать в любой другой операционной системе с установленным Docker и пользователем sudo, добавленным в группу docker, как описано в предварительных требованиях выше.
Шаг 1. Создание независимых томов Docker
Мы начнем с создания независимых томов, которые не связаны ни с одним контейнером Docker. Для этого используется команда docker volume create, которая появилась в Docker версии 1.9. Введите следующую команду, чтобы создать том с именем Step1DataVolume :
|
1 |
docker volume create --name Step1DataVolume |
Вы должны увидеть следующий вывод, указывающий на успешное создание тома:
![]()
Теперь, когда у нас есть независимый том, мы можем создать новый контейнер из официального образа Ubuntu в качестве примера для его использования. Введите следующую команду, чтобы создать контейнер и подключить том:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
В этой команде флаг --rm автоматически удалит контейнер после выхода. Флаг -v используется для указания и монтирования тома. Флаг -v принимает имя тома, двоеточие и абсолютный путь внутри контейнера, где должен появиться том. Имейте в виду, что при выполнении команды, если указанные в пути каталоги не существуют, они будут созданы. Если они уже существуют, смонтированный том скроет существующее содержимое. Что касается флага -ti, то -t дает доступ к терминалу, а -i позволяет нам взаимодействовать с контейнером через терминал.
Находясь внутри контейнера, выполните следующую команду, чтобы записать некоторые данные в том:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
Введите exit и нажмите enter чтобы выйти из контейнера. Как уже объяснялось, контейнер автоматически удаляется при выходе благодаря флагу --rm, однако том все равно останется доступным.
Чтобы убедиться, что том все еще существует, вы можете использовать команду docker volume inspect:
|
1 |
docker volume inspect Step1DataVolume |
Вы должны увидеть следующий вывод:

Далее давайте создадим новый контейнер. Сначала подключим том и проверим, сможем ли мы получить доступ к тексту, созданному в предыдущем контейнере. Введите следующую команду, чтобы создать и запустить контейнер с использованием ubuntu образ:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Внутри контейнера выполните следующую команду, чтобы убедиться, что файл StepOne.txt существует:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Вы должны увидеть похожий вывод:

Затем введите exit и нажмите enter для выхода из контейнера. На этом шаге вы узнали, как управлять сохранением данных с помощью независимых томов Docker и как подключать тома к контейнерам.
Шаг 2. Создание тома Docker, который сохраняет данные при удалении контейнера
На этом шаге мы будем использовать одну команду для создания тома одновременно с созданием контейнера. Затем мы удалим контейнер и подключим этот том к новому контейнеру. Эта команда похожа на ту, которая использовалась на Шаге 1, однако мы добавляем один флаг --name, чтобы указать имя контейнера:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
Находясь внутри контейнера, введите следующую команду, чтобы записать данные в том и убедиться, что они там есть:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
Ниже приведен вывод трех команд:

Затем выйдите из контейнера. При перезапуске контейнера с помощью следующей команды том подключится автоматически:
|
1 |
docker start -ai Step2Container1 |
Внутри контейнера убедитесь, что том смонтирован, проверив существование файла StepTwo.txt с помощью команды:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
Вот вывод:

Теперь вы можете выйти из контейнера. Docker предотвращает удаление тома, на который ссылается другой контейнер. Вы можете попробовать удалить том с помощью команды:
|
1 |
docker volume rm Step2DataVolume |
В выводе вы должны увидеть сообщение об ошибке:
![]()
Давайте удалим контейнер, используя идентификатор контейнера (container id), показанный в выводе, с помощью команды docker rm :
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
Замените выделенный container id на id вашего контейнера, показанный в терминале. Команда удаляет контейнер, но не удаляет созданный нами том. Вы можете просмотреть список доступных томов с помощью команды docker volume ls , чтобы проверить:
|
1 |
docker volume ls |
Вот вывод:

Чтобы удалить контейнер, созданный на Шаге 2, введите следующую команду:
|
1 |
docker volume rm Step2DataVolume |
На этом шаге вы смогли создать том Docker одновременно с созданием контейнера. Давайте посмотрим, как можно создать том из существующего каталога с данными.
Шаг 3. Создание тома Docker из существующего каталога с данными
Если вы хотите скопировать данные в том, вы можете создать том во время создания контейнера и указать путь к каталогу, содержащему данные в базовом образе. В приведенной ниже команде мы создаем контейнер и добавляем том данных в /var, который является каталогом, содержащим данные в базовом образе:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
При запуске команды содержимое каталога /var базового образа будет скопировано в том. Этот том можно подключить к новому контейнеру. Затем выйдите из контейнера:

Введите следующую команду, чтобы создать контейнер, подключить том и вывести список содержимого тома с помощью команды ls :
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
Вы должны увидеть аналогичный вывод команды, который представляет собой копию содержимого каталога /var базового образа, теперь доступного в Step3DataVolume:

Хотя монтирование /var каталога, как мы делали в этом примере, может быть непрактичным, это помогает понять, что вы можете смонтировать любой каталог, созданный в ваших пользовательских образах, в том Docker, чтобы сделать данные доступными для других контейнеров.
Шаг 4. Совместное использование данных несколькими контейнерами Docker
В большинстве случаев вам потребуется, чтобы несколько контейнеров имели доступ к данным из одного тома Docker. В предыдущих примерах мы подключали том только к одному контейнеру. Теперь вы узнаете, как подключить том к нескольким контейнерам. Хотя этого легко добиться, Docker не поддерживает блокировку файлов. Если несколько контейнеров выполняют запись в один и тот же том, вы должны индивидуально спроектировать приложения, работающие в этих контейнерах, для обработки записи в общие хранилища данных во избежание повреждения данных.
- Создайте Step4Container1 и Step4DataVolume
Используйте команду docker run с флагом --name для создания именованного контейнера:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
Внутри контейнера выполните следующую команду, чтобы создать текстовый файл и добавить в него текст:
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
После этого выйдите из контейнера и вернитесь в хост-среду. Теперь мы хотим создать еще один контейнер и смонтировать в него тома из Step4Container1 в него.
- Создайте Step4Container2 и подключите тома из контейнера Step4Container1
Выполните следующую команду, чтобы создать Step4Container2 и смонтировать тома из Step4Container1:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
Внутри контейнера используйте команду cat для проверки сохранности данных:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Вы должны увидеть следующий вывод:

Мы можем добавить еще немного текста в файл из Step4Container2 , введя следующую команду:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
После этого выйдите из контейнера, и мы вернемся в Step4Container1 , чтобы проверить, сохранились ли данные.
- Проверка изменений, внесенных в том Docker, между различными контейнерами
Чтобы просмотреть изменения, сначала перезапустите Step4Container1 с помощью команды:
|
1 |
docker start -ai Step4Container1 |
Проверьте изменения с помощью команды:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Вы должны увидеть вывод, аналогичный скриншоту ниже:

Убедившись, что оба контейнера могут читать и записывать данные в один и тот же том, вы можете выйти из контейнера. Как уже упоминалось, Docker не поддерживает блокировку файлов, поэтому логика вашего приложения, работающего внутри контейнеров, должна обрабатывать доступ на чтение и запись к общим хранилищам данных. Docker позволяет монтировать тома в режиме «только для чтения», чтобы предотвратить случайное повреждение данных контейнерами, которым требуется доступ только для чтения, путем добавления :ro , как показано в следующем примере.
- Монтирование тома в контейнер Docker в режиме «только для чтения»
В этом примере мы создадим контейнер с именем Step4Container3. В команде создания мы монтируем тома из Step4Container1 и добавляем :ro , чтобы указать, что этот контейнер имеет доступ только для чтения, но не может выполнять запись в том. Выполните следующую команду в терминале:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Оказавшись внутри контейнера, вы можете прочитать текстовый файл в томе, введя следующую команду:
|
1 |
cat /Step4DataVolume/StepFour.txt |

Однако, если вы попытаетесь удалить файл с помощью команды:
|
1 |
rm /Step4DataVolume/StepFour.txt |
В терминале появится сообщение об ошибке следующего вида:
![]()
После проверки прав на чтение и запись вы можете выйти из контейнера. Если вы хотите удалить контейнеры и том, созданные в этом руководстве, выполните следующие команды:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
На этом шаге вы узнали, как совместно использовать данные между несколькими контейнерами с помощью томов Docker, а также как монтировать тома данных в контейнеры в режиме только для чтения.
Заключение
В этом руководстве вы создали несколько томов Docker и узнали, как совместно использовать данные между контейнерами Docker. Рассматривая совместное использование данных между контейнерами, мы отметили, что логика отдельного приложения внутри контейнера должна обрабатывать блокировку файлов для предотвращения повреждения данных при записи в общие хранилища данных, поскольку в Docker нет встроенной реализации для обработки блокировки файлов.
Дополнительные ресурсы по использованию Docker вы можете найти в других руководствах в нашем блоге:
- Как совместно использовать данные между контейнером Docker и хостом
- Очистка ресурсов Docker — образов, контейнеров и томов
- Развертывание Laravel, Nginx и MySQL с помощью Docker Compose
- Установка и настройка Docker на CentOS 7
Приятной работы!
Комментарии
Комментариев пока нет. Будьте первым.