Docker [1]

Docker 原理

Posted by ZYT on November 18, 2018

Docker 核心技术

Docker 核心技术包括:

Docker 核心技术

Namespaces

Docker 使用 namespaces 提供一个隔离的工作环境即 container

Docker Engine 使用以下命名空间:

  • pid 命名空间:进程
  • net 命名空间:网络
  • ipc 命名空间:进程间通信
  • mnt 命名空间:文件挂载点
  • uts 命名空间:主机名

Control groups

控件组提供物理资源上的隔离,比如 CPU、内存、磁盘 I/O 和网络带宽。

Union file systems

Union file systems 是一种为 Linux 操作系统设计的用于把多个文件系统联合到同一个挂载点的文件系统服务,Docker Engine 支持多种 UnionFS,包括:AUFS、btrfs、vfs 和 DeviceMapper。

Union file systems

Docker 中的每一个镜像都是由一系列只读的层组成的,当镜像被 docker run 命令创建时就会在镜像的最上层添加一个可写的层,也就是容器层,所有对于运行时容器的修改其实都是对这个容器读写层的修改。容器和镜像的区别就在于,所有的镜像都是只读的,而每一个容器其实等于镜像加上一个可读写的层,也就是同一个镜像可以对应多个容器。

dockerImageandContainer

目前 Docker 默认采用 overlay2 为存储驱动

Container format

Docker Engine 将 NamespacesControl groupsUnion file systems 组合在一起的包装类即 Container format ,默认的 Container formatlibcontainer

Docker 的网络

Docker 为我们提供了四种不同的网络模式,Host、Container、None 和 Bridge 模式:

dockerNet

默认采用网桥模式,在这种模式下,除了分配隔离的网络命名空间之外,Docker 还会为所有的容器设置 IP 地址。当 Docker 服务器在主机上启动之后会创建新的虚拟网桥 docker0,随后在该主机上启动的全部服务在默认情况下都与该网桥相连。

dockerNetTopology

在默认情况下,每一个容器在创建时都会创建一对虚拟网卡,两个虚拟网卡组成了数据的通道,其中一个会放在创建的容器中,会加入到名为 docker0 网桥中,docker0 会为每一个容器分配一个新的 IP 地址并将 docker0 的 IP 地址设置为默认的网关。网桥 docker0 通过 iptables 中的配置与宿主机器上的网卡相连,所有符合条件的请求都会通过 iptables 转发到 docker0 并由网桥分发给对应的机器

Docker 通过 Linux 的命名空间实现了网络的隔离,又通过 iptables 进行数据包转发

Docker 与管理程序虚拟化(hypervisor)的区别

管理程序虚拟化通过中间层将一台或多台独立的机器虚拟运行于物理硬件上,而容器则是直接运行在操作系统内核之上的用户空间

dockerVMdocker

dockerVMVM

Docker 的优势

  • 加速本地开发和构建流程,使其更加高效、更加轻量级
  • 能够让独立服务或应用程序在不同的环境中,得到同样的运行结果
  • 用 Docker 创建隔离的环境来进行测试