运行和启动Docker容器之间的区别


306

在实践中,我开始做一个容器:

docker run a8asd8f9asdf0

如果是这样,怎么办:

docker start

做?

在手册中说

启动一个或多个已停止的容器


101
运行=创建+开始
Fumisky Wells

4
我希望OP还包括“执行”,以及
莫妮卡Heddneck


@MonicaHeddneck有码头工人execute吗?
Koray Tugay

如果您之前已停止此容器,则可以对容器使用start。如果您已经删除了该图像的容器,则可以使用“ 运行到图像”。这是我认为的基本用法。
CodeSlave

Answers:


349

这是一个非常重要的问题,答案很简单,但很基本:

  1. 运行:创建图像的新容器,然后执行该容器。您可以创建同一图像的N个克隆。该命令是: docker run IMAGE_ID 而不是 docker run CONTAINER_ID

在此处输入图片说明

  1. 开始:启动以前停止的容器。例如,如果您使用命令停止了数据库,则docker stop CONTAINER_ID可以使用命令重新启动同一容器docker start CONTAINER_ID,并且数据和设置将相同。

在此处输入图片说明


1
是否需要为已停止的容器创建卷以使数据持久化?
Logan Phillips

@LoganPhillips生命周期写入容器的默认联合文件系统层的文件与写入卷的文件之间的区别是:删除容器(docker rm container_id)时,容器的联合文件系统层的数据始终会丢失。另一方面,除非-v在命令行上显式提供了选项,否则卷数据将在容器删除后仍然存在。可以直接检查主机系统上的卷位置。看到这篇文章
斯特凡

关于进程,需要&run命令行末尾吗?我需要将其作为出色的服务(24小时)
Peter Krauss

那么,“ docker create”的目的是什么?如何/何时使用?
约瑟夫·加格农

99
  • run运行图像
  • start启动一个容器

docker run文档确实提到:

docker run命令首先在指定图像上创建可写容器层,然后使用指定命令启动它。

也就是说,docker run等效于/containers/createthen 的API /containers/(id)/start

不运行现有容器,而是对其执行docker exec(自docker 1.3起)
您可以重新启动已退出的容器


@Tarik不必须添加-idocker run一个互动的过程?我的意思是,docker run需要一个图像来运行容器。
VonC

10
似乎有人可以写出更详尽的回应。答案看起来不太解释。
qartal

4
我下一个问题是什么最差之间-A-容器和一个图像 stackoverflow.com/questions/21498832/...
亚历Punnen

18

举例说明:

考虑您的计算机中有游戏(iso)图像。

当您run(将映像安装为虚拟驱动器)时,将创建一个虚拟驱动器,其中所有游戏内容都在虚拟驱动器中,并且自动启动游戏安装文件。[运行您的Docker映像-创建一个容器,然后启动它。]

但是,当您stop(类似于docker stop)运行它时,虚拟驱动器仍然存在,但会停止所有进程。[由于容器存在,直到被删除为止]

而当你这样做 start(类似于docker start),游戏文件将从虚拟驱动器开始执行。[启动现有容器]

在此示例中-游戏映像是您的Docker映像,虚拟驱动器是您的容器。


8

daniele3004的答案已经很不错了。

只是一个快速和肮脏的公式我这样的人谁混淆了run,并start时不时:

docker run [...]= docker pull [...]+docker start [...]


2
这不是真的。根据官方文档,"...docker run is equivalent to the API /containers/create then /containers/(id)/start.(来源:docs.docker.com/engine/reference/commandline/run
sshh

2

run命令从映像创建一个容器,然后在该容器上启动根进程。与运行它run --rm标志将节省您以后在删除无用死容器的麻烦,可以让你忽略的存在docker startdocker remove干脆。

在此处输入图片说明

run 命令执行一些不同的操作:

docker run --name dname image_name bash -c "whoami"
  1. 从图像创建容器。此时,容器将有一个ID,如果有一个,则可能有一个名称,它将显示在docker ps
  2. 启动/执行容器的根进程。在上面的代码中将执行bash -c "whoami"。如果一个人跑docker run --name dname image_name没有命令执行容器将立即进入停止状态。
  3. 根进程完成后,容器将停止。在这一点上,它几乎没有用。人们无法再执行任何操作或使该容器复活。基本上有两种方法可以退出停止状态:从停止的容器中删除容器或创建检查点(即映像)以运行其他内容。必须先运行docker remove以相同名称启动容器。

自动停止后如何取出容器?--rmrun命令添加标志:

docker run --rm --name dname image_name bash -c "whoami"

如何在单个容器中执行多个命令?通过防止该根进程死亡。这可以通过在--detachedflag开头运行一些无用的命令,然后使用“ execute”运行实际命令来完成:

docker run --rm -d --name dname image_name tail -f /dev/null
docker exec dname bash -c "whoami"
docker exec dname bash -c "echo 'Nnice'"

那我们为什么需要docker stop呢?为了停止我们在上一片段中使用endless命令启动的挥之不去的容器tail -f /dev/null

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.