应用程序,由您自己承担:将现有Docker映像作为一次性容器运行

在上一篇文章中,我们简要介绍了Docker的历史,然后甚至启动了“ Hello World!”容器。 但是,我们需要的不仅仅是Docker的“ Hello world!”水平,因为我们计划在日常开发中使用它,而不仅仅是在会议上进行演讲。

让我们继续,学习如何运行现有图像。

管理现有容器

运行一次hello-world两次,结果每次我们创建一个新容器。 他们各自在屏幕上输出了一些漂亮的文本,然后退出。 但是, 它们仍然在这里 ,不再运行。

列出现有容器

如果我们运行docker ps ,它将显示所有当前正在运行的容器,我们应该没有任何容器:

图1:当前正在运行的容器(没有任何容器)

但是,如果我们运行docker ps -a显示所有容器,则将在其中找到所有Status: Exited容器。 每个容器都有一个ID和一个可爱的友好名称,我们可以使用它们来解决它们。

图2:所有当前可用的容器(是否在运行)

卸下现有容器

为了摆脱它们,我们可以使用docker rm通过它们的ID或名称删除它们:

图3:删除所有当前可用的容器并检查是否还有剩余(没有)

手动列出每个名称并不是很好,因此这里有两件事可以帮助您:

图4:使用Docker和Bash的临时自动化
  1. docker为所有命令提供了shell docker全功能,从而大大减少了键入操作,甚至完成了可变部分(如名称)
  2. 通过将-q添加到任何列表,它将生成一个“安静”列表(仅ID),然后我们可以将其通过管道传递回另一条命令以进行即席自动化。

退出时自动删除容器

如果您想“我不想每次使用它们都删除容器!”,您并不孤单,至少还有一个人同意并添加了-- rm标志,该标志的含义完全相同:删除容器退出时。

图5:添加— rm运行到docker run使其退出后立即删除容器

有关这两点的示例,请参见图6

图6:管理现有的Docker容器
通过使用外壳补全和具有ID列表 asciinema.org 的临时自动化来删除现有的Docker容器

将现有Docker映像作为一次性容器运行

为了更好地说明运行一次性容器的细节,我创建了一个小图像来说明一些关键点。 您可以通过运行docker pull dkarlovi/sample-image

您不需要显式拉出映像,如第一部分中所述,如果它尚未在本地映像注册表中,则会在首次使用时将其拉出。

命令

我们将从运行一个简单的命令hello开始,该命令非常类似于我们在第一部分中所做的“ Hello World”示例。 您还可以访问所有源代码。

图7:运行示例图像

在第一个示例中,我们只是像以前一样运行图像并立即删除容器。

映像名称之后传递的所有内容均被视为“命令”。 该图像将命令hello设置为默认命令,因此第二个示例与第一个示例完全相同,只是我们明确命名了要运行的命令。

在第三个示例中, 我们将参数传递给正在运行的命令 。 由于所有内容均按原样传递给命令,因此可以采用命令可以理解的任何格式,Docker不会对其进行干预。

入口点

Docker映像中的入口点是容器运行时实际运行的入口点。 它应该(但不是必须!)运行传递的“命令”(如果根本要将其视为命令而不是参数,那就太混乱了,欢迎使用Docker)。

默认情况下,Docker中的入口点是sh -c ,它运行在映像名称之后传递的命令。 但是,我们可以将其更改为我们喜欢的任何内容,只要它在图像中即可。

我们使用的映像可能是出于传递某些特定可执行文件的想法而创建的。 例如,从上面的示例中不难想象某种利润丰厚的“ Hello world as a service”独角兽企业。

在这种情况下,图像创建者可能不希望其用户始终必须指定命令的名称,图像应代表命令本身。 我们通常将创建名为命令的映像(在本例中为dkarlovi/hello ),但也可以将Docker的--entrypoint标志与通用映像(例如dkarlovi/sample-image

图8:运行带有入口点的示例图像(注意,没有命令名称)

在第一个示例中,它的工作原理与以前完全相同。

在第二个示例中,我们实际上已经更改了Docker调用命令的方式! 具体参见图9
(注意: dkarlovi/hello 将命令 hello 硬编码为 ENTRYPOINT, 因此其行为与在命令行上指定时的行为完全相同)。

图9: ENTRYPOINT与CMD

这可以使图像更加用户友好,因为它可以允许将任意参数作为“命令”传递,并在传递给一个或多个命令运行之前对其进行解析。

卷和文件权限

到目前为止,我们已经向终端输出了问候语,这很好,但稍纵即逝。 您是否曾经希望您能重新阅读所有过去的“ Hello World!”旧消息,并回想起辉煌的日子? 有了卷,您可以!

通过将路径作为第二个参数传递,我们可以使用现有的hello图像将问候语存储在文件中:

图10:创建问候日志文件

好吧,这可行,只有文件位于容器中 ,而不是我们的本地系统中。 如第一部分所述,容器与本地系统隔离。 我们需要他们以某种方式进行社交。

根据经验,使反社会人士社交的最佳方法是让他们不知道自己在做什么。 这也适用于Docker容器:我们会欺骗它,以为它不是框架,但实际上是:

图11:使用卷在主机上创建问候日志文件

让我们分解一下:

  1. 我们添加一个新参数-v (AKA --volume ),该值采用:形式的值,实际上我们正在执行命令pwd (请注意反引号)以自动填充当前正在工作的主机目录,因此我们不需要手动指定它(请参阅:man pwd(1),`(反引号/反引号)在命令中是什么意思?有关更多详细信息)
  2. 这会将当前的本地主机路径安装为容器的/test路径,从容器的角度来看,该路径没有什么异常之处,它全部是本地的
  3. 然后,我们使用路径参数运行原始的hello命令,该参数将在/test/greetings.log创建(或附加到)文件
  4. 当我们检查文件时,它在那里并且包含我们的问候。 \ o /