Поиск по сайту:

Как изменить конфигурацию работающих контейнеров Docker


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

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

Переименование контейнера

Самая простая модификация — это переименование созданного контейнера. Имена назначаются с помощью флага --name для docker run. Если имя не указано, демон Docker назначает случайное. Вы можете использовать имена для ссылки на контейнеры в командах Docker CLI; выбор подходящего запоминающегося позволяет избежать запуска docker ps для поиска автоматически назначенного имени или идентификатора контейнера.

Команда docker rename используется для изменения имен контейнеров после создания. Он принимает два аргумента: ID или текущее имя целевого контейнера и новое имя для назначения:

# docker rename <target ID or name> <new name>
docker rename old_name new_name

Изменение политики перезапуска

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

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

docker update --restart unless-stopped demo_container

В приведенном выше примере политика перезапуска demo_container изменяется на unless-stopped. Эта политика заставляет контейнер запускаться с демоном, если только он не был остановлен вручную перед последним выходом из демона.

Изменение лимитов аппаратных ресурсов

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

Флаги доступны для всех ограничений ресурсов, поддерживаемых docker run. Вот сжатый список опций, которые вы можете использовать:

  • --blkio-weight – изменить относительный вес блока ввода-вывода контейнера.
  • --cpus – установите количество ЦП, доступных для контейнера.
  • --cpu-shares — установите относительный вес доли ЦП.
  • --memory – измените лимит памяти контейнера (например, 1024M).
  • --memory-swap — настройка объема памяти, который контейнер может выгрузить на диск; используйте размер, например 1024M, чтобы установить определенный предел, или -1 для неограниченного обмена.
  • --kernel-memory — изменить предел памяти ядра контейнера. Контейнеры, которым не хватает памяти ядра, могут негативно повлиять на другие рабочие нагрузки на хост-компьютере.
  • --pids-limit – настраивает максимальное количество идентификаторов процессов, разрешенных внутри контейнера, ограничивая количество процессов, которые могут быть запущены.

Вот пример использования docker update для изменения лимита памяти и количества ЦП для двух ваших контейнеров:

docker update --cpus 4 --memory 1024M first_container second_container

Все доступные флаги, кроме --kernel-memory, можно использовать с работающими контейнерами Linux. Чтобы изменить лимит памяти ядра, вы должны сначала остановить контейнер с помощью docker stop.

Имейте в виду, что ни один из этих флагов в настоящее время не поддерживается для контейнеров на базе Windows. Однако они будут работать с контейнерами Linux, работающими на хост-компьютере Windows.

Когда не использовать эти команды?

Команды docker update и docker rename следует использовать с контейнерами, которые вы создали вручную с помощью docker run. Будьте осторожны при использовании их с контейнерами, созданными другими инструментами, такими как docker-compose.

Изменение имени контейнера может сделать его необнаружимым для исходного инструмента, что может нарушить работу других компонентов вашего стека. Кроме того, если вы декларативно определяете ограничения ресурсов в файле docker-compose.yml, повторный запуск команды docker-compose up повторно применит эти исходные ограничения к ваш контейнер.

Поэтому вам следует придерживаться существующего решения для управления контейнерами, если вы его используете. Для Compose это означает изменение имен контейнеров и ограничений ресурсов в файле docker-compose.yml, а затем запуск docker-compose up -d для автоматического применения изменений. Это гарантирует, что вы не будете непреднамеренно терять контейнеры или вызывать непреднамеренные побочные эффекты.

А как насчет других свойств (изображение/порты/тома)?

Ограничения оборудования, политики ресурсов и имена контейнеров — единственные параметры конфигурации, которые Docker CLI позволяет изменить. Вы не можете изменить образ работающего контейнера; вы также не можете легко изменить другие параметры, такие как привязки портов и тома.

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

Поскольку контейнеры должны быть эфемерными и не иметь состояния, вы должны иметь возможность заменить их в любое время. Используйте тома для хранения постоянных данных контейнера; этот механизм позволяет повторно прикреплять файлы с отслеживанием состояния к новому контейнеру, повторяя флаги -v, переданные исходной команде docker run:

docker run -v config-volume:/usr/lib/config --name demo example-image:v1

docker rm demo

# Existing data in /usr/lib/config retained
docker run -v config-volume:/usr/lib/config --name demo2 example-image:v2

Опасная зона: изменение других свойств контейнера

Хотя вы должны стремиться заменить контейнеры везде, где это возможно, можно изменить свойства существующих, напрямую отредактировав файлы конфигурации Docker. Будьте осторожны при использовании этого метода: он полностью не поддерживается, и неуместное изменение может сломать ваш контейнер.

Хотя этот параметр позволяет произвольно редактировать существующие контейнеры, он не будет работать, пока они запущены. Используйте команду docker stop my-container, чтобы остановить контейнер, который вы хотите изменить, а затем продолжите вносить изменения.

Файлы конфигурации контейнера имеют следующий путь на вашем хосте:

/var/lib/docker/containers/<container id>/config.v2.json

Вам нужно знать полный идентификатор контейнера, а не усеченную версию, показанную docker ps. Вы можете использовать команду docker inspect, чтобы получить это:

docker inspect <short id or name> | jq | grep Id

Когда вы доберетесь до config.v2.json контейнера, вы можете открыть его в текстовом редакторе, чтобы внести необходимые изменения. JSON хранит конфигурацию контейнера, созданную при запуске docker run. Вы можете изменить содержимое, чтобы изменить такие свойства, как привязки портов, переменные среды, тома, а также точку входа и команду контейнера.

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

{
    "PortBindings": {
        "80/tcp": {
            "HostIp": "",
            "HostPort": "8080"
        }
    }
}

Здесь порт 80 в контейнере привязан к порту 8080 на хосте. Так же просто добавить переменные среды — найдите ключ Env, затем вставьте новые элементы в массив:

{
    "Env": [
        "FOO=bar",
        "CUSTOM_VARIABLE=example"
    ]
}

Закончив редактирование, перезапустите службу Docker и ваш контейнер:

sudo service docker restart

docker start my-container

Теперь контейнер будет работать с обновленной конфигурацией.

Заключение

Контейнеры Docker предназначены для эфемерных единиц, которые вы заменяете, когда их конфигурация устаревает. Несмотря на это намерение, существуют сценарии, в которых необходимо изменить существующий контейнер. Docker обрабатывает наиболее распространенные варианты использования — изменение имени и корректировку лимита ресурсов в режиме реального времени — с помощью встроенных команд CLI, таких как docker update.

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

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