持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
容器简介
要理解容器的网络,先简单梳理容器的基础知识。容器的本质是一个或一组特殊的进程,它使用namespace做资源隔离,用cgroup做资源限制。
namespace和cgroup都是linux的内核特性。
namespace对内核资源进行分区,以便不同组的进程看到不同组的资源,包括mnt(挂载)、net(网络)、ipc(进程间通信)、pid(进程ID)、uts(主机名)、user(用户ID)等几种类型,net表示不同的命名空间有独立的网路协议栈,每个net NS将有一组私有IP 地址、路由表、套接字列表、连接跟踪表、防火墙和其他与网络相关的资源。
cgroup限制、计量、隔离一组进程的资源使用,包括CPU, memory, disk I/O, network等子系统,net部分包括net_cls、net_prio,主要是结合网络QoS和netfliter提供流量优先级及控制,目前主流容器一般没有用到cgroup上的net控制部分。
Docker的核心技术还包括将进程运行依赖环境打包成完整的rootfs,制作成镜像,以及容器镜像分层技术(联合文件系统:增量挂载、写时复制等)。前者保证容器的可移植性、一致性,后者提高了镜像制作、传输、存储的效率。
容器的启动过程:
- 启用 linux namespace 配置。
- 设置指定的 cgroups 参数。
- 切换进程根目录,也就是挂载新的 rootfs(容器镜像)
- 创建、挂载用户定义的其他文件目录
容器和操作系统上其他进程共用一个内核,但有自己的rootfs。