4. Docker 容器生命周期:创建、启动、停止、重启与删除

Docker 容器的生命周期管理是容器化环境配置与调试的核心操作。理解容器从创建到销毁的完整流程,能够帮助开发者精准控制任务调度 DAG 中每个节点的运行状态。本章将系统讲解容器的五大核心操作:创建、启动、停止、重启与删除,并深入分析各阶段的状态转换与最佳实践。

4.1 容器生命周期状态机

容器在生命周期中会经历多个状态,每个操作对应明确的状态迁移。下图展示了容器从创建到删除的完整状态转换路径:

Docker 容器生命周期状态转换图 Created Running Exited Removed start stop rm restart start (exited) 说明: • Created:镜像已加载,文件系统就绪,但进程未启动。 • Running:容器进程正在运行,可对外提供服务或执行任务。 • Exited:主进程终止,容器停止运行,但文件系统保留。

4.2 创建容器(docker create)

docker create 命令将镜像加载到容器文件系统,分配网络、存储与资源限制,但不启动容器进程。创建后的容器处于 Created 状态,适合在任务调度 DAG 中预先配置好所有容器参数,待条件满足时再统一启动。

4.2.1 基本用法

# 创建容器但不启动
docker create --name dag-node-1 nginx:alpine

# 创建时指定端口映射与环境变量
docker create \
  --name dag-worker-01 \
  -p 8080:80 \
  -e "ENV=production" \
  -e "LOG_LEVEL=info" \
  --memory="512m" \
  --cpus="1.0" \
  nginx:alpine

4.2.2 关键参数

参数 说明 示例
--name 指定容器名称,便于后续管理 --name dag-node-1
-p 端口映射(宿主机端口:容器端口) -p 8080:80
-e 设置环境变量 -e "ENV=staging"
--memory 内存限制 --memory="256m"
--cpus CPU 核心数限制 --cpus="0.5"
-v 挂载卷(数据持久化) -v /host/data:/container/data
最佳实践:在 DAG 任务调度场景中,建议在创建阶段就明确指定资源限制(--memory、--cpus),避免单个容器耗尽宿主机资源,影响其他任务节点运行。

4.3 启动容器(docker start)

docker start 命令将处于 Created 或 Exited 状态的容器启动,使其进入 Running 状态。启动时容器会执行创建时指定的 CMD 或 ENTRYPOINT 指令。

# 启动已创建的容器
docker start dag-node-1

# 启动并附加到容器标准输出(前台模式)
docker start -a dag-node-1

# 启动多个容器(DAG 并行节点)
docker start dag-worker-01 dag-worker-02 dag-worker-03

4.3.1 启动行为对比

启动方式 命令 适用场景
后台启动 docker start DAG 中长时间运行的服务节点(如 Web 服务、消息队列)
前台启动 docker start -a 调试单个任务节点,实时查看日志输出
创建并启动 docker run 快速启动一次性任务,无需保留容器配置

4.4 停止容器(docker stop)

docker stop 命令向容器主进程发送 SIGTERM 信号,等待优雅退出;若超时未响应,则发送 SIGKILL 强制终止。停止后的容器进入 Exited 状态,文件系统与配置仍然保留。

# 停止单个容器
docker stop dag-node-1

# 设置停止超时时间(默认 10 秒)
docker stop --time=30 dag-node-1

# 停止所有运行中的容器
docker stop $(docker ps -q)
注意:在 DAG 任务调度中,停止容器前应确保任务已处理完当前批次数据,或实现优雅关闭机制(如捕获 SIGTERM 信号)。强制停止可能导致数据丢失或任务状态不一致。

4.5 重启容器(docker restart)

docker restart 组合了 stop 和 start 操作,适用于容器配置更新后重新加载、或容器异常退出后的恢复场景。重启后容器保持原有的名称、网络配置与挂载卷。

# 重启容器(默认超时 10 秒)
docker restart dag-node-1

# 自定义停止超时时间后重启
docker restart --time=20 dag-node-1

# 重启多个 DAG 节点
docker restart dag-worker-01 dag-worker-02

4.5.1 重启策略配置

在创建容器时,可以通过 --restart 参数指定自动重启策略,适用于生产环境中的高可用 DAG 节点:

策略 行为 DAG 场景示例
no 不自动重启(默认) 一次性计算任务
on-failure 仅当容器退出码非 0 时重启 数据清洗节点,失败后自动重试
always 无论退出原因,总是重启 调度器核心服务、消息代理
unless-stopped 除非手动停止,否则始终重启 监控代理、日志采集器
# 创建容器时指定重启策略
docker create \
  --name dag-scheduler \
  --restart unless-stopped \
  scheduler:latest

4.6 删除容器(docker rm)

docker rm 命令将容器从宿主机中彻底移除,释放文件系统、网络与存储资源。删除后的容器无法恢复,所有未持久化的数据将丢失。

# 删除已停止的容器
docker rm dag-node-1

# 强制删除运行中的容器(发送 SIGKILL)
docker rm -f dag-node-1

# 删除容器并同时删除关联的匿名卷
docker rm -v dag-node-1

# 清理所有已停止的容器
docker container prune

4.6.1 删除操作对比

操作 命令 状态要求 数据保留
普通删除 docker rm 容器必须处于 Exited 状态 保留卷数据
强制删除 docker rm -f 任意状态(包括 Running) 保留卷数据
删除并清理卷 docker rm -v Exited 删除匿名卷
批量清理 docker container prune 所有已停止容器 保留卷数据
DAG 任务调度建议:对于一次性任务节点(如数据转换、报表生成),建议在任务完成后立即删除容器以释放资源;对于常驻服务节点(如调度器、API 网关),应保留容器并配置 --restart unless-stopped 策略。

4.7 生命周期操作速查表

下表汇总了容器生命周期各阶段的核心命令与状态变化,便于日常运维快速参考:

操作 命令 起始状态 结束状态 常用选项
创建 docker create — Created --name, -p, -e, -v
启动 docker start Created / Exited Running -a(前台模式)
停止 docker stop Running Exited --time(超时秒数)
重启 docker restart Running / Exited Running --time(停止超时)
删除 docker rm Exited Removed -f(强制), -v(清理卷)

4.8 实战:DAG 节点生命周期管理脚本

以下脚本展示了如何在任务调度 DAG 中管理多个容器的生命周期,实现顺序执行与资源清理:

#!/bin/bash
# DAG 节点生命周期管理示例

# 1. 创建三个任务节点
echo "创建 DAG 节点..."
docker create --name dag-step-1 --memory="256m" alpine:latest sh -c "echo 'Step 1 completed'"
docker create --name dag-step-2 --memory="256m" alpine:latest sh -c "echo 'Step 2 completed'"
docker create --name dag-step-3 --memory="256m" alpine:latest sh -c "echo 'Step 3 completed'"

# 2. 顺序启动并等待完成
echo "执行 Step 1..."
docker start -a dag-step-1

echo "执行 Step 2..."
docker start -a dag-step-2

echo "执行 Step 3..."
docker start -a dag-step-3

# 3. 检查所有容器状态
echo "容器状态:"
docker ps -a --filter "name=dag-step-"

# 4. 清理已完成的任务节点
echo "清理容器..."
docker rm dag-step-1 dag-step-2 dag-step-3
echo "DAG 任务执行完毕,资源已释放。"
扩展阅读:在生产级 DAG 调度系统(如 Apache Airflow、Prefect)中,容器生命周期管理通常由调度器自动完成。理解底层 docker create/start/stop/rm 操作,有助于排查容器调度异常、优化资源利用率。