Docker create 命令(超详细)

Docker create 命令:从零开始理解容器的“预创建”机制

在学习 Docker 的过程中,你可能会遇到 docker run 命令,它几乎成了启动容器的代名词。但你知道吗?docker run 实际上是两个动作的合体:创建容器启动容器。而 docker create 命令,正是专门负责“创建”这一步的工具。它就像盖房子前先画好图纸、准备好材料,不急着开工,但一切都已就绪。

对于初学者来说,理解 docker create 能帮你更清晰地掌握容器生命周期的底层逻辑。而对中级开发者而言,它在自动化部署、镜像构建、测试环境搭建等场景中,更是不可忽视的利器。


什么是 Docker create 命令?它和 run 有什么区别?

docker create 命令的作用是:在不启动容器的情况下,创建一个容器的配置文件和文件系统层。它不会运行容器,只是“预设”好一个容器的蓝图。

我们来对比一下 docker rundocker create 的区别:

操作 是否启动容器 是否返回容器 ID 是否立即占用资源 适用场景
docker run 快速启动测试、临时运行任务
docker create 批量创建、配置复用、自动化流程

你可以把 docker create 想象成“预制拼装件”:它把容器的“骨架”和“零件”都准备好,等你真正需要时再“一键启动”。


基础语法与常用参数详解

docker create 的基本语法如下:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

我们来逐个解析关键参数:

-d 或 --detach

让容器在后台运行(注意:这个参数对 create 无效,因为 create 本身不会启动容器,但后续用 start 启动时可以使用)

--name

为容器指定一个唯一的名称,方便后续管理。

-p 或 --publish

端口映射,将宿主机的端口映射到容器端口。

-v 或 --volume

挂载宿主机目录或文件到容器中,实现数据持久化。

--env 或 -e

设置环境变量,用于配置应用运行时参数。

--network

指定网络模式,如 bridgehostnone

--rm

容器停止后自动删除,适用于临时任务。


实战案例:用 create 创建一个 Nginx 服务容器

我们来通过一个真实案例,演示如何使用 docker create 来创建一个 Nginx 容器。

docker create \
  --name my-nginx \
  --publish 8080:80 \
  --volume /home/user/nginx/html:/usr/share/nginx/html \
  --env ENV=production \
  --network bridge \
  nginx:latest

代码注释说明:

  • --name my-nginx:为容器设置名称,便于后续操作。
  • --publish 8080:80:将宿主机的 8080 端口映射到容器的 80 端口,访问 http://localhost:8080 就能访问 Nginx。
  • --volume /home/user/nginx/html:/usr/share/nginx/html:将宿主机的 /home/user/nginx/html 目录挂载到容器内的 Nginx 默认网页目录,这样你可以随时修改网页内容。
  • --env ENV=production:设置环境变量 ENV 的值为 production,可用于 Nginx 配置脚本判断运行环境。
  • --network bridge:使用默认桥接网络,让容器能与外部通信。
  • nginx:latest:使用最新的 Nginx 镜像。

运行后,你会看到一个容器 ID 输出,例如:a1b2c3d4e5f6,但容器并不会运行。


为什么需要先 create 再 start?场景分析

在实际开发中,docker create 之所以有价值,是因为它能帮你实现“分步控制”和“批量管理”。

场景一:批量创建多个容器

假设你要部署 10 个独立的 Nginx 服务,每个服务监听不同的端口。你可以先用 create 创建全部容器,再统一启动:

for i in {1..10}; do
  docker create \
    --name nginx-$i \
    --publish 800$i:80 \
    --volume /data/nginx-$i:/usr/share/nginx/html \
    nginx:latest
done

for i in {1..10}; do
  docker start nginx-$i
done

这样做的好处是:先完成配置,再集中启动,避免因某个容器配置错误导致整体部署失败。

场景二:CI/CD 自动化流程

在持续集成环境中,你可能需要在测试前创建多个测试容器,但不立即运行。等到测试脚本准备好,再逐一启动。

docker create --name test-db --env DB_PASS=123456 mysql:8.0

docker start test-db

这样可以确保测试环境的“预创建”阶段与“启动执行”阶段解耦,提升流程的稳定性和可维护性。


查看与管理 create 后的容器

创建完成后,容器处于“停止”状态。你可以通过以下命令查看:

docker ps -a

输出中会看到你创建的容器,状态为 Exited(已退出),但仍在系统中存在。

你可以使用以下命令进行管理:

  • docker start <container-id>:启动容器。
  • docker stop <container-id>:停止容器。
  • docker rm <container-id>:删除容器。
  • docker inspect <container-id>:查看容器详细配置,比如端口、挂载点、环境变量等。

比如查看 my-nginx 容器的详细信息:

docker inspect my-nginx

输出内容包含 JSON 格式的完整配置,包括 HostConfig 中的端口映射、卷挂载路径、网络设置等,是调试和排查问题的利器。


常见误区与注意事项

误区 1:create 后容器就运行了

很多人误以为 docker create 之后容器就开始工作了。这是错误的create 只是创建配置,容器处于“未运行”状态,必须手动 start 才能运行。

误区 2:create 不能设置启动命令

其实可以。docker create 支持传入命令参数。例如:

docker create --name test-container ubuntu:20.04 /bin/bash -c "echo 'Hello World'"

这个命令创建了一个容器,但不会执行 echo,因为没有启动。只有 start 后才会运行。

误区 3:create 只能用于 web 服务

完全错误。create 可用于任何容器,包括数据库、定时任务、日志收集、数据处理等场景。


总结:Docker create 命令的核心价值

docker create 虽然不像 run 那样“即开即用”,但它在容器管理中扮演着“预配置”和“解耦”角色。它让你能:

  • 先配置,后启动,提升部署可控性;
  • 批量创建容器,实现自动化管理;
  • 在 CI/CD 流程中隔离环境准备与运行阶段;
  • 为容器生命周期管理提供更精细的控制粒度。

对于初学者,理解 create 有助于掌握 Docker 容器的完整生命周期;对于中级开发者,它是构建复杂应用架构的重要工具。

在实际项目中,不妨多尝试用 docker create 来“先搭架子,再点火运行”,你会发现容器管理变得更加清晰、可靠。


最后提醒

Docker 是一个强大的工具,但“用得好”比“用得快”更重要。掌握 docker create 命令,是你从“会用 Docker”走向“精通 Docker”的重要一步。别再只依赖 docker run 了,试试先 create,再 start,你会看到不一样的世界。