介绍
Docker 是一种流行的容器化工具,用于为软件应用程序提供一个文件系统,该文件系统包含它们运行所需的一切。 使用 Docker 容器可确保软件以相同的方式运行,无论其部署在何处,因为它的运行时环境是无情的一致。
在本教程中,我们将简要概述 Docker 映像和 Docker 容器之间的关系。 然后,我们将更详细地了解如何运行、启动、停止和删除容器。
概述
我们可以将 Docker 映像 视为用于创建 Docker 容器的惰性模板。 映像通常从根文件系统开始,并在有序的只读层中添加文件系统更改及其相应的执行参数。 与典型的 Linux 发行版不同,Docker 映像通常仅包含运行应用程序所需的基本要素。 图像没有状态,也不会改变。 相反,它们构成了 Docker 容器的起点。
图像通过 docker run
命令变得栩栩如生,该命令通过在图像顶部添加读写层来创建 容器 。 这种只读层与读写层的组合被称为 联合文件系统 。 当对正在运行的容器中的现有文件进行更改时,该文件会从只读空间复制到应用更改的读写层。 读写层中的版本隐藏了原始文件,但不删除它。 读写层的变化只存在于单个容器实例中。 删除容器后,任何更改都会丢失,除非采取措施保留它们。
使用容器
每次您使用 docker run
命令时,它都会根据您指定的图像创建一个新容器。 这可能会造成混淆,因此让我们看一些示例:
第 1 步:创建两个容器
以下 docker run
命令将使用基础 ubuntu
映像创建一个新容器。 -t
将给我们一个终端,-i
将允许我们与之交互。 我们将依靠 Ubuntu 基础映像的 Docker 文件 、bash
中的默认命令将我们放入 shell。
docker run -ti ubuntu
命令行提示符更改以指示我们以 root 用户身份进入容器,后跟 12 个字符的容器 ID。
我们将通过在容器的 /tmp
目录中回显一些文本来进行更改,然后使用 cat
来验证它是否已成功保存。
echo "Example1" > /tmp/Example1.txt cat /tmp/Example1.txt
OutputExample1
现在,让我们退出容器。
exit
Docker 容器在它们发出的命令完成后立即停止运行,因此我们的容器在我们退出 bash shell 时停止。 如果我们运行 docker ps
,显示正在运行的容器的命令,我们将看不到我们的。
docker ps
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
如果我们添加 -a
标志,它显示 all 容器,停止或运行,那么我们的容器将出现在列表中:
docker ps -a
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11cc47339ee1 ubuntu "/bin/bash" 6 minutes ago Exited (127) 8 seconds ago small_sinoussi
创建容器时,会为其指定容器 ID 和随机生成的名称。 在这种情况下,11cc47339ee1 是容器 ID,small_sinoussi
是随机生成的名称。 ps -a
显示这些值,以及构建容器的映像 (ubuntu
)、创建容器时 (six minutes ago
) 以及运行的命令在其中(/bin/bash
)。 输出还提供容器的状态 (Exited
) 以及容器多久前进入该状态 (6 seconds ago
)。 如果容器仍在运行,我们会看到状态“Up”,然后显示它运行了多长时间。
如果我们重新运行相同的命令,则会创建一个全新的容器:
docker run -ti ubuntu
我们可以判断它是一个新容器,因为命令提示符中的 ID 不同,当我们查找 Example1 文件时,我们找不到它:
cat /tmp/Example1
Outputcat: /tmp/Example1: No such file or directory
这会使数据看起来好像消失了,但事实并非如此。 我们现在将退出第二个容器,看看它和我们创建的文件的第一个容器都在系统上。
exit
当我们再次列出容器时,两者都会出现:
docker ps -a
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6e4341887b69 ubuntu "/bin/bash" About a minute ago Exited (1) 6 seconds ago kickass_borg 11cc47339ee1 ubuntu "/bin/bash" 13 minutes ago Exited (127) 6 minutes ago small_sinoussi
第 2 步:重新启动第一个容器
要重新启动现有容器,我们将使用带有 -a
标志的 start
命令附加到它,并使用 -i
标志使其交互,然后是容器身份证或姓名。 请务必在以下命令中替换容器的 ID:
docker start -ai 11cc47339ee1
我们再次发现自己在容器的 bash 提示符下,当我们 cat
之前创建的文件时,它仍然存在。
cat /tmp/Example1.txt
OutputExample1
我们现在可以退出容器了:
exit
此输出显示容器内部所做的更改通过停止和启动它而持续存在。 只有当容器被移除时,内容才会被删除。 此示例还说明更改仅限于单个容器。 当我们启动第二个容器时,它反映了图像的原始状态。
第 3 步:删除两个容器
我们已经创建了两个容器,我们将通过删除它们来结束我们的简短教程。 docker rm
命令仅适用于停止的容器,允许您指定一个或多个容器的名称或 ID,因此我们可以使用以下命令删除两者:
docker rm 11cc47339ee1 kickass_borg
Output11cc47339ee1 kickass_borg
这两个容器,以及我们在其中所做的任何更改,现在都消失了。
结论
我们已经详细了解了 docker run
命令,以了解它如何在每次运行时自动创建一个新容器。 我们还了解了如何定位已停止的容器、启动它并连接到它。 如果您想了解有关管理容器的更多信息,您可能会对指南感兴趣,命名 Docker 容器:初学者的 3 个技巧。