3.Docker底层技术和架构

Docker用Go编程语言编写,并利用Linux内核的多个功能来交付其功能。

命名空间(namespaces)

Docker使用一种称为namespaces的技术来提供称为container的隔离工作区。运行容器时,Docker会为该容器创建一组 namespaces

这些命名空间提供了一层隔离。容器的每个方面都在单独的命名空间中运行,并且对其的访问仅限于该命名空间。

Docker Engine在Linux上使用以下命名空间:

  • pid命名空间:进程隔离(PID: Process ID)。
  • net命名空间:管理网络接口(NET: Networking)。
  • ipc命名空间:管理访问IPC资源(IPC: InterProcess Communication)。
  • mnt命名空间:管理文件系统挂载点(MNT: Mount)。
  • uts命名空间:隔离内核和版本标识符。(UTS: Unix Timesharing System)。

控制组(Control groups)

Linux上的Docker引擎还依赖于另一种称为控制组 (cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,您可以限制特定容器可用的内存。

联合文件系统(Union file systems)

联合文件系统或UnionFS是通过创建层进行操作的文件系统,使其非常轻便且快速。Docker Engine使用UnionFS为容器提供构建模块。Docker Engine可以使用多个UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper。

容器格式(Container format)

Docker Engine将名称空间,控制组和UnionFS组合到一个称为容器格式的包装器中。默认容器格式为libcontainer。将来,Docker可以通过与BSD Jails或Solaris Zones等技术集成来支持其他容器格式。

Docker Engine和架构

Docker Engine是具有以下主要组件的客户端-服务器应用程序:

  • 服务器是一种长期运行的程序,称为守护程序进程( dockerd命令)。
  • REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
  • 命令行界面(CLI)客户端(docker命令)。

CLI使用Docker REST API通过脚本或直接CLI命令来控制Docker守护程序或与Docker守护程序进行交互。许多其他Docker应用程序都使用基础API和CLI。

Docker使用客户端-服务器架构。Docker客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。Docker客户端和守护程序可以 在同一系统上运行,或者您可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/basic/docker/2854.html

发表评论

邮箱地址不会被公开。 必填项已用*标注