Работа с томами Docker (Volumes)

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/run -.-> lab-389189{{"Работа с томами Docker (Volumes)"}} docker/ls -.-> lab-389189{{"Работа с томами Docker (Volumes)"}} docker/stop -.-> lab-389189{{"Работа с томами Docker (Volumes)"}} docker/rm -.-> lab-389189{{"Работа с томами Docker (Volumes)"}} docker/exec -.-> lab-389189{{"Работа с томами Docker (Volumes)"}} docker/inspect -.-> lab-389189{{"Работа с томами Docker (Volumes)"}} docker/volume -.-> lab-389189{{"Работа с томами Docker (Volumes)"}} end

Понимание вариантов хранения данных в Docker

Прежде чем мы приступим к изучению томов Docker (volumes), важно понять различные варианты хранения данных, доступные в Docker. Docker предоставляет три основных варианта хранения данных:

  1. Томы (Volumes): Предпочтительный механизм для сохранения данных в Docker.
  2. Привязанные тома (Bind mounts): Позволяют подключить определенный путь на хост-машине к контейнеру.
  3. Временные тома (tmpfs mounts): Временное хранение данных в памяти хост-машины.

В этом лабораторном занятии (lab) мы сосредоточимся в основном на томах (volumes), так как они являются наиболее гибким и рекомендуемым вариантом для управления данными в Docker.

Начнем с вывода списка текущих томов на вашей системе:

docker volume ls

Вы увидите вывод, похожий на следующий:

DRIVER    VOLUME NAME
local     jenkins-data

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

Не беспокойтесь, если вы видите другие имена томов или вообще не видите никаких томов. Это нормально и зависит от того, что вы делали с Docker на вашей системе ранее.

Создание и управление именованными томами (Named volumes)

Теперь давайте создадим новый именованный том (named volume). Именованный том - это том, который вы создаете явно и даете ему определенное имя. Это упрощает его дальнейшее обращение и управление.

Запустите эту команду для создания нового тома:

docker volume create my_data

Эта команда создает новый том с именем my_data. Docker будет обрабатывать все детали о том, где и как этот том будет храниться на вашей хост-системе.

Давайте проверим, был ли том создан:

docker volume ls

Теперь вы должны увидеть my_data в списке томов, вместе с любыми томами, которые были там ранее.

Для получения более подробной информации о томе мы можем использовать команду inspect:

docker volume inspect my_data

Это выведет что-то вроде этого:

[
  {
    "CreatedAt": "2024-08-22T14:31:09+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
    "Name": "my_data",
    "Options": {},
    "Scope": "local"
  }
]

Этот вывод сообщает нам несколько вещей о нашем томе:

  • Когда он был создан
  • Используемый драйвер (в данном случае - local)
  • Точка монтирования (где данные фактически хранятся на вашей хост-системе)
  • Имя, которое мы ему дали

Не беспокойтесь, если вы сейчас не понимаете все эти детали. Для нас наиболее важными частями являются Name и Mountpoint.

Использование томов (Volumes) с контейнерами

Теперь, когда у нас есть том, давайте используем его с контейнером. Мы запустим новый контейнер и смонтируем наш том к нему.

Запустите эту команду:

docker run -d --name my_container -v my_data:/app/data ubuntu:latest sleep infinity

Разберем эту команду по частям:

  • docker run: Эта команда сообщает Docker запустить новый контейнер.
  • -d: Эта опция запускает контейнер в отсоединенном режиме (в фоновом режиме).
  • --name my_container: Эта опция дает нашему контейнеру имя, что упрощает дальнейшее обращение к нему.
  • -v my_data:/app/data: Эта опция монтирует наш том my_data в каталог /app/data внутри контейнера.
  • ubuntu:latest: Это образ, который мы используем для нашего контейнера.
  • sleep infinity: Это команда, которую контейнер будет выполнять. Она просто делает так, чтобы контейнер работал бесконечно.

Теперь наш контейнер запущен с смонтированным томом. Давайте создадим некоторые данные в томе:

docker exec my_container sh -c "echo 'Hello from Docker volume' > /app/data/test.txt"

Эта команда выполняет несколько действий:

  • docker exec: Эта команда позволяет нам выполнить команду в запущенном контейнере.
  • my_container: Это имя нашего контейнера.
  • sh -c "...": Эта команда запускает команду оболочки внутри контейнера.
  • Фактически, эта команда создает файл с именем test.txt в нашем томе с содержимым "Hello from Docker volume".

Для проверки того, что данные были записаны, мы можем прочитать файл:

docker exec my_container cat /app/data/test.txt

Вы должны увидеть сообщение "Hello from Docker volume", выведенное в консоль.

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

Одним из важных преимуществ томов Docker (volumes) является возможность обмена данными между контейнерами. Давайте создадим еще один контейнер, который будет использовать тот же том:

docker run -d --name another_container -v my_data:/app/shared_data ubuntu:latest sleep infinity

Эта команда очень похожа на ту, которую мы использовали ранее, но мы даем контейнеру другое имя и монтируем том в другой путь внутри контейнера.

Теперь давайте проверим, может ли этот новый контейнер получить доступ к данным, которые мы создали ранее:

docker exec another_container cat /app/shared_data/test.txt

Вы должны увидеть то же сообщение "Hello from Docker volume", которое мы записали ранее. Это показывает, что оба контейнера имеют доступ к тем же данным.

Давайте добавим еще данные из этого нового контейнера:

docker exec another_container sh -c "echo 'Data from another container' >> /app/shared_data/test.txt"

Эта команда добавляет новую строку в наш файл test.txt.

Теперь, если мы проверим содержимое файла из любого из контейнеров, мы должны увидеть обе строки:

docker exec my_container cat /app/data/test.txt

В выводе вы должны увидеть как "Hello from Docker volume", так и "Data from another container".

Это демонстрирует, как тома Docker можно использовать для обмена данными между контейнерами, что чрезвычайно полезно для многих приложений.

Резервное копирование и восстановление томов (Volumes)

Резервное копирование и восстановление томов Docker (volumes) является важной процедурой для сохранения данных. Давайте рассмотрим этот процесс:

Сначала нам нужно остановить и удалить контейнеры, которые использовали том. Это связано с тем, что мы не можем удалить том, пока он используется:

docker stop my_container another_container
docker rm my_container another_container

Теперь давайте создадим резервную копию нашего тома:

docker run --rm -v my_data:/source:ro -v $(pwd):/backup ubuntu tar cvf /backup/my_data_backup.tar -C /source.

Эта команда может показаться сложной, поэтому разберем ее по частям:

  • docker run --rm: Запустить временный контейнер и удалить его после завершения работы.
  • -v my_data:/source:ro: Монтировать наш том в контейнере в режиме только для чтения.
  • -v $(pwd):/backup: Монтировать текущий каталог в контейнере как /backup.
  • ubuntu: Использовать образ Ubuntu.
  • tar cvf /backup/my_data_backup.tar -C /source.: Создать tar-архив данных тома.

Теперь удалим наш исходный том:

docker volume rm my_data

Для восстановления данных мы создадим новый том и извлечем в него резервную копию:

docker volume create my_restored_data
docker run --rm -v my_restored_data:/dest -v $(pwd):/backup ubuntu bash -c "tar xvf /backup/my_data_backup.tar -C /dest"

Это создаст новый том и извлечет в него нашу резервную копию.

Давайте проверим, что данные были восстановлены:

docker run --rm -v my_restored_data:/app/data ubuntu cat /app/data/test.txt

Вы должны увидеть содержимое файла, который мы создали ранее.

Итоги

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

Основные выводы:

  • Тома Docker предоставляют гибкий и эффективный способ управления постоянными данными в контейнерах.
  • Тома можно легко создавать, проверять и удалять с помощью команд Docker CLI.
  • Данные в томах могут быть общими для нескольких контейнеров.
  • Резервное копирование и восстановление томов является важной процедурой для сохранения данных и может быть выполнено с использованием стандартных команд Linux.

По мере дальнейшей работы с Docker помните, что сохранение и управление данными являются важными аспектами контейнеризованных приложений. Всегда планируйте резервное копирование и восстановление данных, особенно в производственных средах.