4. Docker 容器生命周期:创建、启动、停止、重启与删除
Docker 容器的生命周期管理是容器化环境配置与调试的核心操作。理解容器从创建到销毁的完整流程,能够帮助开发者精准控制任务调度 DAG 中每个节点的运行状态。本章将系统讲解容器的五大核心操作:创建、启动、停止、重启与删除,并深入分析各阶段的状态转换与最佳实践。
4.1 容器生命周期状态机
容器在生命周期中会经历多个状态,每个操作对应明确的状态迁移。下图展示了容器从创建到删除的完整状态转换路径:
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 |
--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)
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 |
所有已停止容器 | 保留卷数据 |
--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 任务执行完毕,资源已释放。"
docker create/start/stop/rm 操作,有助于排查容器调度异常、优化资源利用率。