| 策略 | 说明 | 触发条件 | 适用场景 |
|---|---|---|---|
no |
不自动重启 |
永不自动重启 |
一次性任务(batch job)、调试容器 |
always |
总是重启 |
无论退出码是什么,总是重启(包括手动 |
长期运行的关键服务(需配合 |
on-failure |
失败时重启 |
仅当容器以 非零退出码 退出时才重启,可设最大重试次数 |
可能因暂时性错误退出的服务,防止无限重启 |
unless-stopped |
除非手动停止,否则总是重启 |
类似 always,但 手动 |
生产关键服务,避免运维手动停止后被意外拉起 |
生产推荐:unless-stopped+ 健康检查 + 资源限制 + 监控告警。
在 Docker 中,容器的运行状态(State)可以分为多种,每种状态反映了容器在其生命周期中的不同阶段。
你可以通过 docker ps(运行中容器)和 docker ps -a(所有容器)查看状态,也可以通过 docker inspect <容器名或ID>查看更详细的 State字段。
| 状态 | 含义 | 说明 |
|---|---|---|
created |
已创建 |
容器已创建但未启动,文件系统已准备好,但进程未运行。 |
running |
运行中 |
容器正在运行,主进程处于活动状态。 |
paused |
已暂停 |
容器内的所有进程被暂停(SIGSTOP),内存状态保留,可恢复。 |
exited |
已退出 |
容器主进程已终止(正常退出或异常退出),退出码非 0 表示异常。 |
dead |
死亡 |
容器无法被正常停止或移除,通常是 Docker 引擎内部错误状态。 |
restarting |
重启中 |
容器正在重启(例如设置了 |
removing |
移除中 |
容器正在被 |
Usage: docker container COMMAND
docker container —help
| 指令 | 描述 | |
|---|---|---|
-i , —interactive |
交互式 |
|
-t , —tty |
分配一个伪终端 |
|
-d , —detach |
运行容器到后台 |
|
-e , —env |
设置环境变量 |
|
-p , —publish list |
发布容器端口到主机 |
|
-P , —publish-all |
发布容器所有 EXPORT 端口到宿主机随机端口 |
|
—name string |
指定容器名称 |
|
-h , —hostname |
设置容器主机名 |
|
—ip string |
指定容器 IP ,只能用于自定义网络 |
|
—network |
连接容器到一个网络 |
|
—mount mount |
将文件系统附加到容器 |
|
-v , —volume list |
绑定挂载一个卷 |
|
—restart string |
容器退出时重启策略,默认 no ,可选值: [always\ |
on-failure] |
| 选项 | 描述 |
|---|---|
ls |
列出容器 |
inspect |
查看一个容器或者多个容器的详细信息 |
exec |
在运行容器中执行命令 |
commit |
创建一个新镜像来自一个容器 |
cp |
拷贝文件 / 目录到一个容器 |
logs |
获取一个容器日志 |
port |
列出或指定容器端口映射 |
top |
显示一个容器运行的进程 |
stats |
显示容器资源使用统计 |
stop/start |
停止 / 启动一个或多个容器 |
rm |
删除一个或多个容器 |
# 基础运行(后台模式 + 端口映射) docker run -d --name web -p 8080:80 nginx:1.25 # 指定资源限制(CPU/Memory) #可以实现资源限制热更新 docker update docker run -d --name limited \ --cpus="0.5" \ # 限制 50% CPU --memory="256m" \ # 限制 256MB 内存 --memory-swap="512m" \ # 允许使用交换分区(总内存+Swap) nginx:1.25 # 挂载卷(数据持久化) # Docker Volume(推荐生产) # Bind Mount(开发调试) docker run -d --name db \ -v mysql_data:/var/lib/mysql \ # Docker Volume(推荐生产) -v /host/config:/etc/mysql/conf.d \ # Bind Mount(开发调试) mysql:8.0 # 健康检查(容器自愈) docker run -d --name app \ --health-cmd="curl -f http://localhost/health || exit 1" \ --health-interval=30s \ --health-retries=3 \ myapp:1.0
关键参数:
-d:后台运行(Daemon 模式)。-p:端口映射(主机端口:容器端口)。--cpus/--memory:限制资源,防止“吵闹邻居”效应。-v:挂载卷(Volume 比 Bind Mount 更安全)。--health-*:定义健康检查(配合编排工具自动重启)。# 查看运行中的容器(含状态、端口)
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
# 查看所有容器(包括已停止)
docker ps -a
# 停止/启动容器
docker stop web # 优雅停止(SIGTERM → SIGKILL)
docker start web
# 强制终止容器
docker kill -s KILL web # 直接发 SIGKILL(慎用)
# 重启容器
docker restart web
# 删除容器(必须已停止)
docker rm web
docker rm -f web # 强制删除(即使运行中)
# 查看容器日志(实时跟踪)
docker logs -f --tail=100 web # -f 跟踪,--tail 显示最后 N 行
# 进入容器 Shell(调试)
docker exec -it web /bin/bash # 交互式终端
docker exec web ls /app # 非交互式命令
SRE 建议:
docker exec,优先通过日志和监控排查问题。--health-*参数确保容器异常时自动重启(如 --restart=on-failure:3)。# 实时查看容器资源占用(CPU/MEM/NetIO)
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
# 导出容器指标(对接 Prometheus)
docker stats --no-stream --format '{"name":"{{.Name}}","cpu":{{.CPUPerc}},"mem":{{.MemUsage}}}'
生产实践:
docker stats数据接入 Grafana,设置告警规则(如 MEM > 90% 持续 5min)。