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。
Docker 中的每一个镜像都是由一系列只读的层组成的,当镜像被 docker run
命令创建时就会在镜像的最上层添加一个可写的层,也就是容器层,所有对于运行时容器的修改其实都是对这个容器读写层的修改。容器和镜像的区别就在于,所有的镜像都是只读的,而每一个容器其实等于镜像加上一个可读写的层,也就是同一个镜像可以对应多个容器。
目前 Docker 默认采用 overlay2
为存储驱动
Container format
Docker Engine 将 Namespaces
、Control groups
和 Union file systems
组合在一起的包装类即 Container format
,默认的 Container format
为 libcontainer
。
Docker 的网络
Docker 为我们提供了四种不同的网络模式,Host、Container、None 和 Bridge 模式:
默认采用网桥模式,在这种模式下,除了分配隔离的网络命名空间之外,Docker 还会为所有的容器设置 IP 地址。当 Docker 服务器在主机上启动之后会创建新的虚拟网桥 docker0
,随后在该主机上启动的全部服务在默认情况下都与该网桥相连。
在默认情况下,每一个容器在创建时都会创建一对虚拟网卡,两个虚拟网卡组成了数据的通道,其中一个会放在创建的容器中,会加入到名为 docker0
网桥中,docker0
会为每一个容器分配一个新的 IP 地址并将 docker0
的 IP 地址设置为默认的网关。网桥 docker0
通过 iptables
中的配置与宿主机器上的网卡相连,所有符合条件的请求都会通过 iptables
转发到 docker0
并由网桥分发给对应的机器
Docker 通过 Linux 的命名空间实现了网络的隔离,又通过 iptables
进行数据包转发
Docker 与管理程序虚拟化(hypervisor)的区别
管理程序虚拟化通过中间层将一台或多台独立的机器虚拟运行于物理硬件上,而容器则是直接运行在操作系统内核之上的用户空间
Docker 的优势
- 加速本地开发和构建流程,使其更加高效、更加轻量级
- 能够让独立服务或应用程序在不同的环境中,得到同样的运行结果
- 用 Docker 创建隔离的环境来进行测试