Перейти к основному содержимому

Перезапустите один контейнер с помощью Docker Compose

· 4 мин. чтения

1. Обзор

В этом руководстве мы узнаем, как перезапустить один контейнер Docker с помощью Docker Compose .

2. Команда перезапуска Docker Compose

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

docker-compose restart service-name

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

3. Настройка

У нас должен быть контейнер Docker для запуска команд Docker Compose. Мы будем использовать предыдущий проект ForEach, spring-cloud-docker , который представляет собой докеризованное приложение Spring Boot. В этом проекте есть два контейнера Docker, которые помогут нам доказать, что мы можем перезапустить одну службу, не затрагивая другую.

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

docker-compose up --detach --build

Теперь мы должны увидеть обе службы, выполнив команду docker-compose ps :

$ docker ps
Name Command State Ports
--------------------------------------------------------------------------------
message-server java -jar /message-server.jar Up 0.0.0.0:18888->8888/tcp
product-server java -jar /product-server.jar Up 0.0.0.0:19999->9999/tcp

Кроме того, мы можем перейти на localhost:18888 или localhost:19999 в нашем браузере и убедиться, что мы видим сообщения, отображаемые службами приложений.

4. Перезапуск одного контейнера

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

Во-первых, мы рассмотрим, как этого добиться без пересборки контейнера. Однако это решение не будет обновлять службу последним кодом. Затем мы увидим другой подход, при котором мы создаем контейнер с последним кодом перед запуском .

4.1. Перезагрузка без восстановления

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

docker-compose restart message-server

После запуска команды в терминале мы должны увидеть следующее сообщение:

Restarting message-server ... done

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

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b6541d1c4ddf product-server:latest "java -jar /product-…" 10 minutes ago Up 42 seconds 0.0.0.0:19999->9999/tcp product-server
1d07d2a7ed7d message-server:latest "java -jar /message-…" 10 minutes ago Up 15 seconds 0.0.0.0:18888->8888/tcp message-server

Наконец, мы можем определить, что команда успешно перезапустила контейнер сервера сообщений , просмотрев столбец STATUS . Мы можем видеть, что служба сервера сообщений была запущена и работала в течение меньшего периода времени, чем служба сервера продукта , которая была запущена с тех пор, как мы выполнили команду docker-compose up в предыдущем разделе.

4.2. Восстановление и перезапуск

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

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

public String getMessage() {
return "This is a brand new product";
}

Теперь давайте соберем пакет Maven:

mvn clean package

Теперь мы готовы перезапустить контейнер product-server . Мы можем добиться этого аналогично тому, как мы запускаем службы, но на этот раз указав имя контейнера, который мы хотим перезапустить.

Запустим команду для пересборки и перезапуска контейнера:

docker-compose up --detach --build product-server

Теперь мы можем убедиться, что контейнер product-server перезапущен с последним кодом, запустив docker ps и посмотрев на результат:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78a4364e75e6 product-server:latest "java -jar /product-…" 6 seconds ago Up 5 seconds 0.0.0.0:19999->9999/tcp product-server
b559f742973b message-server:latest "java -jar /message-…" 22 minutes ago Up 22 minutes 0.0.0.0:18888->8888/tcp message-server

Как мы видим, product-server изменил как значение CREATED , так и значение STATUS , указывая на то, что служба сначала была перестроена, а затем перезапущена без какого-либо влияния на message-server .

Кроме того, мы можем дополнительно подтвердить, что код был обновлен, перейдя на localhost: 19999 в нашем браузере и проверив, что вывод является последним.

5. Вывод

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

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