《Docker技术入门与实战》学习笔记——Docker核心技术

一、架构概述

Docker是标准的C/S架构,可以划分为三个部分:

  1. 服务端
  2. 客户端
  3. 镜像仓库

客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTful API来进行通信
《Docker技术入门与实战》学习笔记——Docker核心技术
dockerd:为客户端提供RESTful API,响应来自客户端的请求,采用模块化的架构,通过专门的Engine模块来分发管理各个来自客户端的任务
docker-proxy:是dockerd的子进程,当需要进行容器端口映射时,docker-proxy完成网络映射配置
containerd:是dockerd的子进程,提供gRPC接口响应来自dockerd的请求,对下管理runC镜像和容器环境
containerd-shim:是containerd的子进程,为runC容器提供支持,同时作为容器内进程的根进程

二、命名空间(环境隔离)

Docker每个容器都可以拥有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统环境中一样,从而保证了容器之间彼此互不影响。
每次启动容器时,通过调用func setNamespaces(daemon *Daemon, s *specs.Spec, c *container.Container) error方法来完成对各个命名空间的配置。

三、控制组(资源隔离)

控制组主要用来对共享资源进行隔离、限制、审计等。只有将分配到容器的资源进行控制,docker将分配到容器的资源进行控制,才能避免多个容器同时运行时对宿主机系统的资源竞争。
主要功能:

  1. 资源限制(resource limiting):可将组设置一定的内存限制。比如:内存子系统可以为进程组设定一个内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发Out of Memory警告。
  2. 优先级(prioritization):通过优先级让一些组优先得到更多的CPU等资源。
  3. 资源审计(accounting):用来统计系统实际上把多少资源用到适合的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间。
  4. 隔离(isolation):为组隔离命名空间,这样使得一个组不会看到另一个组的进程、网络连接和文件系统。
  5. 控制(control):执行挂起、恢复和重启动等操作

在/sys/fs/cgroup/memory/docker/目录下可以看到各个容器的限制项,也可以通过修改这些文件值来控制组,从而限制Docker应用资源。

四、 联合文件系统

联合文件系统是实现Docker镜像的技术基础,它支持将文件系统中的修改信息作为一次提交,并层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,应用看到的是挂载的最终结果。
Docker镜像自身就是由多个文件层组成,每一层有基于内容的唯一的编号(层ID)。可以通过docker history查看一个镜像由哪些层组成。
对于Docker镜像来说,这些层的内容都是不可修改的、只读的。而当Docker利用镜像启动一个容器时,将在镜像文件系统的最顶端再挂载一个新的可读写的层给容器。容器中的内容更新将会发生在可读写层。当所操作对象位于较深的某层时,需要先复制到最上层的可读写层。
《Docker技术入门与实战》学习笔记——Docker核心技术

五、网络虚拟化

Docker中的网络接口默认都是虚拟接口。它在本地主机和容器内分别创建一个虚拟接口veth并连通,从而连接其他容器和访问外部网络。
《Docker技术入门与实战》学习笔记——Docker核心技术
网络创建过程:

  1. 创建一对虚拟接口,分别放到本地主机和新容器的命名空间中
  2. 本地主机一端的虚拟接口连接到默认的docker0网桥或指定网桥上,并具有一个以veth开头的唯一名字,如veth1234
  3. 器一端的虚拟接口将放到新创建的容器中,并修改名字作为eth0。这个接口只在容器的命名空间可见
  4. 从网桥可用地址段中获取一个空闲地址分配给容器的eth0(例如172.17.0.2/16),并配置默认路由网关为docker0网卡的内部接口docker0的IP地址(例如172.17.42.1/16)