如何确保 Docker 容器正确关闭

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Docker 容器已成为现代软件开发和部署的重要组成部分。确保这些容器正确关闭对于维护应用程序的稳定性和可靠性至关重要。本教程将指导你完成优雅停止 Docker 容器的过程,并探讨容器关闭的最佳实践。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/restart("Restart Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") subgraph Lab Skills docker/start -.-> lab-417757{{"如何确保 Docker 容器正确关闭"}} docker/stop -.-> lab-417757{{"如何确保 Docker 容器正确关闭"}} docker/restart -.-> lab-417757{{"如何确保 Docker 容器正确关闭"}} docker/rm -.-> lab-417757{{"如何确保 Docker 容器正确关闭"}} docker/logs -.-> lab-417757{{"如何确保 Docker 容器正确关闭"}} end

理解 Docker 容器生命周期

要全面理解 Docker 容器的生命周期,了解容器可能处于的不同状态以及它如何在这些状态之间转换非常重要。

容器状态

Docker 容器可以处于以下状态:

  1. 已创建(Created):容器已创建但尚未启动。
  2. 运行中(Running):容器当前正在运行并执行其主进程。
  3. 已暂停(Paused):容器的主进程已暂停,但容器仍处于活动状态。
  4. 已停止(Stopped):容器已停止,其主进程已退出。
  5. 重启中(Restarting):容器当前正在重启。
  6. 移除中(Removing):容器正在从系统中被移除。
stateDiagram-v2 [*] --> Created Created --> Running Running --> Paused Paused --> Running Running --> Stopped Stopped --> Running Stopped --> [*] Running --> Restarting Restarting --> Running Running --> Removing Removing --> [*]

容器生命周期管理

Docker 引擎管理容器的生命周期,确保根据需要创建、启动、停止和移除容器。这是通过各种 Docker 命令完成的,例如 docker rundocker stopdocker startdocker rm

当创建一个容器时,它处于“已创建”状态。要启动容器,你使用 docker start 命令,该命令将容器转换为“运行中”状态。当容器运行时,你可以使用 docker pause 将其暂停,使其进入“已暂停”状态。要恢复容器,你使用 docker unpause

要停止正在运行的容器,你使用 docker stop 命令,该命令会优雅地关闭容器的主进程并将其转换为“已停止”状态。如果你需要重启已停止的容器,可以再次使用 docker start 命令。

最后,要从系统中移除容器,你使用 docker rm 命令,该命令将容器转换为“移除中”状态并永久移除它。

## 创建一个新容器
docker create ubuntu:latest

## 启动容器
docker start <容器ID>

## 暂停容器
docker pause <容器ID>

## 恢复容器
docker unpause <容器ID>

## 停止容器
docker stop <容器ID>

## 启动已停止的容器
docker start <容器ID>

## 移除容器
docker rm <容器ID>

通过了解 Docker 容器可能处于的不同状态以及用于管理其生命周期的命令,你可以有效地控制和监控容器的行为。

优雅地停止 Docker 容器

在停止 Docker 容器时,以优雅的方式进行操作非常重要,以确保关闭过程顺利,并防止潜在的数据丢失或应用程序问题。

docker stop 命令

用于停止正在运行的 Docker 容器的主要命令是 docker stop。此命令会向容器的主进程发送一个 SIGTERM 信号,在使用 SIGKILL 信号强制终止进程之前,给它一个宽限期(默认是 10 秒)来执行干净的关闭操作。

docker stop [OPTIONS] CONTAINER [CONTAINER...]

[OPTIONS] 可以包括:

  • -t, --time=: 在杀死容器之前等待其停止的秒数(默认是 10 秒)。

优雅关闭策略

为确保 Docker 容器的优雅关闭,你可以实施以下策略:

  1. 处理 SIGTERM 信号:确保你的应用程序的主进程监听 SIGTERM 信号并执行干净的关闭操作,例如刷新数据、关闭连接和释放资源。

  2. 使用关闭脚本:创建一个作为容器入口点或命令运行的自定义脚本。此脚本可以处理 SIGTERM 信号,并在容器退出之前执行必要的关闭过程。

#!/bin/bash

## 捕获 SIGTERM 信号并执行优雅关闭
trap 'echo "Received SIGTERM signal, performing graceful shutdown..."; \
     your_shutdown_logic; \
     exit 0;' SIGTERM

## 运行你的应用程序的主进程
your_application_command
  1. 利用健康检查:配置一个 Docker 健康检查,以验证应用程序的就绪状态和存活状态。这有助于确保在尝试停止容器之前,容器处于健康状态。
## Dockerfile
HEALTHCHECK --interval=5s --timeout=3s \
  CMD your_healthcheck_command || exit 1
  1. 设置合理的 --time 选项:使用 docker stop 时,考虑使用 --time 选项设置一个合理的宽限期,为你的应用程序留出足够的时间来执行优雅关闭。
docker stop --time=30 my-container

通过实施这些策略,你可以确保你的 Docker 容器以可控且可靠的方式停止,将数据丢失或应用程序问题的风险降至最低。

容器关闭的最佳实践

为确保可靠且高效地关闭 Docker 容器,请考虑以下最佳实践:

实施优雅关闭处理

如前所述,处理 SIGTERM 信号并对你的应用程序进行优雅关闭至关重要。这包括:

  1. 在应用程序的主进程中监听 SIGTERM 信号。
  2. 执行必要的清理和关闭逻辑,例如刷新数据、关闭连接和释放资源。
  3. 在关闭完成后干净地退出进程。

使用关闭脚本

利用作为容器入口点或命令运行的自定义关闭脚本。此脚本可以处理 SIGTERM 信号并协调关闭过程,确保所有容器的关闭一致且可靠。

#!/bin/bash

## 捕获 SIGTERM 信号并执行优雅关闭
trap 'echo "Received SIGTERM signal, performing graceful shutdown..."; \
     your_shutdown_logic; \
     exit 0;' SIGTERM

## 运行你的应用程序的主进程
your_application_command

配置健康检查

设置 Docker 健康检查以验证应用程序的就绪状态和存活状态。这有助于确保在尝试停止容器之前,容器处于健康状态,从而降低关闭过程中出现问题的风险。

## Dockerfile
HEALTHCHECK --interval=5s --timeout=3s \
  CMD your_healthcheck_command || exit 1

设置适当的 --time 选项

使用 docker stop 命令时,考虑使用 --time 选项设置合理的宽限期。这会为你的应用程序留出足够的时间来执行优雅关闭,降低数据丢失或应用程序问题的可能性。

docker stop --time=30 my-container

监控容器关闭

密切监控容器的关闭过程,尤其是在部署或扩展操作期间。观察容器日志和指标,以识别关闭阶段的任何问题或意外行为。

实施重启策略

为你的容器配置适当的重启策略,例如 always(总是)、on-failure(失败时)或 unless-stopped(除非停止)。这有助于确保在意外关闭或失败的情况下,你的容器会自动重启。

## docker-compose.yml
version: "3"
services:
  my-app:
    restart_policy:
      condition: on-failure

通过遵循这些最佳实践,你可以确保 Docker 容器可靠且可控地关闭,将数据丢失或应用程序问题的风险降至最低。

总结

在本教程中,你已经学会了如何确保你的 Docker 容器被正确关闭。通过理解容器生命周期、实施优雅停止技术并遵循最佳实践,你可以有效地管理基于 Docker 的应用程序,并避免意外问题。正确关闭容器是 Docker 使用中的一个关键方面,这些知识将帮助你维护一个强大且可靠的基础设施。