Ответ
В DevOps-пайплайнах и при управлении инфраструктурой остановка контейнеров — базовая операция. Вот как я это делаю:
1. Остановка с graceful shutdown:
Команда docker stop отправляет сигнал SIGTERM, позволяя контейнеру корректно завершить процессы.
# Остановка по имени
docker stop my-app-container
# Остановка по ID
docker stop a1b2c3d4
# Остановка с таймаутом (по умолчанию 10 сек)
docker stop -t 30 my-app-container
2. Принудительная остановка:
Если контейнер не реагирует на SIGTERM, docker kill отправляет SIGKILL.
docker kill my-app-container
# Можно указать конкретный сигнал
docker kill --signal=SIGINT my-app-container
3. Остановка нескольких контейнеров:
# Остановить все запущенные контейнеры
docker stop $(docker ps -q)
# Остановить контейнеры по фильтру (например, по label)
docker stop $(docker ps -q --filter "label=environment=staging")
4. В контексте оркестрации (Docker Compose / Swarm):
# Остановка сервисов, определённых в docker-compose.yml
docker-compose down
# Остановка только определённого сервиса
docker-compose stop service_name
Практическое замечание: В CI/CD скриптах я часто комбинирую эти команды, например, останавливаю старый контейнер перед развёртыванием новой версии. Всегда проверяю, что контейнер действительно остановился, с помощью docker ps -a | grep <name>.