【问题标题】:Difference between Running and Starting a Docker container运行和启动 Docker 容器的区别
【发布时间】:2016-04-19 08:54:26
【问题描述】:

在实践中启动我做的一个容器:

docker run a8asd8f9asdf0

如果是这样,那该怎么办:

docker start

做吗?

说明书上说

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

【问题讨论】:

  • 运行 = 创建 + 开始
  • 我希望 OP 也包含“执行”
  • @MonicaHeddneck 有 docker execute ?
  • 如果您之前已停止此容器,则您对容器使用 start。如果您之前已删除此图像的容器,则您对图像使用 run。这是我认为的基本用法。

标签: docker


【解决方案1】:
  • run 运行 图像
  • start 启动一个容器

docker run doc 确实提到:

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

即docker run相当于API/containers/create然后/containers/(id)/start

do not run an existing container, you docker exec to it (since docker 1.3).
你可以restart an exited container

【讨论】:

  • @Tarik 你不需要将-i 添加到docker run 以进行交互过程吗?我的意思是,docker run 需要一个镜像来运行一个容器。
  • 似乎有人可以写出更详尽的回复。答案看起来不太解释。
  • 对我来说下一个问题是whats-the-difference-between-a-container-and-an-image stackoverflow.com/questions/21498832/…
  • @SohailSi docker exec 用于在正在运行的容器中运行命令。
  • 谢谢。我一直忘记这一点。现在在这里提到它是很好的。
【解决方案2】:

举例说明:

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

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

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

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

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

【讨论】:

  • 当您执行 docker run hello-world 时,它会从 Docker 打印 Hello!但是当您通过执行docker create hello-world 创建容器然后通过执行docker start 27c833038489 启动容器时,它不会打印该输出。那里发生了什么?
  • @ChamithraThenuwara:简单来说,容器总是监控一个任务,如果任务停止,容器就会停止。例如:您启动一个 Windows 服务器核心映像,然后运行 ​​cmd: 容器将等待该过程完成,因此在您杀死它之前什么都不会发生。因此,在您的情况下,您需要查看您启动的容器正在执行的任务是什么,并且有很多方法可以做到这一点,并且它们可以通过命令行相互取代 -it / run ...[COMMAND] - -、dockerfile [CMD] 或 docker-compose.yaml 入口点:。一开始有点复杂,但这就是它的地方,因为它是如此强大且可重复使用!
  • @ChamithraThenuwara: 因为docker run 默认在前台运行(使用-d 分离它),而docker start 默认在后台运行(使用-a 在前台运行)。所以,docker start -a 27c833038489 将打印 Hell from Docker 消息。这么多的一致性,嗯?
【解决方案3】:

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

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

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

【讨论】:

  • 是否需要为停止的容器创建卷以使数据持久保存?
  • @LoganPhillips 写入容器默认 union 文件系统层的文件和写入卷的文件之间的生命周期差异是:删除容器时,容器的联合文件系统层数据总是丢失 (@987654330 @)。另一方面,除非在命令行上明确提供了-v 选项,否则卷数据在容器的删除中仍然存在。可以直接检查主机系统上的卷位置。 See this article
  • 关于进程,run命令行末尾需要&吗?我需要它作为一项计数(24 小时)服务
  • 那么“docker create”的目的是什么?如何/何时使用?
  • 当您执行 docker run hello-world 时,它会打印“来自 Docker 的您好!”但是当您通过执行 docker create hello-world 创建容器然后启动容器时,它不会打印该输出。那里发生了什么?
【解决方案4】:

daniele3004的回答已经很不错了。

对于像我这样不时混淆runstart 的人来说,这只是一个又快又脏的公式:

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

【讨论】:

【解决方案5】:

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

容器自动停止后如何移除?--rm 标志添加到run 命令:

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

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

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 来阻止我们在之前的 sn-p 中使用无限命令 tail -f /dev/null 启动的这个挥之不去的容器。 p>

【讨论】:

  • 到目前为止,这是我读过的最好的答案。不仅回答了 OP 问题,而且在很小的空间和示例中解释了一些非常有用的典型用例。对我来说,我只是从这个开始,它确实解决了我的许多问题。谢谢!
  • 我同意这是一个很好的答案。但是,我对“一旦根进程完成,容器就会停止。在这一点上,它几乎没用。一个人不能再执行任何事情或复活容器。” - 我以为可以@ 987654340@又是这样吗?
【解决方案6】:

运行 - 创建使用图像和启动相同的容器。 (创建并开始)

start - 启动 docker list 中处于停止状态的容器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2018-05-16
    相关资源
    最近更新 更多