一、容器雏形
1.容器起源可追溯UNIX系统中的chroot命令
1.1chroot命令
把某个目录当成‘假的根目录’,进程及子进程锁在一个隔离的文件系统视图,让程序以为它就是整个电脑最顶层。
chroot="给进程戴个面罩,告诉它:世界就这么大,别乱跑!”
1.2以chroot为代表的文件隔离技术的先天缺陷
1.2.1单一性
只改变了进程看到的‘根目录’,但是进程、设备、内核资源都和主机共享
1.2.2资源溃败
无法限制CPU、内存等,恶意进程可以直接耗尽宿主机的资源
1.2.3高风险
如果内核提权有漏洞,chroot内可以直接拿到宿主机root,因为共享了同一内核
2.实现完美隔离机制——名称空间
2.1名称空间
Linux内核提供的一种轻量级虚拟化,将一组系统资源隔离到一个独立空间中,不同进程看到的系统资源互不影响
名称空间就是给进程画一个‘独立世界’,让它以为自己在独占整个操作系统
2.2控制组Cgroups
Linux内核提供的管理隔离机制,控制组就是内核级的进程资源配额系统,确保每个进程只能使用分配到的CPU、内存,磁盘I/O等资源,能够实现"资源隔离,防止抢占”的底层核心机制
Cgroups是Llinux的“预算管理员”,它给一组进程定规矩:最多用多少CPU、多少内存、多少硬盘速度,想超之?没门! Docker、Kubernetes都靠它实现“容器不会吃垮宿主机”的效果
二、容器诞生
1.LXC系统级虚拟化功能
1.1什么是LXC系统
利用Llinux内核的Namespace隔离进程、网络等和Cgroups在同一台主机上创建多个相互隔离的用户空间,每个容器就像一台“轻量级虚拟机”,共享宿主内核,
LXC=“用极小的开销,把一台Linux变成多台小Linux”的工具箱
1.2LXC虚拟化功能
维度 | 功能 |
进程隔离 | PID、IPC、UTS、Mount....... |
资源限制 | 内存、CPU、磁盘I/O....... |
文件系统 | 支持最小系统,可读写或只读 |
网络 | veth、macvlan、物理网卡直通等模式 |
安全增强 | 支持非特权容器,减少宿主机暴露 |
可惜LXC眼中的容器是一种封装系统的轻量级虚拟机,必然不能站在舞台最中央
2.Docker惊艳问世
Docker一个开源的应用容器引擎,基于Llinux内核的容器技术(namespaces,cgroups)实现,用于打包、分发和运行程序,对程序文件、运行时环境、软件依赖包都可以封装打包、部署的技术手段
三、容器理念
1.双向对比
对比点 | Docker容器 | 虚拟机 |
架构 | 共享宿主内核 | 每个VM带完整Guest OS |
启动 | 秒级 | 分钟级 |
镜像 | MB级 | GB级 |
性能 | 接近原生 | 有虚拟化损耗 |
2.三大核心概念
2.1仓库
镜像仓库,默认Docker,也可自建harbor,用来存储、分发、管理镜像的地方
镜像仓库就是“镜像的网盘商店”,存镜像,管版本,分权限,随时上传下载
2.2镜像
镜像是只读的模板,包含了创建容器所需的所有文件和配置信息
镜像就是“打包好的系统快照”,复制到哪里,哪里就能瞬间变成同款环境
2.3容器
容器是一个运行在隔离环境中的程序
3.常见用途
开发环境:一键交付相同环境
微服务:每个服务一个容器
CI/CD:Gitlab里用容器跑测试,构建
Docker把“应用+环境”装进了轻量级、可移植、秒级启动的盒子里,解决了“在我机器能跑,在你机器就崩”的难题