运行和启动Docker容器的区别

在实践中开始容器我做:

docker run a8asd8f9asdf0

如果是这样的话,怎么办:

docker start

做什么?

手册上写着

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

152434 次浏览
  • run运行一个图像
  • start开始一个容器

docker run医生中提到:

docker run命令首先在指定的映像上创建一个可写容器层,然后使用指定的命令开始它。

也就是说,docker 运行相当于API /containers/create,然后是/containers/(id)/start

< p >你不要运行一个现有的容器,你可以对它执行docker exec(从docker 1.3开始)
你可以重新启动退出的容器.

举例说明:

假设您的计算机中有一个游戏(iso)映像。

当你run(挂载你的映像作为一个虚拟驱动器)时,一个虚拟驱动器被创建,虚拟驱动器中的所有游戏内容和游戏安装文件被自动启动。运行你的docker镜像-创建一个容器,然后启动它。

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

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

在本例中,游戏映像是Docker映像,虚拟驱动器是容器。

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

  1. 执行:创建镜像的新容器,并执行该容器。您可以创建同一映像的N个克隆。命令如下: docker run IMAGE_ID 而不是 docker run CONTAINER_ID

enter image description here

  1. 启动:启动先前停止的容器。例如,如果你已经用命令docker stop CONTAINER_ID停止了一个数据库,你可以用命令docker start CONTAINER_ID重新启动同一个容器,数据和设置将是相同的。

enter image description here

daniele3004的答案已经很好了。

只是一个又快又脏公式,适用于像我这样经常混淆runstart的人:

__abc0 = __abc1 + __abc2

run命令从映像创建一个容器,然后在这个容器上启动根进程。使用run --rm标志运行它将为你省去事后删除无用的死容器的麻烦,并允许你完全忽略docker startdocker remove的存在。

enter image description here

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

如何删除容器一旦它被自动停止?< / em >run命令添加一个--rm标志:

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

如何在一个容器中执行多个命令?< / em >通过防止根进程死亡。这可以通过在开始时运行一些带--detached标志的无用命令来实现,然后使用"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'"

要停止我们在前一代码段中使用无尽命令tail -f /dev/null启动的滞留容器。

更明智的做法是将该命令命名为“new”;而不是"run"

Run创建一个现有(或可下载)映像的容器实例并启动它。