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

by itisgood

Хотя 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 – новые команды по сравнению со старыми

Если вы используете 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

f🐳 Как обновить образ Docker c новыми изменениями?

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

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 – это мощная утилита, поэтому если вы хотите полностью автоматизировать этот процесс, вы можете это сделать.

☠ Как анализировать и вывести JSON с помощью инструментов командной строки Linux

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

sudo service docker restart

You may also like

Leave a Comment