Docker - 容器与主机



Docker 容器是轻量级、可移植、自包含的单元,包含软件及其运行所需的一切:代码、运行时库和设置。它们在不同的环境中始终如一地工作;因此,可以保证软件在非生产环境和生产环境中都能以相同的方式工作。

另一方面,Docker 主机是安装并运行 Docker Engine 的机器。这些可能是物理服务器、虚拟机,甚至基于云的实例。

在本章中,让我们详细了解 Docker 容器与 Docker 主机之间的区别。

什么是 Docker 容器?

Docker 容器是轻量级、可移植的软件打包单元,不仅包含应用程序代码,还包含运行时和库以及在任何地方运行和执行相同的其他设置。它们作为任何主机操作系统上的独立进程运行。每个容器都必须共享操作系统内核,但与其他容器具有不同的环境。

这允许有效地利用资源。由于这种隔离,不同版本的软件及其依赖项不会相互干扰;因此,容器非常适合开发、测试和部署。Docker 容器支持轻松集成和持续部署,这有助于快速可靠地交付应用程序。

什么是 Docker 主机?

Docker 主机是安装 Docker Engine 的物理机或虚拟机;它创建了一个运行 Docker 容器的环境。它提供对 CPU、内存、存储和网络的访问,容器利用这些资源并作为独立进程运行,以允许它们共享主机的相同操作系统内核。

它隔离容器并管理资源,从而有效且安全地支持多个容器的运行。Docker 主机帮助组织灵活且可控地在各种环境中管理、扩展和部署容器化应用程序。

Docker 容器和主机的区别

Docker 为在容器内开发、交付和运行应用程序提供了一个强大的平台。尽管 Docker 容器和 Docker 主机是生态系统中的两个重要元素,但它们的角色却大不相同。

下表重点介绍了 Docker 容器和 Docker 主机之间的主要区别:

特征 Docker 容器 Docker 主机
用途

轻量级、可移植且自包含的对象;它们包含一个应用程序及其所有依赖项。

这意味着软件在不同的环境中始终如一地运行。

提供 Docker 容器基本环境的物理机或虚拟机,通过运行 Docker Engine,提供 CPU、RAM 和存储空间等基本资源。
操作 作为主机操作系统上的独立进程运行。它们都将在相同的内核上运行,但具有独立的环境。 运行多个容器,管理它们之间的资源分配和隔离。
资源管理 与主机共享底层操作系统内核并有效地使用其资源,而无需整个操作系统实例的所有开销。 在许多容器之间共享可用的系统资源并有效地平衡它们。
隔离 在应用程序级别提供隔离,确保不同的应用程序及其依赖项不会相互干扰。 提供一个安全的容器运行环境,使用主机操作系统来保持隔离和控制。
部署 由于其“轻量级”特性,它们可以轻松地重新定位到不同的 Docker 主机,因此可在各种环境(从开发到生产)中移植和扩展。 这是部署容器的基础层,它提供了容器操作和编排所需的必要基础设施。

Docker 容器和主机如何相互交互?

Docker 容器和主机之间的交互是一个多维活动,Docker Engine 通过它来协调创建、管理和运行容器化应用程序。现在,让我们深入了解此概念的细节。

镜像管理

拉取镜像 − 当用户请求从本地不可用的镜像运行容器时,Docker Engine 会与容器注册表(如 Docker Hub)通信以下载该镜像。镜像充当容器的蓝图。

镜像存储 − 然后在主机的文件系统上进行下载镜像的结构化存储,允许 Docker Engine 有效地获取和进一步利用它们。

构建镜像(可选) − 如果要创建自定义镜像,则需要编写一个 Dockerfile 来描述如何构建镜像。此文件将由 Docker Engine 处理,执行每个指令将逐层创建一个镜像。

容器隔离和创建

命名空间隔离 − Docker 引擎使用内核命名空间为每个容器提供隔离的操作系统视图。这意味着每个容器都有不同的进程 ID、网络接口、挂载点等;因此,一个容器不会干扰另一个容器或主机。

控制组 (cgroups) − cgroups 用于限制和管理容器可以使用多少资源,从而确保容器之间的资源公平性,并避免一个容器消耗所有资源的问题。

联合挂载文件系统 − Docker 本身使用联合挂载文件系统,从而提供了一种处理容器中层的有效解决方案。这允许多个容器共享公共镜像层,同时保持其可写层以实现数据持久性。

网络

桥接网络 − 默认情况下,Docker Engine 在主机上建立一个虚拟桥接网络 - 例如 docker0,并将容器添加到此桥接网络,以便它们相互通信并在外部通信。

端口映射 − 您还可以公开容器上的端口并将其映射到主机上的端口。这样,该容器内的服务就可以从主机的网络或互联网访问。

自定义网络 − Docker 支持桥接、覆盖网络和 macvlan 等网络驱动程序来创建具有特定隔离需求的自定义拓扑。

存储

− 卷是独立于容器的持久性存储。它们允许在容器之间共享数据,并在容器停止或删除后仍然存在。

绑定挂载 − 这是一种可以在主机和容器之间共享文件和目录的方式。它提供了很高的存储灵活性,但会失去隔离性。

运行时管理

运行/停止容器 − Docker Engine 运行容器生命周期的所有各个阶段,例如启动、停止、重新启动和暂停,具体取决于需要。您可以监视容器的资源使用情况(例如 CPU 和内存),查看日志以进行调试,并以其他方式了解应用程序的行为。

安全 − Docker 引擎实施安全措施以隔离容器,从而限制它们对主机资源的访问。还有许多标志和选项可用于管理功能和容器的安全配置文件。

与 Docker 容器和主机交互的命令

在这里,我们将重点介绍一些可用于与 Docker 容器和主机交互的命令:

Docker Run

“docker run”命令从指定的镜像启动一个新容器。您可以使用多个选项自定义容器的行为:

  • -d (分离) − 在后台运行容器。
  • -p (发布) − 映射容器和主机之间的端口。
  • -v (卷) − 挂载用于数据持久性的卷。
  • --name − 为容器分配自定义名称。

示例

$ docker run -d -p 80:80 nginx  
docker run

它启动一个分离的 Nginx Web 服务器容器,并公开端口 80。

docker ps

“docker ps”命令列出主机上所有正在运行的容器。您可以使用它来监视容器的状态并获取有价值的信息,例如它们的名称、ID 或公开的端口。

示例

$ docker ps -a  
docker ps

它列出所有容器(正在运行和已停止)。

docker exec

“docker exec”命令允许您在正在运行的容器内执行命令。这就像 SSH 到远程机器一样。

示例

$ docker exec -it my-container bash 
docker exec

它在名为“my-container”的容器内启动一个交互式 Bash shell。

如何从主机访问 Docker 容器内运行的服务?

公开 Docker 容器内服务的最常见方法是将容器的端口映射到主机端口。您可以在运行容器时使用 -p 或 --publish 选项。

例如,docker run -p 8080:80 my-web-server 会将容器内端口 80 上运行的 Web 服务器暴露到本地端口 8080 上。此外,当您的主机运行 Docker Desktop 时,您可以使用特定的 DNS 名称“host.docker.internal”从容器内部访问主机上的服务。

结论

在本章中,我们讨论了 Docker 容器和主机的来龙去脉。我们了解了它们的本质、它们之间如何交互、它们之间的根本区别,以及可用于与 Docker 容器和主机交互的各种命令。

广告