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

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

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

Введение

В этой лабораторной работе вы научитесь эффективно управлять жизненным циклом ваших Docker-сервисов с помощью команды docker compose restart. Мы начнём с настройки простого многокомпонентного приложения с использованием Docker Compose, состоящего из веб-сервиса и сервиса базы данных.

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


Skills Graph

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

Подготовка простого многокомпонентного приложения

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

Сначала необходимо установить Docker Compose. Поскольку он не предустановлен в среде LabEx VM, мы скачаем и установим его.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Первая команда скачивает бинарный файл Docker Compose с официального репозитория GitHub и сохраняет его в /usr/local/bin/docker-compose. Части $(uname -s) и $(uname -m) автоматически определяют вашу операционную систему и архитектуру для загрузки правильной версии. Вторая команда делает скачанный файл исполняемым.

Теперь проверим установку, посмотрев версию Docker Compose.

docker-compose --version

Вы должны увидеть вывод, похожий на Docker Compose version v2.20.2.

Далее перейдём в директорию ~/project, которая является рабочей для этой лабораторной работы.

cd ~/project

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

nano docker-compose.yml

Вставьте следующее содержимое в файл docker-compose.yml:

version: "3.8"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    depends_on:
      - db

  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

В этом файле docker-compose.yml:

  • version: '3.8' указывает версию формата файла Docker Compose
  • services: определяет различные сервисы в нашем приложении
  • Сервис web использует образ nginx:latest, пробрасывает порт 80 хоста на порт 80 контейнера и зависит от сервиса db. Это означает, что сервис db будет запущен перед сервисом web
  • Сервис db использует образ postgres:latest и устанавливает переменную окружения POSTGRES_PASSWORD, которая требуется для образа PostgreSQL

Сохраните файл и выйдите из редактора nano (нажмите Ctrl + X, затем Y, затем Enter).

Перед запуском сервисов необходимо загрузить соответствующие образы Docker.

docker pull nginx:latest
docker pull postgres:latest

Эти команды скачивают образы nginx:latest и postgres:latest из Docker Hub.

Наконец, запустим сервисы, определённые в нашем файле docker-compose.yml.

docker-compose up -d

Команда docker-compose up -d собирает, создаёт и запускает сервисы в фоновом режиме (detached mode).

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

docker-compose ps

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

Перезапуск всех сервисов

На этом шаге мы научимся перезапускать все сервисы, определённые в файле docker-compose.yml. Перезапуск сервисов - это стандартная операция при внесении изменений в код приложения, конфигурацию или сам файл Docker Compose.

Для перезапуска всех сервисов используется команда docker-compose restart. Эта команда останавливает все работающие контейнеры, определённые в файле docker-compose.yml, а затем запускает их снова.

Убедитесь, что находитесь в директории ~/project, где расположен ваш файл docker-compose.yml.

cd ~/project

Теперь выполните следующую команду для перезапуска всех сервисов:

docker-compose restart

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

После завершения команды вы можете проверить, что сервисы были перезапущены и работают, используя команду docker-compose ps.

docker-compose ps

В выводе должно быть указано, что оба сервиса web и db находятся в состоянии Up, что означает их успешный перезапуск.

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

Перезапуск конкретного сервиса

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

Для перезапуска конкретного сервиса используется команда docker-compose restart, за которой следует имя сервиса. Имена сервисов определены в вашем файле docker-compose.yml (в нашем случае это web и db).

Убедитесь, что находитесь в директории ~/project.

cd ~/project

Давайте перезапустим сервис web.

docker-compose restart web

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

После завершения команды проверьте статус сервисов с помощью docker-compose ps.

docker-compose ps

В выводе оба сервиса web и db должны быть в состоянии Up. Однако сервис web был остановлен и запущен заново.

Теперь перезапустим сервис db.

docker-compose restart db

Вы увидите вывод о перезапуске сервиса db. Обратите внимание, что поскольку сервис web зависит от db, Docker Compose может также временно остановить и перезапустить web, чтобы обеспечить корректную работу зависимостей.

Снова проверьте статус сервисов:

docker-compose ps

Оба сервиса должны быть в состоянии Up. Перезапуск отдельных сервисов обеспечивает более точный контроль над жизненным циклом приложения.

Перезапуск сервиса без его зависимостей

В предыдущем шаге мы видели, что перезапуск сервиса db также вызывает кратковременный перезапуск сервиса web из-за отношения depends_on, определённого в docker-compose.yml. В некоторых случаях может потребоваться перезапустить сервис, не затрагивая его зависимости.

Для перезапуска сервиса без перезапуска его зависимостей можно использовать команду docker-compose restart с флагом --no-deps.

Убедитесь, что находитесь в директории ~/project.

cd ~/project

Попробуем снова перезапустить сервис db, на этот раз с флагом --no-deps.

docker-compose restart --no-deps db

Обратите внимание на вывод. Вы должны увидеть, что только сервис db останавливается и запускается. Сервис web, который зависит от db, остаётся без изменений.

Проверьте статус сервисов с помощью docker-compose ps.

docker-compose ps

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

Перезапуск сервиса с указанием таймаута

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

По умолчанию таймаут остановки контейнеров составляет 10 секунд. Давайте попробуем перезапустить сервис web с сокращённым таймаутом в 3 секунды.

Убедитесь, что находитесь в директории ~/project.

cd ~/project

Теперь выполните следующую команду для перезапуска сервиса web с таймаутом 3 секунды:

docker-compose restart --timeout 3 web

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

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

docker-compose ps

Оба сервиса должны оставаться в состоянии Up.

Использование флага --timeout позволяет контролировать время ожидания остановки сервиса при перезапуске. Это может быть полезно для сервисов, которым требуется больше или меньше времени для корректного завершения работы.

Наконец, дадим команду для остановки и удаления работающих сервисов:

docker-compose down

Команда docker-compose down останавливает и удаляет контейнеры, сети и тома, созданные командой docker-compose up.

Итоги

В этой лабораторной работе мы научились настраивать простое мультисервисное приложение с использованием Docker Compose. Это включало установку Docker Compose, проверку установки и создание файла docker-compose.yml для определения двух сервисов: веб-сервиса (nginx) и сервиса базы данных (postgres), где веб-сервис зависит от сервиса базы данных.

Затем мы изучили различные способы управления этими сервисами с помощью команды docker compose restart. Мы узнали, как:

  • Перезапускать все сервисы, определённые в файле docker-compose.yml
  • Перезапускать конкретный сервис
  • Перезапускать сервис без перезапуска его зависимостей
  • Перезапускать сервис с указанием периода таймаута

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