Docker 容器的 Running(运行中)和 Starting(启动)有什么区别?
run 是"创建+启动"二合一(产生新容器),start 是"启动已存在的容器"(复用旧容器状态);running 是容器主进程正在执行的状态。本文讲清 docker run/start/create 的状态流转。
概念梳理:docker run = 创建新容器并启动(create + start 合体);docker start = 把一个已存在但停止的容器重新拉起(文件系统状态保留);docker create = 只创建不启动。Running 是状态描述——主进程正在执行;Starting 是动作——把容器从停止态转入运行态。
状态流转图
(不存在) --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 做不到——得 rm 后重新 run。这正是"容器配置是创建期定型"的体现。
常用命令对照
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 ...不存在,配置改不了 - restart 是停启同一容器:不换镜像不换配置
- Created 状态的容器:create 出来没 start 的,
docker ps -a可见,直接 start 即跑
观测云对照
容器状态流转全程留痕。 Created→Running→Exited 的每次转换,观测云容器事件都有记录;异常的 stop-start 抖动(频繁重启)由监控器按次数告警。
常见问题(FAQ)
Q:start 起来的容器能改环境变量吗?
A:不能。环境变量创建期定型;改配置的正确姿势是 rm + run(数据在卷里则无伤)。
Q:run 和 up(compose)什么关系?
A:docker compose up ≈ 按需 create+start+重建的编排版,配置变了自动重建容器。
Q:容器 stop 后里边的数据还在吗?
A:可写层保留,start 后原样可见;rm 才删除。