Понимание и управление объемами контейнеров Docker

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

Требования

  • Docker установлен и запущен
  • Вы обладаете базовыми знаниями о функциональности Docker и командах Docker

Файловая система Docker

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

Образ Docker — это набор слоев, доступных только для чтения. Когда вы запускаете контейнер из образа, Docker добавляет слой для чтения и записи на вершину этой стопки слоев только для чтения. Docker называет это файловой системой Union File System. Каждый раз, когда файл изменяется, Docker делает копию файла из слоев только для чтения вверх в верхний слой для чтения и записи. При этом исходный файл (доступный только для чтения) остается неизменным. Когда контейнер удаляется, верхний слой чтения-записи теряется. Это означает, что все изменения, сделанные после запуска контейнера, теперь исчезнут.

Как может помочь том Docker

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

Монтирование тома Docker — это хорошее решение, если вы хотите:

  • Передать данные в контейнер Docker.
  • Извлечь данные из контейнера Docker.
  • Обмениваться данными между контейнерами Docker.

Тома Docker существуют вне файловой системы Union File System уровней «только чтение» и «чтение-запись». Том представляет собой папку, которая совместно используется контейнером и хост-машиной. Тома также можно совместно использовать между контейнерами.

Совет

На облачном сервере IONOS Cloud Server вы можете выбрать Docker в качестве предустановленного облачного приложения. Таким образом, вы получите доступ к своим приложениям из любого места.

Основы работы с томами Docker

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

Использование команды Docker «создать том».

Начиная с версии 1.9.0, которая была выпущена 11/3/2015, тома Docker теперь можно создавать и управлять ими с помощью встроенной команды docker volume.

Команда docker volume create создаст том с именем. Имя позволяет легко находить и назначать тома Docker контейнерам.

Шаг 1: Создание и присвоение имени тома

Чтобы создать том Docker, используйте команду:

sudo docker volume create --name [volume name]

Шаг 2: Использовать том в контейнере Docker

Чтобы запустить контейнер, который будет использовать том, созданный с помощью docker volume, добавьте следующий аргумент в команду docker run:

-v [volume name]:[container directory] 

Например, чтобы запустить контейнер из образа CentOS с именем my-volume-test и отобразить том data-volume в каталог /data контейнера, выполните следующую команду:

sudo docker run -it --name my-volume-test -v data-volume:/data centos /bin/bash

Шаг 3: Перечислить тома

Чтобы перечислить все тома Docker в системе, используйте команду:

sudo docker volume ls

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

Шаг 4: Проверить том

Чтобы просмотреть именованный том, выполните команду:

sudo docker volume inspect [volume name]

Это вернет информацию о томе, включая его точку монтирования (каталог, в котором он «живет») на хост-системе.

Например, чтобы получить дополнительную информацию о томе data-volume, который мы создали выше, выполните следующую команду:

sudo docker volume inspect data-volume

Шаг 5: Удалить том

Чтобы удалить именованный том, используйте команду :

sudo docker volume rm [volume name]

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

sudo docker stop [container name or ID]
sudo docker rm [container name or ID]

Например, чтобы удалить том data-volume, сначала нужно удалить контейнер my-volume-test, который его использует:

sudo docker stop my-volume-test
sudo docker rm my-volume-test

Затем том data-volume можно удалить с помощью:

sudo docker volume rm data-volume

Создайте том Docker и укажите каталог для монтирования

Если вы хотите смонтировать определенный каталог на хост-машине в качестве тома Docker на контейнере, добавьте следующий аргумент в команду docker run:

-v [host directory]:[container directory]

Например, чтобы запустить новый контейнер и смонтировать папку /webfiles с хоста в папку /var/www/html в контейнере, выполните следующую команду:

sudo docker run -it -v /webfiles:/var/www/html centos /bin/bash

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

sudo mkdir /hostvolume

Добавьте небольшой тестовый файл в этот каталог командой:

sudo echo "Hello World" >> /hostvolume/host-hello.txt

Затем запустите контейнер с именем my-directory-test и сопоставьте /hostvolume на хосте с /containervolume в контейнере командой:

sudo docker run -it --name my-directory-test -v /hostvolume:/containervolume centos /bin/bash

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

ls /containervolume

Вы увидите файл host-hello.txt, который мы создали на хосте.

Это работает и в обратном направлении. Файлы, которые вы поместите в этот каталог, появятся на хосте. Вы можете проверить это из контейнера, добавив еще один файл на общий том с помощью команды:

 

echo "Hello from the container." >> /containervolume/container-hello.txt

Отсоединитесь от контейнера с помощью [Ctrl] + [P] и [Ctrl] + [Q] и вернитесь в командную строку хост-машины. Там перечислите файлы в общем томе с помощью команды:

sudo ls /hostvolume

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

Создание тома Docker с помощью Dockerfile

Используйте следующую команду в Dockerfile для создания тома общего хранилища в контейнере:

VOLUME [volume path]

Например, для создания тома /myvolume в контейнере, который будет запущен из Dockerfile, команда выглядит следующим образом:

VOLUME /myvolume

Чтобы проверить это, начните с создания файла Dockerfile с помощью команды:

sudo nano Dockerfile

Поместите в этот файл следующее содержимое:

# The source image to start with
FROM centos

# Create a volume
VOLUME /dockerfilevolume

Сохраните и выйдите из файла.

Затем создайте образ с именем dockerfile-volumetest из этого Dockerfile с помощью команды:

sudo docker build -t dockerfile-volumetest .

Затем запустите контейнер с именем my-dockerfile-test из этого образа командой:

sudo docker run --name my-dockerfile-test -it dockerfile-volumetest /bin/bash

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

echo "Hello World" >> /dockerfilevolume/dockerfile-container-hello.txt

Отсоединитесь от контейнера с помощью [Ctrl] + [P] и [Ctrl] + [Q] и вернитесь в командную строку хост-машины.

Далее давайте найдем точку монтирования. Для этого воспользуйтесь командой:

sudo docker inspect my-dockerfile-test

Прокрутите вывод, пока не найдете раздел под названием «Mounts», который будет выглядеть примерно так:

  • Источник — это каталог на хост-машине.
  • Место назначения — папка на контейнере.

Проверьте исходный каталог на хост-машине. В данном примере это команда:

sudo ls  /var/lib/docker/volumes/30275034a424251a771c91b65ba44261a27f91e3f6af31097b5226b1f46bfe20/_data/test

Здесь вы найдете файл dockerfile-container-hello.txt, который вы создали на контейнере.

Обзор преимуществ и недостатков различных методов

Метод

Преимущества

Недостатки

Команда «volume create»

Быстрая и простая в использовании

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

Создать том Docker с каталогом на хосте

Позволяет сопоставить определенную папку хоста с контейнером

Невозможно создать именованный том, как в docker volume create. Не может быть автоматизировано с помощью Dockerfile

Создать с помощью Dockerfile

Позволяет автоматизировать процесс

Невозможно создать именованный том. Невозможно указать каталог на хосте

Совместное использование томов Docker между контейнерами

Существует множество ситуаций, когда полезно разделить том Docker между контейнерами, и несколько способов достижения этой цели.

Совместное использование тома на хосте

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

Начните с создания каталога для использования в качестве тома Docker с помощью команды:

sudo mkdir /webdata

Создайте небольшой тестовый файл в этом каталоге с помощью команды:

sudo echo "Hello from the host." >> /webdata/host-hello.txt

Затем запустите контейнер с именем sql-database из официального образа PostgreSQL и сопоставьте /webdata на хосте с /data в контейнере с помощью команды:

sudo docker run -it --name sql-database -v /webdata:/data postgres /bin/bash

Когда вы окажетесь в командной строке нового контейнера, убедитесь, что общий том настроен правильно, выполнив команду:

ls /data

Вы увидите файл host-hello.txt, который мы создали на хосте. Давайте добавим файл на этот общий том с помощью команды:

echo "Hello from the sql-database container." >> /data/sql-hello.txt

Отсоединитесь от контейнера с помощью [Ctrl] + [P] и [Ctrl] + [Q] и вернитесь в командную строку хост-машины.

Теперь запустите контейнер с именем webapp из официального образа PHP+Apache и сопоставьте /webdata на хосте с /var/www/html на контейнере.

sudo docker run -it --name webapp -v /webdata:/var/www/html php:5.6-apache /bin/bash

Как только вы окажетесь в командной строке нового контейнера, проверьте, что общий том настроен правильно с помощью команды:

ls /var/www/html

Вы увидите как файл host-hello.txt, который мы создали на хосте, так и файл sql-hello.txt, который мы создали в контейнере sql-database.

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

echo "Hello from the webapp container." >> /var/www/html/webapp-hello.txt

Отсоединитесь от контейнера с помощью [Ctrl] + [P] и [Ctrl] + [Q] и вернитесь в командную строку хост-машины. На хост-машине вы увидите все три файла в списке командной строки:

sudo ls /webdata

Теперь, когда два контейнера совместно используют каталог, который «живет» на хосте, данные можно мгновенно передавать между всеми тремя местами, просто перемещая их в этот каталог.

Использование контейнера в качестве общего тома данных

Вы также можете использовать отдельный контейнер в качестве общего тома данных. Для этого сначала создайте контейнер данных. Затем, когда вы создаете контейнер, который будет использовать этот контейнер данных, добавьте следующий аргумент в команду docker run:

--volumes-from [name or ID of data container]
Примечание .

Это сработает независимо от того, запущен целевой контейнер или нет. Тома Docker никогда не удаляются и сохраняются даже после остановки контейнера.

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

Сначала запустите контейнер data-storage из официального образа CentOS 7:

sudo docker run -it -v /shared-data --name data-storage centos /bin/bash

Затем добавьте небольшой файл в папку /shared-data:

echo "Hello from the data-storage container." >> /shared-data/data-storage-hello.txt

Отсоединитесь от контейнера с помощью [Ctrl] + [P] и [Ctrl] + [Q] и вернитесь в командную строку хост-машины.

Теперь запустите контейнер приложения из официального образа Python и смонтируйте контейнер для хранения данных как том:

sudo docker run -it --name app --volumes-from data-storage python /bin/bash

Перечислите файлы в общем томе с помощью команды:

ls /shared-data 

Как видите, папка /shared-data была смонтирована из папки /shared-data контейнера data-storage и содержит файл data-storage-hello.txt.

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

echo "Hello from the app container." >> /shared-data/app-hello.txt

Отсоединитесь от контейнера с помощью [Ctrl] + [P] и [Ctrl] + [Q] и вернитесь в командную строку хост-машины.

Наконец, запустите веб-контейнер из официального образа Apache и смонтируйте контейнер для хранения данных как том:

sudo docker run -it --name web --volumes-from data-storage httpd /bin/bash

Перечислите файлы в общем томе с помощью команды:

ls /shared-data

Вы увидите файлы, которые мы создали на контейнерах data-storage и app, перечисленные здесь.

Монтирование тома только для чтения

На протяжении всего этого руководства мы монтировали тома с доступом по умолчанию «чтение-запись». Если вы хотите ограничить доступ контейнера к тому только для чтения, просто добавьте :ro к тому контейнера, указанному в операторе -v:

docker run -v /directory:/path:ro

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

Например, начните с создания тома на хосте с именем limited-access с помощью команды:

sudo docker volume create --name limited-access

Затем запустите контейнер из образа CentOS с именем allowed-to-write и отобразите том limited-access как обычный том (чтение-запись):

sudo docker run -it --name allowed-to-write -v limited-access:/data centos /bin/bash

Как только вы окажетесь в командной строке этого контейнера, создайте тестовый файл с помощью команды:

echo "Hello from the container that is allowed to write." >> /data/hello.txt

Отсоединитесь от контейнера с помощью [Ctrl] + [P] и [Ctrl] + [Q] и вернитесь в командную строку хост-машины.

Затем запустите контейнер из образа CentOS с именем not-allowed-to-write и обозначьте том limited-access как том только для чтения:

sudo docker run -it --name not-allowed-to-write -v limited-access:/data:ro centos /bin/bash

Если вы попытаетесь создать тестовый файл в общем томе с помощью команды, подобной этой

echo "Hello from the container that is not allowed to write." >> /data/no-access.txt

вы получите ошибку, объясняющую, что у этого контейнера нет доступа на запись в этот каталог:

bash: /data/no-access.txt: Read-only file system

Оцените статью
cdelat.ru
Добавить комментарий