Docker 容器的 Running(运行中)和 Starting(启动)有什么区别?
run 是"创建+启动"二合一(产生新容器),start 是"启动已存在的容器"(保留可写层,不恢复进程内存);running 表示主进程运行,health: starting 则表示初始健康判定尚未完成。本文讲清 docker run/start/create 的状态流转。
概念梳理:docker run = 创建新容器并启动(create + start 合体);docker start = 把一个已存在但停止的容器重新拉起(文件系统状态保留);docker create = 只创建不启动。Running 是状态描述——主进程正在执行;starting 还可能是健康检查状态,可与 running 同时出现,表示容器已运行但尚未完成初始健康判定。
状态流转图
(不存在) --docker create--> Created(已创建未启动)
Created --docker start--> Running
(不存在) --docker run-----> Running(一步到位)
Running --docker stop---> Exited(停止,状态保留)
Exited --docker start--> Running(启动新进程,保留可写层,不恢复内存执行现场)
Exited --docker rm-----> (消失)
关键差异点
run vs start:
| docker run | docker start | |
|---|---|---|
| 对象 | 镜像(造新容器) | 已存在的容器 |
| 文件系统 | 全新(镜像+空可写层) | 沿用停止时的状态 |
| 配置 | 每次可给新参数(-p/-v/-e…) | 沿用配置;start 本身不能更改端口、挂载和环境变量 |
所以:想改端口/环境变量,start 做不到——需创建替代容器,并先验证持久数据和回退安排。部分资源限制/重启策略可用 docker update 调整。这正是"容器配置是创建期定型"的体现。
常用命令对照
docker run -d --name web nginx # 新建并跑
docker stop web # 停(状态保留)
docker start web # 原样拉起(端口、卷、写过的文件都在)
docker restart web # stop + start 连做
docker rm web # 连容器带可写层删除
docker ps # 看 Running 的
docker ps -a # 看所有状态的
易混点
- start 不接新参数:docker start -p 不存在,不能通过 start 修改发布端口
- restart 是停启同一容器:不换镜像不换配置
- Created 状态的容器:create 出来没 start 的,
docker ps -a可见,直接 start 即跑
常见问题(FAQ)
Q:start 起来的容器能改环境变量吗?
A:不能。环境变量创建期定型;改配置的正确姿势是 rm + run(仍需核对卷复用、应用兼容性和备份,不能保证无损)。
Q:run 和 up(compose)什么关系?
A:docker compose up ≈ 按需 create+start+重建的编排版,配置变了自动重建容器。
Q:容器 stop 后里边的数据还在吗?
A:普通容器的可写层保留;--rm 容器退出后自动删除,tmpfs 不持久化。start 不会恢复进程内存。