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

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

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

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

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

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

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

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

Создайте новый том, если вам нужно:

том docker создать nginx-config

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

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

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

версия: «3.0» сервисы: web: изображение: nginx: последние порты: — тома «80:80»: — / docker / nginx-config /: / etc / nginx /

Затем вы можете перезапустить службы Docker Compose. В Compose есть команда «перезапустить», но на самом деле она просто обновляет работающую службу без каких-либо изменений конфигурации. Если вы хотите обновить изображения, вам нужно запустить docker-compose up с флагом —build:

docker-compose up -d —build

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

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

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

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

Возьмите идентификатор контейнера из docker ps:

докер ps

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

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 / контейнеры

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

Конфигурационный файл — config.v2.json, но он имеет компактный формат и его трудно редактировать. Вы можете установить jq для красивой печати JSON в командной строке и передать его в новый файл для редактирования:

jq. config.v2.json> tmp.json

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

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

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

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

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

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

перезапуск докера службы sudo

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован.