Контейнеры Docker обычно считаются неизменяемыми после начала их работы.
Однако некоторые параметры конфигурации можно изменять динамически, например, имя контейнера и лимиты его аппаратных ресурсов.
В этом руководстве мы покажем вам, как использовать встроенные команды Docker для изменения выбранных параметров запущенных контейнеров.
Мы также рассмотрим, что не следует изменять, и обходные пути, которые можно использовать, если вы считаете, что это необходимо.
Переименование контейнера
Самым простым изменением является переименование созданного контейнера. Имена присваиваются с помощью флага –name для команды docker run.
Если имя не указано, демон Docker присваивает случайное имя.
Вы можете использовать имена для ссылок на контейнеры в командах Docker CLI; выбор подходящего запоминающегося имени позволяет избежать выполнения команды docker ps для поиска автоматически назначенного имени или ID контейнера.
Команда docker rename используется для изменения имен контейнеров после создания.
Она принимает два аргумента: ID или текущее имя целевого контейнера и новое имя, которое нужно присвоить:
# docker rename <target ID or name> <new name>
docker rename old_name new_name
Изменение политики перезапуска
Restart policies определяют, должны ли контейнеры запускаться автоматически после перезагрузки хоста или запуска демона Docker.
Четыре доступные политики позволяют принудительно запустить контейнер, заставить его оставаться остановленным или условно запустить на основе предыдущего кода выхода или состояния работы контейнера.
Docker поддерживает изменение политик перезапуска “на лету”.
Это полезно, если вы планируете перезагрузить хост или демон Docker и хотите, чтобы определенный контейнер оставался остановленным – или автоматически запускался – после определенного события.
docker update --restart unless-stopped demo_container
Приведенный выше пример изменяет политику перезапуска demo_container на unless-stopped.
Эта политика заставляет контейнер запускаться вместе с демоном, если он не был остановлен вручную перед последним выходом демона.
Изменение лимитов аппаратных ресурсов
Команда docker update также может быть использована для изменения ограничений ресурсов, применяемых к контейнерам.
Вы должны передать один или несколько идентификаторов или имен контейнеров, а также список флагов, определяющих ограничения, которые необходимо установить для этих контейнеров.
Флаги доступны для всех ограничений ресурсов, поддерживаемых docker run.
Вот краткий список опций, которые вы можете использовать:
- –blkio-weight – Изменить относительный вес Block IO контейнера.
- –cpus – Установить количество процессоров, доступных контейнеру.
- –cpu-shares – Установить относительный вес доли ЦП.
- –memory – Изменить лимит памяти контейнера (например, 1024M).
- –memory-swap – настройка объема памяти, который контейнер может обменять на диск; используйте размер, например 1024M, чтобы установить определенный лимит, или -1 для неограниченной замены.
- –kernel-memory – Изменить лимит памяти ядра контейнера. Контейнеры, испытывающие недостаток памяти ядра, могут негативно влиять на другие рабочие нагрузки на хост-машине.
- –pids-limit – настройка максимального количества идентификаторов процессов, разрешенных внутри контейнера, что ограничивает количество процессов, которые могут быть запущены.
Вот пример использования docker update для изменения лимита памяти и количества CPU для двух контейнеров
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
# Существующие данные в /usr/lib/config сохранены
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
Вам нужно знать полный ID контейнера, а не усеченную версию, которую показывает 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, должны быть изменены с помощью этих механизмов.
В противном случае вы можете обнаружить, что контейнеры неожиданно осиротеют или будут перезаписаны, если инструмент не знает о внесенных вами изменениях.
Источник: https://t.me/i_DevOps https://te.legra.ph/Kak-izmenit-konfiguraciyu-zapushchennyh-kontejnerov-Docker-07-09