docker create仅创建容器不启动,docker run创建并立即运行;前者适用于配置校验、安全预检、批量预置等场景,后者适合快速部署。

docker create 和 docker run 看似只差一个字,实际行为差异很大:前者只创建容器(不启动),后者创建并立即运行。理解它们的参数共性与关键区别,能帮你更精准控制容器生命周期,尤其在调试、批量预置或安全策略场景中非常实用。
核心行为差异:创建 vs 创建+启动
docker create 命令生成一个处于“created”状态的容器,ID 可查但进程未运行,需显式执行 docker start 才真正运行;docker run 则是一气呵成:创建 → 启动 →(默认)前台附着。这意味着:
- docker create 更适合需要检查配置、挂载验证、权限预检后再启动的场景
- docker run 的 --rm 参数仅在此命令中有效,create 不支持自动清理(它本身就不运行)
- 若用 run 启动后立刻退出(如命令执行完即结束),容器状态变为 exited;而 create 后不 start,永远卡在 created
参数兼容性:大部分通用,但有关键例外
绝大多数容器配置参数(如 -v、-p、--network、-e、--name、--privileged)在 create 和 run 中完全一致,可直接复用。真正要注意的是以下几类:
- --detach (-d):run 支持,create 也支持——但对 create 来说加 -d 没意义,因为容器根本没启动;它只影响 run 的前台/后台行为
- --interactive (-i) / --tty (-t):run 中常用以保持交互式会话;create 接受这些参数,但不会生效——等你 start 时若没加 -i -t,依然无法 attach 进去
- 命令与参数位置:run 后可直接跟要执行的命令(如 run nginx:alpine nginx -g "daemon off;");create 也允许,但该命令仅被记录,直到 start 时才执行
实战对比:同一需求的两种写法
假设你想运行一个带挂载、端口映射、环境变量的 Redis 容器,并保留容器供后续多次启停:
- 用 create:docker create --name myredis -p 6379:6379 -v /data/redis:/data -e REDIS_PASSWORD=123456 redis:7-alpine → 得到容器 ID,状态为 created
- 再手动启动:docker start myredis → 容器运行,可连 6379
- 用 run(一次性):docker run -d --name myredis -p 6379:6379 -v /data/redis:/data -e REDIS_PASSWORD=123456 redis:7-alpine → 直接后台运行
- 若想用 run 实现“创建但不启动”,唯一办法是加 --entrypoint /bin/sh -c "sleep infinity" 类似兜底命令,再 docker stop ——但这已偏离设计本意,不如用 create 清晰
什么时候必须用 create?
不是所有场景都适合 run,以下情况 create 是更合理甚至唯一选择:
- CI/CD 流水线中预构建容器镜像并创建容器(配置校验通过后才 start)
- 安全加固流程:create 后用 docker inspect 检查挂载路径、cap-add、seccomp 配置是否符合基线,再决定是否启动
- 多容器协同启动前,先 create 所有容器(避免因依赖服务未就绪导致 run 失败退出),再统一 docker start
- 调试启动失败的容器:create 后 docker logs 或 docker diff 查看文件系统变化,比 run 后瞬间退出更易定位问题

















