写点什么

Docker 技术架构概述

  • 2023-06-05
    北京
  • 本文字数:1847 字

    阅读完需:约 6 分钟

Docker技术架构概述

1、Docker 技术构成

Docker 软件采用客户-服务(CS 架构)的技术架构模式,Docker Client 和 Docker Daemon 交互,Docker Daemon 负责创建、运行、发布容器,Docker Client 和 Docker Daemon 可以在同一个系统中,或者 Docker Client 可以通过 REST API 远程控制 Docker Daemon。Docker Compose 负责控制一组应用容器。

2、Docker 核心技术

Docker 核心技术有 3 类:Cgroups、LXC、AUFS。


  1. Cgroups

Cgroups 提供了对一组进程及将来子进程的资源限制、控制和统计的能力,这些资源包括 CPU、内存、存储、网络等。通过 Cgroups,可以方便地限制某个进程的资源占用,并且可以实时监测进程的监控和统计信息。Cgroups 的接口通过操作一个虚拟文件系统来实现,一般挂载在(/sys/fs/cgroup)文件夹下。


  1. LXC

LXC 是 Linux Containers 的简称,是一种基于容器的操作系统层级的虚拟化技术。LXC 项目位于 Sourceforge 上面,由一个 Linux 内核补丁和一些用户空间工具组成,其中内核补丁提供底层新特性,上层工具使用这些新特性,提供一套简化的工具来维护容器。


LXC 在资管管理方面依赖与 Linux 内核密切相关的 Cgroups 子系统,这个子系统是 Linux 内核提供的一个基于进程组的资源管理框架,可以为特定的进程组限定可以使用的资源,借助 Cgroups 子系统,在当前 Linux 环境下实现一个轻量化的虚拟机。


LXC 在隔离控制方面依赖于 Linux 内核提供的 namespace 特性,具体来说,就是在 clone 时加入相应的 flag。


  1. AUFS

AUFS 是一种 Union File System(联合文件系统),又称 Another UnionFS,后来被称为 Alternative UnionFS,再后来又被称为高大上的 Advance UnionFS。所谓 UnionFS,就是把不同物理位置的目录合并(mount)到同一个目录中。UnionFS 的一个最主要应用是,把一张 CD/DVD 和一个硬盘目录联合(mount)在一起,然后,就可以对这个只读的 CD/DVD 上的文件进行修改(当然,修改的文件存储在硬盘上的目录里)。

3、Docker 打包原理

在 LXC 的基础上,Docker 额外提供的 Feature 包括:标准统一的打包部署运行方案,为了最大化重用 Image,加快运行速度,减少内存和磁盘 footprint,Docker Container 运行时所构造的运行环境实际上是由具有依赖关系的多个 Layer 组成的。


在基础的 rootfs image 的基础上,叠加了包含如 Emacs 等各种工具的 image,再叠加包含 apache 及其相关依赖 library 的 image,这些 image 由 AUFS 文件系统加载合并到统一路径中,以只读的方式存在,最后再叠加加载一层可写的空白 Layer,用于记录对当前运行环境所作的修改。


有了层级化的 image 做基础,理想情况下,不同的 App 就可以尽可能地公用底层文件系统和相关依赖工具等,同一个 App 的不同示例也可以实现公用绝大多数数据,进而以 copy on write 的形式维护那份已修改过的数据等。

4、Docker 网络模式

Docker 的网络模式包括下列 4 类:Bridge container(桥接式网络模式)、Host(open)container(开放式网络模式)、Container(join)container(联合挂载式网络模式,是 Host 网络模式的延伸)、None(Close)container(封闭式网络模式)。


  1. Bridge container

当 Docker 进程启动时,会在主机上生成一个默认的虚拟网桥,此主机上启动的 Docker 容器会连接到虚拟网桥中,默认的 IP 地址都是由虚拟网桥生成的。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。从一个子网中分配一个 IP 给容器使用,并设置子网的 IP 地址为容器的默认网关。在主机上创建一对虚拟网卡 veth pair 设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中,以 veth-xxx 这种形式命名,并将这个网络设备加入到虚拟网桥中。


  1. Host(open)container

如果启动容器时使用 Host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等,还是和宿主机隔离的。


  1. Container(join)container

这种模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过网卡设备通信。


  1. None(Close)container

使用 None 模式时,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息,只有 IO 网络接口,需要为 Docker 容器添加网卡、配置 IP 等。

发布于: 刚刚阅读数: 6
用户头像

InfoQ签约作者 2018-11-30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
Docker技术架构概述_Docker_穿过生命散发芬芳_InfoQ写作社区