Поиск по сайту:

Как хранить данные контейнера Docker в томах Docker


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

Вы можете думать о томе Docker как о папке, которая существует за пределами файловой системы контейнера, но по-прежнему доступна для контейнеров, работающих на том же хосте. Когда вы создаете новый контейнер, вы можете либо смонтировать существующий том, либо создать новый. Если вы создадите новый том, Docker автоматически создаст новый уровень хранилища в базовой файловой системе хоста и инициализирует его указанными вами данными.

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

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

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

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

Давайте начнем!

Предпосылки

  • Чтобы следовать этому руководству, вы должны быть знакомы с основами работы с контейнерами Docker.
  • В этом руководстве предполагается, что вы используете хост Linux. В этом руководстве используется CentOS, но те же шаги должны работать и в любом другом дистрибутиве Linux.
  • На вашем хосте должен быть установлен и запущен Docker. Если вы еще не установили его, следуйте инструкциям в нашем руководстве по установке.
  • Учетная запись пользователя с привилегиями root
  • У вас установлен Docker на хосте Linux.

Обнаружение анонимных томов Docker

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

1. Выполните следующую команду, чтобы проверить, запущен ли и активен ли докер.

sudo systemctl status docker

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

sudo usermod -aG docker $(whoami)

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

docker pull postgres:12.1
docker pull bash 
docker pull httpd:2.4

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

docker images

5. Выполните следующую команду, чтобы узнать, есть ли на вашем хосте активные тома. Вы должны увидеть вывод, подобный следующему.

docker volume ls

Вы должны увидеть пустой вывод.

6. Выполните следующую команду, чтобы создать новый контейнер и убедиться, что на хосте создан новый анонимный том. Вы используете флаг -d для запуска контейнера в автономном режиме, чтобы вы могли продолжать работать в терминале. Вы используете флаг --name, чтобы дать контейнеру имя, чтобы вы могли легко его идентифицировать. Здесь вы используете изображение postgres:12.1, поскольку Postgres нужны фоновые тома для хранения своих данных. Вы должны запустить два контейнера, по одному для каждой из ваших баз данных Postgres, чтобы получить дополнительную информацию.

docker run -d --name db1 postgres:12.1
docker run -d --name db2 postgres:12.1

7. Запустите приведенную ниже команду docker, чтобы получить список контейнеров, которые в данный момент запущены на вашем хосте.

docker ps

Теперь у вас есть два контейнера: db1 и db2, как показано ниже.

8. Теперь перечислите тома, созданные на хосте.

docker volume ls

Вы увидите вывод, подобный следующему. После запуска Postgres ему нужно место для хранения данных. Postgres не хочет терять свои данные, поэтому Postgres автоматически создает анонимные тома. Тома называются с добавлением случайной строки шестнадцатеричных символов (e9f338... и  ee3423...).

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

9. Запустите приведенную ниже команду, чтобы получить дополнительную информацию о контейнере db1 в удобном для чтения формате.

docker inspect db1 -f '{{ json .Mounts }}' | python -m json.tool

Как вы можете видеть ниже, строка e9f338 Name совпадает с выводом команды docker volume ls выше. Эта строка сообщает вам, что этот том связан и подключен к контейнеру db1.

10. Сделайте то же самое для проверки контейнера db2.

docker inspect db2 -f '{{ json .Mounts}}' | python -m json.tool

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

11. Запускаем еще один контейнер. Но на этот раз мы собирались использовать флаг --rm и посмотреть, что произойдет с томами. Мы назвали этот контейнер dbTmp. Давай выясним!

docker run -d --rm --name dbTmp postgres:12.1

Теперь у нас есть три контейнера: db1, db2 и dbTmp, запущенные и работающие.

docker ps

12. Снова перечислите тома.

docker volume ls

Вы заметите, что для dbTmp контейнера был создан третий том.

13. Теперь остановите db2 вместе с контейнером dbTmp с помощью приведенной ниже команды.

докер остановить db2 dbTmp

13. Снова перечислите контейнеры и тома.

докер пс

docker volume ls

Как показано ниже, единственным работающим контейнером является контейнер db1. Однако том для контейнера dbTemp больше не существует, но том для контейнера db2 (ee3423...) все еще существует.

Такое поведение ожидаемо. Флаг --rm удаляет контейнер после его остановки вместе со всеми связанными томами. Том для контейнера dbTmp исчез, потому что мы остановили контейнер dbTemp. Поскольку мы не указали флаг --rm при создании контейнера db2, контейнер db2 и связанный с ним том остаются на хосте даже при остановке контейнера. Вывод из этого примера заключается в том, что вам нужно быть осторожным с флагом --rm. Если вы остановите контейнер, с которым связан том, этот том будет удален.

Создание тома Docker

Том Docker — это именованный контейнер хранилища, который вы создаете с помощью команды создания тома docker. Затем вы будете использовать том для хранения данных или обмена данными между контейнерами.

1. Выполните следующую команду, чтобы создать новый том с именем веб-сайт.

docker volume create website

2. Перечислите тома, вы увидите только что созданный новый том.

docker volume ls

3. Загрузите код этого веб-сайта с GitHub в текущий рабочий каталог.

4. Выполните приведенную ниже команду, чтобы скопировать код веб-сайта, который вы только что загрузили, на том веб-сайта.

sudo cp -r /home/cloud_user/widget-factory-inc/web/* /var/lib/docker/volumes/website/_data/

5. Выполните приведенную ниже команду, чтобы вывести список файлов на томе веб-сайта.

sudo ls -l /var/lib/docker/volumes/website/_data/ 

Вы можете видеть, что код веб-сайта теперь хранится в томе веб-сайта.

6. Теперь вы можете запустить новый контейнер и прикрепить к нему том веб-сайта. Вы используете флаг -v (volume) для монтирования тома. Вы используете флаг -p (сопоставление портов), чтобы сопоставить порт на хосте с портом в контейнере. В этом примере мы сопоставляем порт 80 на хосте с портом 80 в контейнере. Web1 — это имя контейнера.

docker run -d --name web1 -p 80:80 -v website:/usr/local/apache2/htdocs:ro httpd:2.4

7. Теперь веб-сайт будет обслуживаться из контейнера web1. Запустите команду docker ps, чтобы проверить состояние контейнера web1. Вы можете видеть, что веб-сайт обслуживается из контейнера web1. Вы также можете увидеть порт, на котором обслуживается веб-сайт (80), как показано ниже.

8. Вы можете открыть IP-адрес хост-компьютера в своем веб-браузере, чтобы увидеть только что скопированный веб-сайт.

9. Теперь запустите еще один контейнер с именем webTmp, на этот раз с флагом --rm, чтобы посмотреть, что произойдет с томом веб-сайта, когда вы остановите контейнер webTmp.

docker run -d --name webTmp --rm -v website:/usr/local/apache2/htdocs:ro httpd:2.4

10. Запустите команду docker ps show, чтобы убедиться, что контейнер webTmp запущен.

docker ps 

11. Теперь остановите контейнер webTmp и перечислите тома.

docker stop webTmp

объем докера лс

Как вы помните в начале этой статьи, когда вы останавливаете контейнер, связанные с ним тома также удаляются. Но на этот раз, как показано ниже, вы можете видеть, что объем веб-сайта все еще существует. Итак, что случилось?

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

Избавление от неиспользуемых томов

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

1. Запустите команду docker volume prune, чтобы удалить оборванные ресурсы (образы, сети, тома и контейнеры). Висячий ресурс — это объект Docker, в настоящее время не связанный с контейнером. Но перед удалением тома убедитесь, что его не используют никакие контейнеры. Например, вы должны удалить контейнер db2, прежде чем сможете удалить связанные с ним неиспользуемые тома.

docker stop db2
docker rm db2
docker volume prune

2. Перечислите тома, и вы увидите, что тома db2 больше нет.

docker volume ls

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

docker volume inspect website

Вы увидите точку монтирования для вашего сайта. Точка монтирования — это каталог в операционной системе хоста, в котором смонтирован том докера. В этом примере точка подключения — /var/lib/docker/volumes/website/_data, как показано ниже.

4. Вы можете использовать команду tar для резервного копирования содержимого тома вашего веб-сайта. Он существует уже давно и поддерживается на большинстве платформ. Команду tar можно использовать для резервного копирования каталога, включая все его подкаталоги и файлы.

Примечание: вы ДОЛЖНЫ запустить эту команду от имени пользователя root, иначе у вас не будет разрешения на запись в подключенный том docker, как показано ниже.

tar czf /tmp/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .

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

ls -l /tmp/website_*.tgz

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

tar tf /tmp/<YOUR_BACKUP_FILE_NAME>.tgz 

7. Теперь давайте запустим еще один контейнер, используя объем веб-сайта. На этот раз вы будете использовать флаг -it для взаимодействия с контейнером для проверки резервной копии.

docker run -it --rm -v website:/website -v /tmp:/backup bash tar czf /backup/website_$(date +%Y-%m-%d-%H-%M).tgz -C /website .

8. Перейдите в каталог тома и удалите все данные веб-сайта.

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

ls -l

10. Выполните приведенную ниже команду, чтобы восстановить данные веб-сайта. Замените фактическим именем файла резервной копии.

tar xf <YOUR_BACKUP_FILE_NAME>.tgz .

11. Перечислите содержимое каталога, чтобы убедиться, что данные веб-сайта восстановлены.

ls -l

Заключение

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

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

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