容器集群管理系统
术语“容器”被过度使用。 同样,根据上下文,它对不同的人可能意味着不同的事情。
传统的Linux容器实际上只是Linux系统上的普通进程。 使用资源约束(控制组[cgroups]),Linux安全约束(Unix权限,功能,SELinux,AppArmor,seccomp等)和名称空间(PID,网络,安装,等等。)。
如果您启动现代Linux系统并使用cat /proc/PID/cgroup
查看了任何进程,则会看到该进程在cgroup中。 如果查看/proc/PID/status
,则会看到功能。 如果查看/proc/self/attr/current
,则会看到SELinux标签。 如果查看/proc/PID/ns
,则会看到该进程所在的名称空间列表。因此,如果将容器定义为具有资源约束,Linux安全约束和名称空间的进程,则根据定义,Linux上的每个进程系统位于容器中。 这就是为什么我们经常说Linux是容器,容器是Linux的原因 。 容器运行时是修改这些资源约束,安全性和名称空间并启动容器的工具。
Docker引入了容器映像的概念,它是一个标准的TAR文件,它结合了以下内容:
- Rootfs(容器根文件系统):系统上的目录,看起来像操作系统的标准根(
/
)。 例如,目录包含/usr
,/var
,/home
等。 - JSON文件(容器配置):指定如何运行rootfs。 例如,在容器启动时要在rootfs中运行的命令或入口点 ; 为容器设置的环境变量 ; 容器的工作目录 ; 和其他一些设置。
Docker“ tar
's up” rootfs和JSON文件来创建基础映像 。 这使您可以在根文件系统安装额外的内容,创建一个新的JSON文件,以及tar
原始图像和用更新的JSON文件的新图像之间的差异。 这将创建一个分层的图像 。
容器图像的定义最终由开放容器倡议(OCI)标准组织标准化为OCI图像规范 。
用于创建容器图像的工具称为容器图像生成器 。 有时,容器引擎执行此任务,但是有几个独立的工具可以构建容器映像。
Docker拍摄了这些容器映像( tarball )并将其移至可以从中拉取它们的Web服务,开发了一个协议来拉取它们,并将Web服务称为容器注册表 。
容器引擎是可以从容器注册表中提取容器图像并将其重新组装到容器存储中的程序 。 容器引擎还会启动容器运行时 (请参见下文)。
![Linux容器内部 Linux container internals](https://i-blog.csdnimg.cn/blog_migrate/d134913053ba33b4f750f78f53922d38.png)
Linux容器内部。 斯科特·麦卡蒂的插图。 CC BY-SA 4.0
容器存储通常是写时复制 (COW)分层文件系统。 从容器注册表中提取容器映像时,首先需要解压缩rootfs并将其放在磁盘上。 如果您有多个组成图像的层,则将下载每个层并将其存储在COW文件系统上的另一个层上。 COW文件系统允许每个图层分别存储,从而最大程度地共享分层图像。 容器引擎通常支持多种类型的容器存储,包括overlay
, devicemapper
, btrfs
, aufs
和zfs
。
OCI标准组织还已将容器运行时配置的布局和分解的rootfs标准化为OCI运行时规范 。
最后,容器引擎启动一个容器运行时 ,该运行时读取容器运行时规范。 修改Linux cgroup,Linux安全约束和名称空间; 并启动container命令以创建容器的PID 1 。 此时,容器引擎可以将stdin
/ stdout
中继回调用方并控制容器(例如,停止,启动,附加)。
请注意,引入了许多新的容器运行时以使用Linux的不同部分来隔离容器。 人们现在可以使用KVM分离(例如微型虚拟机)运行容器,或者可以使用其他虚拟机监控程序策略(例如拦截容器中进程的所有系统调用)。 由于我们具有标准的运行时规范,因此这些工具都可以由相同的容器引擎启动。 甚至Windows也可以使用OCI运行时规范来启动Windows容器。
更高级别的是容器协调器。 容器编排器是用于协调多个不同节点上容器执行的工具。 容器协调员与容器引擎进行对话以管理容器。 协调员告诉容器引擎启动容器并将其网络连接在一起。 协调员可以监视容器,并在负载增加时启动其他容器。
翻译自: https://opensource.com/article/18/8/sysadmins-guide-containers
容器集群管理系统