容器核心技术
对于容器技术而言,若想实现资源层面上的限制与隔离,需要依赖于 Linux 内核中所提供的 Namespace 与 cgroup 技术:
- Namespace:命名空间;提供资源隔离功能
- cgroup:控制组;提供资源限制、分配功能
容器核心技术 Namespace 与 cgroup,分别实现资源隔离与资源限制
Namespace
容器之间相互隔离,互不影响,依赖于 Linux 内核中 Namespace 功能实现:
Namespace 称为命名空间,是 Linux 内核中提供资源隔离的一种技术,可以使容器之间实现相互隔离、互不影响的效果,实现容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前容器命名空间的资源
Docker 中各个容器运行在同一个 Docker 主进程,并且共享宿主机内核,为避免容器受到其它进程的干扰与影响,则需要使用 Namespace 技术实现相互隔离,以实现轻量级虚拟化技术服务,Linux 中提供了以下六种 Namespace 隔离的系统调用:
Namespace | 系统调用参数 | 隔离内容 |
---|---|---|
MNT | CLONE_NEWNS | 提供磁盘挂载点和文件系统的隔离能力 |
IPC | CLOUE_NEWIPC | 提供进程间通信的隔离能力;包括信号量、消息队列和共享内存 |
UTS | CLONE_NEWUTS | 提供内核,主机名或域名隔离能力 |
PID | CLONE_NEWPID | 提供进程隔离能力 |
Net | CLONE_NEWNET | 提供网络隔离能力;包括网络设备、网络栈和端口等 |
User | CLONE_NEWUSER | 提供用户隔离能力;包括用户和组 |
cgroup
在一个容器中,如果不对其做任何资源限制,则宿主机会允许该容器占用无限的资源,而无限制的占用宿主机的资源;为避免该情况的出现,则有必要对容器进行资源分配的限制
cgroup 可以限制容器能够使用的资源上限:cgroup 功能在内核层默认开启
cgroup(Linux Control Groups) 称为控制组,是 Linux 内核中的一个技术,提供了对一组进程及将来子进程的资源限制的能力。资源包括:CPU、内存、存储、网络等;通过 cgroup 可以限制某个进程的资源占用,并监控进程的统计信息;cgroups 通常用来限制容器的 CPU 和内存等资源的使用
容器相关技术
- 容器规范:开发容器所需要遵循的规范,保证容器生态的标准型以及不同容器之间的兼容性
- 容器 Runtime:真正运行容器的地方,Runtime 为容器提供运行环境,容器只能在 Runtime 中运行
- 容器管理工具:管理工具连接用户与 Runtime,管理工具将用户操作传递给 Runtime 执行,为用户提供图形或命令行的方式管理容器
- 容器定义工具:容器定义工具允许用户定义容器的内容和属性,使得容器能够被保存、共享和重建
- 镜像仓库:容器是通过 Image 创建的,需要有一个仓库来统一存放 Image,这个仓库就叫做 Registry,即镜像仓库
容器规范
容器不只有 Docker 一种,为了保证容器生态的标准型、可持续发展以及不同容器之间的兼容性,OCI 组织制定了开发标准的容器规范,分别为 runtime spec 和 image format spec,不同容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性
容器 Runtime
Runtime 是真正运行容器的地方,Runtime 与操作系统内核紧密协作,为容器提供相应的运行环境;Runtime 为容器提供运行环境,容器只能在 Runtime 中运行
目前主流的三种容器 Runtime:
- Lxc:Linux 系统上早期的 Runtime,功能比较简单,Docker 最初采用的 Runtime
- runc:Docker 自主研发的 Runtime,也是 Docker 当前正在使用的 Runtime,符合 OCI 规范
- rkt:CentOS 开发的 Runtime,符合 OCI 规范
容器管理工具
管理工具连接用户与 Runtime,管理工具将用户操作传递给 Runtime 执行,为用户提供图形或命令行的方式管理容器
Docker 使用的 Runtime 为 runc,管理工具为 Docker Engine;Docker Engine 包含 后台(Daemon) 和 命令行(Cli) 两部分
容器定义工具
容器定义工具允许用户定义容器的内容和属性,使得容器能够被保存、共享和重建
- Docker Image:Docker 容器的模板,Runtime 依据 Docker Image 创建容器
- Dockerfile:用于定义、编排 Image 的文本文件,可以通过该文件中的命令创建 Image
镜像仓库 Registry
容器是通过 Image 创建的,需要有一个仓库来统一存放 Image,这个仓库就叫做 Registry,即镜像仓库,镜像仓库是保存镜像的地方,可以统一保存多个不同版本的镜像
镜像仓库可以分为公共仓库和私有仓库:
- Docker Hub:Docker 官方的公共仓库,保存大量的公共镜像方便使用
- 阿里云、清华云等第三方镜像仓库
- Image Registry:Docker 官方提供的私有仓库部署工具,无 Web 界面
- Harbor:具有 Web 界面并且自带认证功能的私有镜像仓库,推荐使用
扩展 - chroot
chroot 是 UNIX 操作系统上的系统调用,用于将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到该目录,为每个进程提供独立的磁盘空间;与容器的实现很相似