Docker Docker 的本质,是宿主机上的进程。 Docker 通过 namespace 实现资源隔离,通过 cgroups 实现资源限制,通过写时复制机制(copy-on-write)实现高效的文件操作。
想要实现一个资源隔离的容器,需要从哪些方面入手? 首先,是 chroot 命令,这条命令使根目录 / 的挂载点切换了,即文件系统被隔离了;接着,为了在分布式的环境下进行通信和定位,容器必要要有独立的 IP、端口、路由等,这就涉及到网络隔离;同时,容器还需要一个独立的主机名以便在网络中标识自己。有了网路,自然离不开通信,也就想到了进程间通信需要隔离;开发者可能已经想到了权限的问题,对用户和用户组的隔离就实现了用户权限的隔离;最后,运行在容器中的应用需要有进程号(PID),自然也需要与主机中的 PID 进行隔离。
Docker 背后的内核知识
-
namespace 资源隔离(一个容器所需要做的六项隔离)
- UTS 实现主机名和域名隔离
- IPC 实现进程间通信隔离
- PID 实现进程号隔离
- mount 实现文件隔离
- network 实现网络隔离
- user 实现用户与用户组隔离
-
cgroups 资源限制 cgroups 不仅可以限制被 namespace 隔离起来的资源,还可以为资源设置权重、计算使用量、操控任务(进程或线程)启停等。
Docker 网络管理 libnetwork 内置 5 种驱动可以提供不同类型的网络服务:
- bridge 驱动
- host 驱动
- overlay 驱动
- remote 驱动
- null 驱动
bridge 驱动为 Docker 默认设置。使用该驱动时,libnetwork 将创建出来的 Docker 容器连接到 Docker 网桥上。
bridge 驱动实现机制分析:
- docker0 网桥
- iptables 规则
- Docker 容器的 DNS 和主机名
Linux 网络虚拟化
- 网络虚拟化的基石
- veth pair
- Linux bridge
- tun/tap 设备
- iptables
Docker 四大网络模式
- bridge
- host
- container
- none
Docker 网络技巧
Docker 容器组网的挑战
需要理解 Docker 单机容器网络
Linux 网络
Linux 虚拟网络设备 veth-pair 详解,看这一篇就够了
Kubernetes