容器化突出优势
- 消除环境差异,应用运行时环境封装镜像,保证了应用生命周期的一致性和标准化,只要有Docker的环境就可以运行容器,测试运维非常高效的进行测试和部署工作
- 资源高效利用,容器就是系统中进程,与底层共享操作系统,性能优良,精准分配资源,彼此之间隔离互不影响
- 版本控制,新应用上线发现问题,快速回滚旧版本,其速度就是一个系统进程创建销毁的速度一致,远快于换原快照的方式
容器生态圈
容器的本质
容器的本质就是宿主机上的进程,通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制技术实现了高效文件操作,与宿主机共享内核
namespace资源隔离机制
Linux提供了6中namespace隔离机制:
UTS,Unix Timesharing System。通过UTS namespace的隔离,每个容器可以拥有独立的主机名和域名,在网络上可视为独立节点
IPC,Inter-Process Communication。通过IPC namespace的隔离,划分到不同IPC namespace的进程通信上隔离,如不同空间无法通过消息队列、共享内存、信号量方式通信,但没有对所有IPC通信方式隔离
PID,进程号。通过PID namespace对进程号重新标识,不同的namspace下可以有相同的PID,内核为PID namespace维护着树状结构,最顶层创建的时root namesapce,新创建的是child namespace,子节点无法查看父节点进程。一般PID namespace中启动的第一个进程作为init进程有资源监控回收能力,如果init进程销毁,namespace中所有进程都销毁,如bash
Mount namespace。用来隔离文件系统的挂载点,不同的Mount namespace拥有自己的挂载点信息,互不影响,在容器的角度可以看到不通的文件系统层次结构
Network namespace。网络资源隔离,不同的Network namesoace下可以拥有自己的网络设备,IPv4IPv6协议栈,路由表,防火墙等互不影响
User namespace。用户和组隔离,在user namespace中进程的用户和组可以和宿主机不同;宿主机的非特权用户可以映射到user namespace中成为特权用户
namespace无法隔离
namespace无法隔离的时间,容器时间与操作系统时间共享,如运行registry的节点时间不同步,其他节点拉去镜像就会出现权限认证失败。时间同步对有心跳检测的程序会引起诸多问题
简述Docker网络
Docker会在宿主机创建一个bridge0的桥设备,在每个容器中创建一个虚拟网卡连接桥设备,根据网桥的网段分配给容器IP地址,网桥作为容器的网关可以与外界通信
Docker内虚拟网段无法寻址可以通过端口映射暴露宿主机端口
Docker启动一个容器可以通过指定另一个容器的ID,达到共享同一个Network namespace的效果
cgroup资源限制
cgroup和namespace类似,也是将进程分组,cgroups为了对进程进行统一的资源监控和限制
资源限制,cgroups可以通过对任务进行资源总额的限制,如设置任务运行时使用的内存上限512M,一旦超过立即出发OOM
优先级分配,通过分配的CPU时间片数量和磁盘IO带宽,控制任务的运行优先级
资源统计,cgroups可以统计资源使用量,cpu时长,内存用量,做计量的开发计费
/sys/fs/cgroup/“cpu|memory…”/docker/容器ID ,系统这些目录下存储了每个容器对应资源限制情况,在创建容器的时候就会将限制数值写入,系统会文件内的值对进程(容器)进行资源限制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NIMdPnlF-1591612476972)(http://139.9.251.125:8888/upload/2020/06/cgroup-891b6c6d3a1d44d780d25a01aa31c443.png)]
参考
Docker源码分析-Docker架构
《Docker容器与容器云第二版》