Как использовать команду docker service update для изменения сервиса

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии (лабораторной работе) вы научитесь эффективно управлять и изменять Docker-сервисы с помощью команды docker service update. Сначала вы создадите простой сервис, а затем узнаете, как масштабировать его, обновляя количество реплик.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/restart("Restart Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ls -.-> lab-555232{{"Как использовать команду docker service update для изменения сервиса"}} docker/ps -.-> lab-555232{{"Как использовать команду docker service update для изменения сервиса"}} docker/restart -.-> lab-555232{{"Как использовать команду docker service update для изменения сервиса"}} docker/inspect -.-> lab-555232{{"Как использовать команду docker service update для изменения сервиса"}} docker/create -.-> lab-555232{{"Как использовать команду docker service update для изменения сервиса"}} docker/pull -.-> lab-555232{{"Как использовать команду docker service update для изменения сервиса"}} end

Создание простого сервиса

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

Сначала давайте загрузим образ alpine с Docker Hub. Этот образ очень маленький и полезен для тестирования.

docker pull alpine

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

Теперь давайте создадим сервис с именем my-service с использованием образа alpine. Мы запустим простую команду внутри контейнера, которая выведет "Hello, LabEx!" и затем завершит работу.

docker service create --name my-service alpine echo "Hello, LabEx!"

Эта команда создает новый сервис. Флаг --name my-service задает имя сервису. alpine - это образ, который будет использоваться, а echo "Hello, LabEx!" - команда, которая будет запущена внутри контейнера.

Вы должны увидеть вывод, похожий на следующий, который указывает на идентификатор сервиса:

<service_id>

Чтобы убедиться, что сервис был успешно создан, вы можете вывести список сервисов:

docker service ls

В выводе вы должны увидеть my-service в списке.

Обновление количества реплик сервиса

На этом этапе вы научитесь масштабировать Docker-сервис, обновляя количество реплик. Реплики - это идентичные копии контейнеров вашего сервиса. Увеличение количества реплик позволяет вашему сервису обрабатывать больше нагрузки и обеспечивает более высокую доступность.

В настоящее время наш сервис my-service имеет только одну реплику. Вы можете увидеть это в выводе команды docker service ls в столбце "REPLICAS".

Давайте масштабируем сервис до 3 реплик. Для этого можно использовать команду docker service update с флагом --replicas.

docker service update --replicas 3 my-service

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

Вы должны увидеть вывод, указывающий на то, что сервис был обновлен.

Чтобы убедиться, что сервис был масштабирован, выведите список сервисов еще раз:

docker service ls

Посмотрите на столбец "REPLICAS" для сервиса my-service. Теперь он должен показывать 3/3, что означает, что требуется 3 реплики и 3 реплики в настоящее время работают.

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

docker service ps my-service

Эта команда покажет вам статус каждой реплики (задачи) сервиса. Вы должны увидеть три задачи в списке, скорее всего, со статусом "Running".

Выполнение последовательной перезагрузки сервиса

На этом этапе вы научитесь выполнять последовательную перезагрузку (rolling restart) Docker-сервиса. Последовательная перезагрузка обновляет задачи (tasks) сервиса по одной, обеспечивая доступность сервиса в процессе обновления. Это очень важно для поддержания времени работы приложения.

Для запуска последовательной перезагрузки можно использовать команду docker service update с флагом --force. Этот флаг заставляет выполнить новое обновление, даже если конфигурация сервиса не изменилась.

docker service update --force my-service

Эта команда запустит последовательную перезагрузку сервиса my-service. Docker Swarm последовательно остановит и запустит каждую реплику сервиса.

Вы должны увидеть вывод, указывающий на то, что сервис был обновлен.

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

docker service ps my-service

Запустите эту команду несколько раз. Вы увидите, как "CURRENT STATE" задач изменяется с "Running" на "Shutdown" и затем обратно на "Running", когда каждая реплика перезапускается. Этот процесс происходит по одной реплике за раз, демонстрируя последовательный характер перезагрузки.

После того, как все задачи будут перезапущены, вывод команды docker service ps my-service покажет, что все задачи находятся в состоянии "Running" с обновленными временными метками в столбце "UPDATED".

Добавление или удаление опубликованного порта

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

На текущий момент наш сервис my-service не имеет опубликованных портов, так как он просто выполняет простую команду echo и завершает работу. Чтобы продемонстрировать публикацию портов, создадим новый сервис, который будет запускать простой веб-сервер. Для этого будем использовать образ nginx.

Сначала загрузите образ nginx:

docker pull nginx

Теперь создадим новый сервис с именем web-service и опубликуем порт 80 контейнера на порт 8080 хоста.

docker service create --name web-service --publish 8080:80 nginx

Эта команда создает сервис с именем web-service с использованием образа nginx. Флаг --publish 8080:80 сопоставляет порт 80 внутри контейнера с портом 8080 на хосте.

Вы должны увидеть вывод, показывающий идентификатор сервиса.

Чтобы убедиться, что порт опубликован, вы можете проверить сервис:

docker service inspect web-service

Найдите раздел EndpointSpec в выводе. Вы должны увидеть запись в разделе Ports, которая показывает сопоставление опубликованного порта (например, PublishedPort: 8080, TargetPort: 80).

Теперь удалим опубликованный порт из сервиса web-service. Для этого можно использовать команду docker service update с флагом --publish-rm, указав целевой порт внутри контейнера.

docker service update --publish-rm 80 web-service

Эта команда удаляет сопоставление порта для порта 80 внутри контейнера.

Вы должны увидеть вывод, указывающий на то, что сервис был обновлен.

Чтобы убедиться, что порт был удален, проверьте сервис еще раз:

docker service inspect web-service

В разделе EndpointSpec больше не должно быть отображено сопоставление порта, которое вы только что удалили.

Откат сервиса до предыдущей версии

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

Сначала имитируем обновление, от которого мы можем захотеть выполнить откат. Обновим сервис web-service для использования другой, гипотетической версии образа (хотя мы на самом деле не будем загружать его, важна структура команды для отката).

docker service update --image nginx:1.20.0 web-service

Эта команда пытается обновить сервис web-service для использования образа nginx:1.20.0. В реальной ситуации это может быть новая версия с ошибкой.

Теперь предположим, что мы обнаружили проблему с этим обновлением и хотим откатиться до предыдущей версии (которая использовала стандартный образ nginx). Мы можем использовать команду docker service rollback.

docker service rollback web-service

Эта команда сообщает Docker Swarm вернуться к предыдущей конфигурации сервиса web-service. Docker Swarm остановит задачи, запущенные с новым образом, и запустит задачи с использованием предыдущей версии образа.

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

Чтобы убедиться, что откат прошел успешно, вы можете снова проверить сервис:

docker service inspect web-service

Посмотрите на поле Image в выводе. Теперь оно должно показывать исходный образ nginx (без тега :1.20.0, если вы изначально загрузили последний стандартный образ).

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

docker service ps web-service

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

Резюме

В этом лабораторном занятии вы научились управлять Docker-сервисами с помощью команды docker service update. Вы начали с создания простого сервиса с использованием образа alpine и базовой команды echo.

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