问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Docker容器的工作原理

创作时间:
作者:
@小白创作中心

Docker容器的工作原理

引用
1
来源
1.
https://learn.microsoft.com/zh-cn/training/modules/intro-to-docker-containers/4-how-docker-containers-work?ns-enrollment-id=learn.administer-containers-in-azure&ns-enrollment-type=learningpath

Docker容器是现代软件开发和部署中不可或缺的技术组件。本文将详细介绍Docker容器的工作原理,包括容器的生命周期管理、存储配置和网络配置等内容。通过本文的学习,读者将能够掌握Docker容器的基本操作命令,理解存储和网络的配置选项,并能够在实际应用中灵活运用这些知识。

Docker容器的工作原理

在本示例中,你要开发一个订单跟踪门户,供公司的各个专卖店使用。生成Docker映像后,现在由运营团队负责订单跟踪门户的部署、更新推出和管理。

在之前的单元中,你了解了如何生成Docker映像。在这里,你将简单了解下Docker容器的生命周期以及如何管理容器。你还将了解如何考虑为容器配置数据存储和网络选项。

如何管理Docker容器

Docker容器具有可用于管理和跟踪容器状态的生命周期。

若要将容器置于运行状态,请使用run命令。还可重启已在运行的容器。重启容器时,容器将收到一个终止信号,以允许任何正在运行的进程在容器的内核终止之前正常关闭。

容器在暂停、停止或终止之前将被视为处于运行状态。但是,容器也可能会自行退出正在运行状态。当正在运行的进程完成或者进程进入错误状态时,容器可自行退出。

若要暂停正在运行的容器,请使用pause命令。此命令会暂停容器中的所有进程。

若要停止正在运行的容器,请使用stop命令。stop命令通过向正在运行的进程发送终止信号来正常关闭该进程。进程关闭后,容器的内核将终止。

如果需要终止容器,请使用kill命令发送终止信号。容器的内核会捕获该终止信号,但正在运行的进程不会。此命令会强制终止容器中正在运行的进程。

最后,若要删除处于停止状态的容器,请使用remove命令。删除容器后,将销毁存储在容器中的所有数据。

如何查看可用容器

若要列出正在运行的容器,请使用docker ps命令。若要查看处于所有状态的所有容器,请传递-a参数。

下面是一个示例:

docker ps -a

该命令的输出如下所示:

CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS           PORTS        NAMES
d93d40cc1ce9    tmp-ubuntu:latest  "dotnet website.dll …"  6 seconds ago    Up 5 seconds        8080/tcp      happy_wilbur
33a6cf71f7c1    tmp-ubuntu:latest  "dotnet website.dll …"  2 hours ago     Exited (0) 9 seconds ago            adoring_borg

需要查看前述输出中的以下三个项:

  • IMAGE列中列出的映像名称;在此示例中为tmp-ubuntu:latest。请注意,你可以从同一映像创建多个容器。这是一种强大的管理功能,可用于在解决方案中实现缩放。
  • STATUS列中列出的容器状态。在本例中,一个容器正在运行,一个容器已退出。容器的状态通常是容器运行状况的第一个指标。
  • NAMES列中列出的容器名称。除了第一列中的容器ID之外,容器还会接收名称。在本例中,由于你没有为每个容器显式提供名称,因此,Docker为容器提供了随机名称。若要使用--name标志为容器提供显式名称,请使用run命令。

为什么要为容器命名?

此功能允许你运行同一映像的多个容器实例。容器名称是唯一的,这意味着如果指定了某一名称,则不能重复使用该名称来创建新的容器。重复使用特定名称的唯一方法是删除之前的容器。

如何运行容器

若要启动容器,请使用docker run命令。只需按名称或ID指定要运行的映像,即可从映像启动容器。通过此方式启动的容器提供交互式体验。

此处,若要在网站处于后台的情况下运行容器,请添加-d标志。

docker run -d tmp-ubuntu

在此示例中,该命令仅返回新容器的ID。

指定要运行的映像后,Docker将查找该映像,从该映像加载容器,并执行指定为入口点的命令。此时,容器可供管理。

如何暂停容器

若要暂停容器,请运行docker pause命令。下面是一个示例:

docker pause happy_wilbur

暂停容器会暂停所有进程。通过此命令,容器可在后续阶段继续执行进程。docker unpause命令将取消挂起指定容器中的所有进程。

如何重启容器

若要重启容器,请运行docker restart命令。下面是一个示例:

docker restart happy_wilbur

容器会收到stop命令,然后是start命令。如果容器未响应stop命令,将发送kill信号。

如何停止容器

若要停止正在运行的容器,请运行docker stop命令。下面是一个示例:

docker stop happy_wilbur

stop命令会将终止信号发送到容器和容器中正在运行的进程。

如何删除容器

若要删除容器,请运行docker rm命令。下面是一个示例:

docker rm happy_wilbur

删除容器后,将销毁容器中的所有数据。考虑存储数据时,始终将容器视为临时容器非常重要。

Docker容器存储配置

如前文所述,如果容器中的应用需要存储数据,则始终将容器视为临时容器。

假设我们的跟踪门户在应用根的子文件夹(即直接到容器文件系统)中创建了一个日志文件。当应用将数据写入日志文件时,系统会将数据写入可写容器层。

虽然此方法很有效,但遗憾的是,它存在一些缺点:

  • 容器存储是临时的。日志文件不会在容器实例之间存留。例如,假设你停止并删除容器。当你启动新容器实例时,新实例将基于指定的映像,而以前的所有数据将丢失。请记住,删除容器时,将随容器销毁容器中的所有数据。
  • 容器存储与底层主机耦合。容器与底层主机耦合,因此很难从容器访问或移动日志文件。必须连接到容器实例来访问该文件。
  • 容器存储驱动程序性能较低。容器实现存储驱动程序,以允许应用写入数据。此驱动程序引入额外抽象来与主机操作系统内核通信,比直接写入主机文件系统的性能要低。

容器可以使用两种选项来保持数据。第一种选项是使用卷,第二种选项则是绑定装载。

什么是卷?

卷存储在主机文件系统上的特定文件夹位置。选择一个文件夹,确保其中的数据只能由Docker进程修改。

Docker通过运行docker volume create命令创建和管理新卷。此命令可以构成Dockerfile定义的一部分,这意味着你可以在容器创建过程中创建卷。如果在第一次尝试将卷装载到容器中时,该卷不存在,则Docker将创建该卷。

卷存储在主机文件系统上的目录中。Docker装载和管理容器中的卷。装载后,这些卷将与主机隔离。

多个容器可以同时使用相同的卷。当容器停止使用卷时,不会自动删除这些卷。

在本示例中,你可以在容器主机上创建一个目录,并在创建跟踪门户容器时将此卷装载到容器中。当跟踪门户记录数据时,你可以通过容器主机的文件系统访问此信息。即使删除了容器,你仍可以访问此日志文件。

Docker还为第三方公司提供了一种生成加载项以用作卷的方法。例如,Azure存储提供了一个插件,用于将Azure存储装载为Docker容器上的卷。

什么是绑定装载?

绑定装载在概念上与卷相同;但是,你可以在主机上装载任何文件或文件夹,而不是使用特定文件夹。你还希望主机可以更改这些装载的内容。与卷一样,如果你要装载的绑定不存在于主机上,系统将创建该绑定装载。

与卷相比,绑定装载的功能有限,虽然性能更高,但仍依赖于具主机上的特定文件夹结构。

卷是公认的用于容器的首选数据存储策略。

对于Windows容器,可以使用另一个选项:可以将SMB路径装载为卷,并将其提供给容器。这可以让不同主机上的容器使用相同的持久存储。

Docker容器网络配置

默认Docker网络配置允许在Docker主机上隔离容器。借助此功能,可以生成和配置可彼此安全通信的应用。

Docker为Linux和Windows提供不同的网络设置。

对于Linux,有六个预配置的网络选项:

  • 桥接
  • 主机
  • 覆盖
  • IPvLan
  • MACvLan

对于Windows,有六个预配置的网络选项:

  • NAT(网络地址转换)
  • 透明
  • 覆盖
  • L2Bridge
  • L2Tunnel

可以根据容器的网络要求选择要向其应用的网络配置。

什么是桥接网络?

启动容器而未指定任何其他网络配置时,默认对容器应用桥接网络配置。此网络是容器使用的内部专用网络,它将容器网络与Docker主机网络隔离。

桥接网络中的每个容器都分配有一个IP地址和子网掩码,主机名默认为容器名称。允许连接到默认桥接网络的容器按IP地址访问其他通过桥接网络连接的容器。桥接网络不允许使用主机名在容器之间进行通信。

默认情况下,Docker不会发布任何容器端口。若要在容器端口和Docker主机端口之间启用端口映射,请使用Docker端口--publish标志。

publish标志可有效配置映射端口的防火墙规则。

在本例中,浏览到端口80的客户端可以访问你的跟踪门户。必须将端口80从容器映射到主机上的可用端口。你在主机上打开了端口8080,因此可设置如下标志:

--publish 8080:80

任何浏览到Docker主机IP和端口8080的客户端都可以访问跟踪门户。

除了特定于Linux的配置,Windows主机上的NAT网络的功能与桥接网络相同。此外,NAT是Windows上的默认网络,除非另行指定,否则所有容器都将连接到NAT。

什么是主机网络?

通过主机网络,你可以直接在主机网络上运行容器。此配置在网络级别有效地消除了主机与容器之间的隔离。

在本例中,假设你决定将网络配置更改为主机网络选项。仍可使用主机IP访问跟踪门户。现在,可以使用已知端口80,而不是映射的端口。

请记住,容器只能使用主机尚未使用的端口。

在Windows上,主机网络不可用。在Windows主机上,无法在主机和容器之间共享相同的IP地址(网络堆栈)。NAT网络的功能非常类似于桥接网络,“覆盖”选项为容器提供主机所在网络中的一个IP地址,但不是同一个IP地址。

覆盖和其他网络选项

对于更高级的方案,Linux和Windows都提供了其他网络选项。例如,覆盖选项从主机网络创建虚拟交换机,使该网络上的容器可以从DHCP服务器获取IP地址,或使用该网段的IP地址进行操作。此外,通过Docker,第三方供应商可以创建网络插件。

什么是“无”网络?

若要禁止容器使用网络,请使用“无”网络选项。如果应用程序不使用网络,或者你只想验证应用程序是否在容器中按预期运行,这可能很有用。

操作系统注意事项

请记住,各桌面操作系统上的Docker网络配置选项存在差异。例如,使用桥接网络时,Docker0网络接口在macOS上不可用;Windows和macOS桌面版均不支持使用主机网络配置。

这些差异可能会影响开发者配置用于管理容器开发的工作流。此外,容器业务流程协调程序还可能在Docker设置的基础上提供其他网络配置。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号