Docker run与create的区别

132

docker rundocker create 命令有什么区别?

我通常使用 run,但有时在文档中看到 create

Docker 的 --help 告诉:

create    Create a new container
run       Run a command in a new container

这是否意味着当我们需要向新容器传递命令时使用 run?那么 create 的目的是什么呢?

7个回答

182

docker run = docker create + docker start.


67
实际上,我刚刚花了几个小时学习到,docker run = docker create + docker start + docker attach。如果没有attach,启动的容器将在后台运行。 - webbower
是的,您也可以使用“docker start -a”进行附加,或者“docker start -ai”。 - Nicofisi

121

从docker 文档中:

docker create命令在指定的镜像上创建一个可写的容器层,并准备运行指定的命令。然后将容器ID打印到STDOUT。 这类似于使用 docker run -d ,但容器永远不会启动。您随后可以使用docker start命令在任何时候启动容器。

当您希望提前设置容器配置以便在需要时就绪时,这很有用。新容器的初始状态已被创建。


3
强调相似性,--run 命令接受与 --create 命令完全相同的参数(除了 --detach、--detach-keys 和 --sig-proxy 这几个额外参数),详情请见 https://docs.docker.com/v17.09/engine/reference/commandline/run/#options。 - Marvin

19

1
你写道:“docker run 创建容器(与 docker create 相同),并运行它。” <--- 循环定义,而且你还没有确定 exec 和 start 之间的区别以及你所指的“运行它”的含义。 (当你说“运行它”时,如果我们看看 docker run 中的 run 的定义,它意味着创建和运行,因此你会得到无限数量... 因此,你可能是指比那少的东西,当你说“运行它”时..但然后你应该将“运行它”与 exec 和 start 区分开来,你是指 start 和 exec 还是仅指 start)。也许 -d 意味着启动但不执行。没有 -d 就是启动和执行。 - barlop

10
其他回答已经提到了这点,但我想展示等效的Shell命令行,因为它可以使问题更加清晰:
$ docker run myimage

等同于

$ docker start -a $(docker create myimage)

这里使用docker create从指定的镜像创建一个容器,并输出创建的容器ID,接着使用docker start命令来启动该容器。选项-a会附加终端,从而使容器在前台运行,这是docker run命令的默认行为。

如果一个容器已经被创建但从未被启动过,它将具有Created状态;可以用docker container ls -a命令查看它。


9
我对docker还不熟悉,但已经开始尝试使用它了;我的理解是docker run实际上执行以下操作(按顺序):docker createdocker startdocker attach,因为在执行'run'命令后立即附加到活动shell。

1
刚刚在您的回答之前发表了一条评论,后来才注意到。真希望早一个小时看到这个。 - webbower

7

创建容器:

enter image description here

启动容器:

enter image description here

使用单个命令创建和启动容器:

enter image description here

现在,我们必须深入了解创建和启动过程。

创建容器的过程就是从镜像中获取文件系统,并为在新容器中使用做准备。当我们创建容器时,我们只是准备或设置文件系统快照以用于实际启动容器。 enter image description here

因此,创建容器涉及到文件系统,而启动容器则实际上执行启动命令。 实际上,要启动容器,我们需要执行启动命令,这可能会启动进程。

在终端中查看: 当我运行命令“sudo docker create hello-world”时,它会打印以下输出。 enter image description here

在输出中,我们看到打印出的字符。这是刚刚创建的容器的ID,现在我可以通过运行Docker start在该容器内执行hello world命令。 enter image description here

因此,在此处发生了什么,首先,我们准备容器,并使文件系统准备就绪。 然后,在此之后,我们使用Docker start实际上执行了主要的启动命令。

-a 在docker start命令中用于观察容器的输出并将其打印到您的终端。

因此,Docker run和docker start之间的差异非常小,默认情况下,Docker run将向您显示来自容器的所有日志或所有信息。默认情况下,Docker start则相反,不会向您显示来自终端的信息。

现在您知道何时需要使用Run / Create / Start。


-5

Docker run 命令主要用于在容器中运行命令。

docker run -it <Container Name> /bin/bash

以上内容是用于创建Bash终端并使我们能够在容器中使用Bash命令。 Docker create用于从Docker镜像创建容器。
docker create -d /var/lib:/var/lib --name docker-ubuntu ubuntu

以上是创建一个名为“docker-ubuntu”的容器,其基于镜像“ubuntu”来构建的 Docker 容器。

1
你可以直接运行 docker run -it <容器名称> 而不需要再运行 /bin/bash。例如,Ruby 容器会自动运行一个名为 irb 的可执行文件。此外,你也可以使用 run -d 命令来启动 dockersamples/static-site 容器,该容器不需要登录。因此,我认为它并不是执行 exec 命令,而是直接启动容器。 - barlop
通过使用“docker run”,您可以启动已创建的容器,如果尚未创建,则会创建并运行。 - Sergii Getman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接