Docker Volumes создание и использование

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

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

Тома mount предназначены для добавления в контейнер имеющегося пути. Это помогает для добавления конфигурационной информации, а также наборов данных и статики с сайтов. Чтобы указать каталоги, предназначенные для монтирования в контейнер, нужно использовать инструкцию –mount совместно с <host path>:<container path>.

Осторожно!

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

Bind mount:

docker run -v <полный_путь_на_хосте>:<полный_путь_в_контейнере> <образ>

Удобно использовать pwd, чтобы не указывать полный путь

docker run --rm -it -v $(pwd)</путь_на_хосте>:<полный_путь_в_контейнере> <образ>

Пример: проброс файл todo_list.csv внутрь контейнера (предварительно создадим контейнер из Dockerfile):

# cat Dockerfile
FROM python:3.8
WORKDIR /app
 
docker build -t tg_bot_files/token .
docker run --rm -it -v $(pwd)/todo_result/todo_list.csv:/app/todo_result/todo_list.csv tg_bot_files/token

Концепция Docker-in-Docker

При помощи bind mount можно прокинуть сокет докера, в результате чего мы получим доступ к демону внутри контейнера. Такое может понадобиться, например, в CI/CD. Если кратко — нужно уметь внутри контейнера запускать, например, сборку образа (docker build).

docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock docker

Заходим внутрь контейнера и запускаем команду (в пример redis имя предварительно созданного контейнера, он должен быть выключен):

docker run --rm -d --name redis redis

Подробнее: Хорошо подумайте, прежде чем использовать Docker-in-Docker для CI или тестовой среды.

  • docker volume ls — вывести список вольюмов (ссылка)
  • docker volume create <название> — создать вольюм (ссылка)
  • docker volume rm <название> — удалить вольюм (ссылка)
  • docker volume prune — удалить вольюмы, которые не используются контейнерами (ссылка)

Команда подключения

docker run -v <название_вольюма>:<полный_путь_в_контейнере> <образ>

Readonly режим

docker run -v <полный_путь_на_хосте>:<полный_путь_в_контейнере>:ro <образ>

Тома tempfs выполняют функцию, обратную главной задаче Docker Volumes, то есть они отменяют сохранение информации после ликвидации контейнера. Это может понадобиться тем разработчикам, которые ведут достаточно обширное журналирование. В таком случае постоянные одноразовые записи могут привести к серьезному падению производительности системы. Инструкции –tempfs создают временные директории для записи непосредственно в памяти (ОЗУ), чтобы исключить постоянные обращения к файловой системе.

Tempfs Mount работает только под Linux, с ограничением в 1 контейнер.

PQ VPS сервера в 28+ странах.
Dolphin anty. Инглекс (Englex) — онлайн школа английского языка.