🐳 Как добавить том к существующему контейнеру Docker

docker volumes

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

Обычно тома добавляются в контейнеры в сценарии создания, но что делать, если вам нужно создать новые тома?

Добавление тома к запущенному контейнеру Docker

К сожалению, это не так просто, как просто добавить новый том в ОС Linux.

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

Хотя существует хакерское решение (подробнее об этом ниже), настоятельно рекомендуется все равно перезапускать контейнер.

Это происходит по нескольким причинам.

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

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

Если ваш сервис настолько велик, что вас беспокоит несколько минут (максимум) потенциального планового простоя для перезапуска контейнера, вам, вероятно, следует использовать масштабируемое развертывание с несколькими экземплярами, которые могут обновляться независимо друг от друга.

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

Если вы хотите добавить том, вам нужно остановить работающий контейнер:

docker stop my_container

При необходимости создайте новый том:

docker volume create nginx-config

А затем запустите его с обновленной командой запуска, добавив флаг –mount для настройки исходного тома и целевого назначения.

docker run -d —name devtest —mount source=nginx-config,target=/etc/nginx nginx:latest

Если вы используете Docker Compose, вы можете автоматизировать и отслеживать этот процесс более легко, поскольку конфигурация тома обрабатывается через файл настроек. вам нужно добавить том в файл docker-compose.yml:

version: «3.0»services: web: image: nginx:latest ports: — «80:80» volumes: — /docker/nginx-config/:/etc/nginx/

Затем вы можете перезапустить службы Docker Compose.

В Compose есть команда “restart”, но на самом деле она просто обновляет запущенный сервис без каких-либо изменений конфигурации.

Если вы хотите обновить образы, вам нужно запустить docker-compose с флагом –build:

docker-compose up -d —build

Вы также можете вручную запустить docker-compose down заранее, чтобы остановить службы, но это не обязательно в большинстве случаев, если только вы не хотите запустить его с флагом -v для уничтожения существующих томов.

Клонирование из существующего контейнера

Почти во всех случаях вы не должны зависеть от текущего состояния контейнера.

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

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

Но если вам нужно добавить том в работающий контейнер, вы можете использовать docker commit для создания нового образа на основе этого контейнера, а затем клонировать его с новым томом.

Получите идентификатор контейнера из docker ps:

docker ps

А затем клонируйте его с помощью commit:

docker commit f88f33c918d2 imagename

Затем вы можете запустить новый образ, заменив старый образ клонированным.

docker run -d —name devtest —mount source=nginx-config,target=/etc/nginx imagename

Альтернативное решение

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

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

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

Вам нужно перейти в каталог хранилища Docker:

cd /var/lib/docker/containers

Здесь будет много папок, соответствующих идентификаторам контейнеров Docker, которые вы можете найти с помощью docker ps.

Откройте папку для контейнера, который вы хотите изменить.

Конфигурационный файл – config.v2.json, но он имеет компактный формат и его трудно редактировать.

Вы можете установить jq для красивого вывода JSON в командной строке и передать его в новый файл для редактирования:

jq . config.v2.json > tmp.json

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

Здесь вы можете добавить новый том, который должен иметь следующий формат:

"MountPoints": { "/home/container": { "Source": "/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933", "Destination": "/home/container", "RW": true, "Name": "", "Driver": "", "Type": "bind", "Propagation": "rprivate", "Spec": { "Type": "bind", "Source": "/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933", "Target": "/home/container" }, "SkipMountpointCreation": true } },

Затем, когда все готово, вы можете минифицировать JSON обратно в файл конфигурации:

jq -c . tmp.json > config.v2.json

jq – это мощная утилита, поэтому если вы хотите полностью автоматизировать этот процесс, вы можете это сделать.

Затем просто перезапустите службу Docker, чтобы применить изменения:

sudo service docker restart

Друзья помогите этому контенту стать доступнее в социальных сетях.

Не проходи мимо жмакни по кнопке возможно кому то еще он будет полезен!