Управление томами Docker

DockerBeginner
Практиковаться сейчас

Введение

В этом разделе мы разберем работу с постоянными хранилищами данных в экосистеме Docker — томами (volumes). Вы познакомитесь с ключевыми особенностями постоянного хранения данных, научитесь различать внутренние и внешние тома, а также поймете сценарии их эффективного применения.

Управление томами данных

Тома данных являются стандартным механизмом обеспечения сохранности данных в Docker. В этой части мы на практике отработаем базовые операции по управлению томами.

Цель

Ваша задача — создать том данных с именем my-vol с помощью команд docker и добавить в него файл test.txt.

Пример результата

Ниже показано, что именно должно получиться в итоге выполнения этого этапа:

  1. Создан том данных с именем my-vol.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
  1. Получено значение 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"
  }
]
  1. Выполнен переход в директорию 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 внутрь контейнера.

Пример результата

Пример успешного выполнения задачи:

  1. Создан том данных nginx-vol.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
local     nginx-vol
  1. Запущен контейнер 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
  1. Файл /home/labex/project/index.html подготовлен для копирования.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat index.html
hello world
  1. Файл /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 в контейнер и убедиться, что изменения синхронизированы между контейнером и хост-системой.

Пример результата

Пример того, что должно получиться:

  1. В директории /tmp создана папка nginx.
labex:/tmp/ $ ls | grep nginx
nginx
  1. Запущен контейнер 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
  1. Проверка деталей монтирования через docker inspect.
"Mounts": [
   {
         "Type": "bind",
         "Source": "/tmp/nginx",
         "Destination": "/usr/share/nginx/html",
         "Mode": "",
         "RW": true,
         "Propagation": "rprivate"
   }
],
  1. Файл /home/labex/project/nginx.txt готов к работе.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat nginx.txt
hello nginx
  1. Файл скопирован в директорию /usr/share/nginx/html контейнера nginx-host.
labex:nginx/ $ docker exec nginx-host cat /usr/share/nginx/html/nginx.txt
hello nginx
  1. Проверка наличия файла 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, обеспечивая тем самым общую область хранения.

Пример результата

Пример выполнения задачи:

  1. На хосте создана директория /tmp/share.
labex:/tmp/ $ ls -ld /tmp/share
drwxr-xr-x 2 labex labex 4096 Jan 20 18:20 /tmp/share
  1. Создан контейнер 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
  1. Создан контейнер busybox-share (образ busybox), который использует тома контейнера nginx-share.
labex:/tmp/ $ docker ps | grep busy
30bf04aee681   busybox   "sh"                     43 seconds ago   Up 42 seconds             busybox-share
  1. Файл /home/labex/project/share.txt подготовлен.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat share.txt
hello share
  1. Файл скопирован в контейнер nginx-share.
labex:/tmp/ $ docker exec nginx-share cat /usr/share/nginx/html/share.txt
hello share
  1. Проверка наличия файла 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, вы готовы к решению более сложных задач по управлению состоянием контейнеризированных приложений. Так держать!

✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться✨ Проверить решение и практиковаться