docker create 命令用于创建但不启动容器,生成初始状态为 created 的容器;它必须指定 IMAGE 参数,支持配置网络、卷、端口等,但仅冻结配置,不分配资源,需后续 docker start 启动。

直接回答:Docker Desktop 本身不提供图形界面按钮来“只创建、不启动”容器;你必须用 CLI 执行 docker create 命令,否则点界面上的 Run 按钮等价于 docker run —— 容器会立刻进入 running 状态。
为什么 Docker Desktop GUI 没有“创建但不启动”选项
Docker Desktop 的图形界面(Containers 标签页)设计目标是快速启停、调试和观察运行中容器。它的 “Run” 按钮底层调用的就是 docker run,跳过了 created 状态。这个状态在 GUI 中不可见、不可操作——docker ps -a 能看到 Created 状态的容器,但 Docker Desktop 的 UI 列表默认只显示 running 和 exited,created 容器不会出现在主列表里,除非你手动切到 Terminal 并执行 docker ps -a。
这不是 bug,而是 UI 抽象层级刻意省略了中间态。如果你需要 created 状态,就得绕过 GUI,走命令行。
docker create 必须带的参数和常见踩坑点
执行 docker create 时,最容易失败的是镜像不存在或参数顺序错乱:
-
IMAGE是强制参数,不能省;如果本地没有,Docker 会尝试拉取,但不会报错提示“拉取失败”,而是静默卡住几秒后返回空或报错No such image -
COMMAND和ARG必须写在IMAGE后面,且不能加=号(比如--name=myapp是合法选项,但bash就是 COMMAND,不能写成COMMAND=bash) - 如果你加了
-it但没指定交互式入口(如/bin/sh),容器能创建成功,但后续docker start -i会立即退出,因为前台进程无处可 attach - 端口映射
-p 8080:80和卷挂载-v ./data:/app/data在create阶段就生效,但端口实际未监听,直到你start
示例(安全可靠的做法):
docker create --name my-nginx -p 8080:80 -v $(pwd)/html:/usr/share/nginx/html:ro nginx:alpine
执行后输出一长串 container ID,状态为 Created,此时 docker ps 看不到它,docker ps -a 才能确认。
创建后怎么启动?docker start 的关键行为
docker start 不是“再跑一遍配置”,而是复用 create 时已固化的所有参数(网络、卷、env、restart 策略等)。这意味着:
- 你不能在
start时改端口、加新 volume 或换 env —— 那些只能重create,或删掉重建 - 加
-a会 attach 到 stdout/stderr,适合调试,但容器一旦退出,终端就返回;不加则后台运行(类似docker run -d) - 如果容器因崩溃退出过,
start仍能启动它,前提是 rootfs 没被破坏、挂载点路径还存在 - 重启策略(
--restart=always)在create阶段设置后,start会自动生效,不需要额外操作
启动示例:
docker start my-nginx
然后立刻验证:docker ps 应该看到它,curl http://localhost:8080 应该返回 Nginx 默认页。
容易被忽略的细节:created 容器其实很“脆”
Created 状态的容器不是“待机中的完整实例”,它只是文件系统层 + 配置快照,还没分配 PID namespace、没初始化网络栈、没加载 cgroups 限制。这意味着:
- 它不占 CPU、几乎不占内存(除少量元数据),但占用磁盘空间(可写层已存在)
- 如果你删掉它依赖的镜像(
docker rmi),docker start会失败,报错No such image—— 因为容器启动时仍需读取镜像层 - 它不能被
docker exec进入,因为 init 进程根本没跑起来;只有running状态才支持 exec - Windows/macOS 上通过 Docker Desktop 创建的容器,其
created状态在 WSL2 或虚拟机内核中是真实存在的,但宿主机文件系统看不到对应进程,别误以为“没创建成功”
所以,不要把 created 当作“轻量级预热”,它只是配置冻结点;真正要压测或验证行为,必须 start 之后再观察。











