Введение
В этом разделе мы разберем работу с постоянными хранилищами данных в экосистеме Docker — томами (volumes). Вы познакомитесь с ключевыми особенностями постоянного хранения данных, научитесь различать внутренние и внешние тома, а также поймете сценарии их эффективного применения.
Управление томами данных
Тома данных являются стандартным механизмом обеспечения сохранности данных в Docker. В этой части мы на практике отработаем базовые операции по управлению томами.
Цель
Ваша задача — создать том данных с именем my-vol с помощью команд docker и добавить в него файл test.txt.
Пример результата
Ниже показано, что именно должно получиться в итоге выполнения этого этапа:
- Создан том данных с именем
my-vol.
labex:~/ $ docker volume ls
DRIVER VOLUME NAME
local jenkins-data
local minikube
local my-vol
- Получено значение
Mountpointиз подробной информации о томе.
[
{
"CreatedAt": "2024-01-20T17:37:33+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
- Выполнен переход в директорию
Mountpointи создан файлtest.txt.
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## pwd
/var/lib/docker/volumes/my-vol/_data
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## ls
test.txt
Требования
Для успешного прохождения этапа вам необходимо:
- Знать, как создать том данных с помощью интерфейса командной строки
docker. - Уметь создавать файлы от имени пользователя
root. - Переключиться на пользователя
rootс помощьюsudo su(при необходимости установите пароль дляrootчерезsudo passwd root).
Создание контейнеров с использованием томов
В этом разделе мы запустим контейнеры, подключив к ним тома Docker, и выполним копирование файлов.
Цель
Вам нужно создать том Docker с именем nginx-vol, запустить контейнер с именем nginx, примонтировать этот том к нему и скопировать файл /home/labex/project/index.html внутрь контейнера.
Пример результата
Пример успешного выполнения задачи:
- Создан том данных
nginx-vol.
labex:~/ $ docker volume ls
DRIVER VOLUME NAME
local jenkins-data
local minikube
local my-vol
local nginx-vol
- Запущен контейнер
nginxна базе образа nginx, в котором директория/usr/share/nginx/htmlпримонтирована к томуnginx-vol.
labex:~/ $ docker ps | grep nginx
c39296aaf39e nginx "/docker-entrypoint.…" 35 seconds ago Up 31 seconds 80/tcp nginx
- Файл
/home/labex/project/index.htmlподготовлен для копирования.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat index.html
hello world
- Файл
/home/labex/project/index.htmlуспешно скопирован в контейнерnginx.
labex:/tmp/ $ docker exec nginx cat /usr/share/nginx/html/index.html
hello world
Требования
Для выполнения этого задания вам потребуется:
- Умение создавать тома данных Docker.
- Навыки запуска контейнеров с параметрами монтирования.
- Знание команд для копирования локальных файлов в работающие контейнеры.
Создание контейнеров с привязкой к хост-пути
Во многих случаях вместо использования абстрактных томов удобнее использовать конкретные директории хост-системы для хранения данных. В этом разделе мы создадим контейнер, используя механизм привязки (bind mount) к локальной папке.
Цель
Ваша задача — создать контейнер, использующий Host Path (путь на хосте), скопировать файл /home/labex/project/nginx.txt в контейнер и убедиться, что изменения синхронизированы между контейнером и хост-системой.
Пример результата
Пример того, что должно получиться:
- В директории
/tmpсоздана папкаnginx.
labex:/tmp/ $ ls | grep nginx
nginx
- Запущен контейнер
nginx-hostна базе образаnginx, который монтирует локальную директорию/tmp/nginxв папку/usr/share/nginx/htmlвнутри контейнера.
labex:/tmp/ $ docker ps | grep nginx-host
6fc2d40e12df nginx "/docker-entrypoint.…" 44 seconds ago Up 43 seconds 80/tcp nginx-host
- Проверка деталей монтирования через
docker inspect.
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/nginx",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
- Файл
/home/labex/project/nginx.txtготов к работе.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat nginx.txt
hello nginx
- Файл скопирован в директорию
/usr/share/nginx/htmlконтейнераnginx-host.
labex:nginx/ $ docker exec nginx-host cat /usr/share/nginx/html/nginx.txt
hello nginx
- Проверка наличия файла
nginx.txtв локальной директории/tmp/nginxна хосте.
labex:nginx/ $ pwd
/tmp/nginx
labex:nginx/ $ cat nginx.txt
hello nginx
Требования
Для прохождения этого этапа вам необходимо:
- Определить путь на хосте (
Host Path), который вы будете использовать. - Уметь проверять доступность файлов внутри контейнера.
- Знать, как запустить контейнер с использованием флага монтирования директории хоста.
- Владеть базовыми командами Linux, такими как
cd,mkdir,touchи т.д.
Обмен данными между контейнерами
В контейнеризированных средах часто возникает необходимость передавать данные из одного контейнера в другой. Существуют различные техники для реализации такого обмена. В этом задании мы изучим, как организовать совместный доступ к данным между контейнерами.
Цель
Ваша задача — реализовать обмен данными между двумя контейнерами. Сначала вы запустите контейнер A, используя Host Path, а затем запустите контейнер B, который будет использовать тома контейнера A, обеспечивая тем самым общую область хранения.
Пример результата
Пример выполнения задачи:
- На хосте создана директория
/tmp/share.
labex:/tmp/ $ ls -ld /tmp/share
drwxr-xr-x 2 labex labex 4096 Jan 20 18:20 /tmp/share
- Создан контейнер
nginx-share(образnginx), к которому примонтирована директория/tmp/shareв путь/usr/share/nginx/html.
labex:/tmp/ $ docker ps | grep nginx-share
216d02d94f39 nginx "/docker-entrypoint.…" 55 seconds ago Up 55 seconds 80/tcp nginx-share
- Создан контейнер
busybox-share(образbusybox), который использует тома контейнераnginx-share.
labex:/tmp/ $ docker ps | grep busy
30bf04aee681 busybox "sh" 43 seconds ago Up 42 seconds busybox-share
- Файл
/home/labex/project/share.txtподготовлен.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat share.txt
hello share
- Файл скопирован в контейнер
nginx-share.
labex:/tmp/ $ docker exec nginx-share cat /usr/share/nginx/html/share.txt
hello share
- Проверка наличия файла
share.txtвнутри контейнераbusybox-share.
labex:/tmp/ $ docker exec busybox-share cat /usr/share/nginx/html/share.txt
hello share
Требования
Для успешного завершения этого испытания вам потребуется:
- Уверенное владение базовыми операциями Docker.
- Навыки работы с CLI Docker для управления жизненным циклом контейнеров.
- Понимание концепции томов данных и способов их совместного использования.
- Умение монтировать тома одного контейнера в другой.
- Знание стандартных команд Linux (
cd,mkdir,catи др.).
Резюме
Поздравляем с успешным завершением испытания! Теперь, когда вы освоили работу с томами данных в Docker, вы готовы к решению более сложных задач по управлению состоянием контейнеризированных приложений. Так держать!



