低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

系统管理员必读的容器入门指南

2020 年 5 月 16 日

系统管理员必读的容器入门指南

“容器”无疑是近年 IT 业界的 buzzword,不过,在不同语境下,它对不同的人有不同的含义。在本文中,我将从 Linux 容器、容器镜像、写时复制等方面来阐释容器的具体含义。


Linux 容器

传统意义上的 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 文件(容器配置):JSON 文件会来规定如何运行 rootfs,例如:当容器启动时应该在 rootfs 中运行什么指令或 entrypoint,应该为容器设置什么样的环境变量,容器的工作目录是什么等等。


Docker 基础镜像由根文件系统和 JSON 文件组成,可以通过在基础镜像的根文件系统中安装所需的内容,以更新 JSON 文件,并且新建一个镜像层,通过这种方式可以制作一个新的镜像。


容器镜像的定义最终由 Open Container Initiative(OCI)标准化为 OCI 镜像规范。


用于构建容器镜像的工具被称为容器镜像构建器(如 Dockerfile),有时容器引擎也能够完成构建容器镜像的工作,当然也可以使用一些可以构建容器镜像的独立工具。


Docker 获取了这些容器镜像(tarballs)然后将他们上传到一个 web 服务中,你可以从中拉取他们。然后 Docker 会开发一个协议以便你顺利拉取这些镜像,而这一 web 服务便被称为容器镜像仓库。


容器引擎可以从容器镜像仓库中拉取镜像,然后将其重组到容器存储上。此外,容器引擎也能启动容器运行时(如下图)。



Linux 容器内部机制


Copy On Write(COW)

容器存储通常是一个写时复制(COW)分层文件系统。当你从镜像仓库中拉取一个镜像时,首先,你要从镜像中提取 rootfs 并且将其放到磁盘上。如果你的镜像由多层组成,那么在 COW 文件系统中需要将下载的每一层镜像文件储存在不同的层中。COW 文件系统允许每一层分开存储,这将分层镜像的共享最大化了。容器引擎通常支持不同类型的容器存储,如 overlay、devicemapper、 btrfs、 aufs 和 zfs 等。


容器运行时

容器引擎将容器镜像下载到容器存储中后,它需要创建一个容器运行时的配置文件。这一配置文件结合了来自调用程序/用户的输入以及容器镜像规范的内容。举个例子,调用程序可能想要对正在运行的容器进行指定的安全性修改、添加环境变量或者将 volumes 挂载到容器上,这些都是调用程序输入的内容。


容器运行时配置和分解的 rootfs 同样也被 OCI 标准化为 OCI 运行时规范。


最后,容器引擎启动读取运行时规范的容器运行时,修改 Linux cgroup、Linux 安全约束以及命名空间,并且启动容器命令以创建 PID1(Process ID1)。此时,容器引擎可以将 stdin / stdout 传回调用程序并控制容器(如,停止、启动、附加等)。


请注意,许多新的容器运行时正在让 Linux 的不同部分来隔离容器。人们先可以使用 KVM 分离(如迷你虚拟机)运行容器,或者可以使用其他 hypervisor 策略(例如,拦截容器进程中的所有系统调用)。既然我们已经拥有一个标准的运行时规范,那么就能够通过相同的容器引擎启动这些工具。甚至 Windows 也可以使用 OCI 运行时规范来启动 Windows 容器。


容器编排引擎

容器编排引擎,相比其他容器工具而言,则处于更高的级别。容器编排是用于协调多个不同节点上的容器执行工具。容器编排引擎可以通过与容器引擎通信以管理容器,如启动容器并且将其网络连接在一起。它还能够监控容器以及在负载增加时启动其他容器。


Kubernetes 是目前使用最为广泛的容器编排引擎,被大量的中小型企业用户用于开发或生产环境,并且已经成为业界公认的容器编排管理的标准框架。但是原生的 Kubernetes 因其学习曲线陡峭对于大多数开发人员而言很难直接上手使用。Rancher 作为一个开源的企业级 Kubernetes 容器管理平台,其简洁直观的界面风格和操作体验可以极大程度地解决这一问题。并且 Rancher 实现了 Kubernetes 集群在混合云+本地数据中心的集中部署与管理,能统一纳管位于不同基础架构上的 Kubernetes 集群。此外,Rancher 也将用户的安全问题放在首位。Kubernetes 于 8 月 6 日发布新的补丁版本之后,Rancher 反应迅速,在 1 天之后发布了全新版本Rancher 2.2.7,修复了新近的 CVE 并支持 Kubernetes 新版本。


访问 Rancher Github 主页,了解更多新版本信息:


https://github.com/rancher/rancher/releases


2020 年 5 月 16 日 17:16174

评论

发布
暂无评论
发现更多内容

XSKY发布XMotion纳管热迁移技术,OpenStack集群迁移效率提升超10倍

XSKY融合存储

Wi-Fi p2p & ap 共存

贾献华

wifi p2p ap

服务化构建-多维度的认识中台

图南日晟

软件工程 分层架构 架构设计

艺术生,我劝你Mac

zhoo299

Mac CG 艺术

磁盘挂载

唯爱

《程序员的数学》笔记

Rex

读书笔记

ARTS-WEEK01

lee

ARTS 打卡计划

AB 测试平台的设计与实现

伴鱼技术团队

架构 系统设计 后端 A/B

服务化架构-状态码设计要点

图南日晟

微服务 RESTful 架构设计

安装R语言编译器:

唯爱

说到做到

Yukun

拖延症

Vol.5 Go初探,新手必看!

pyfn2030

编程语言 新手指南

超简单入门MyBatis,看了就会了~

程序员的时光

mybatis

完美兼容老项目!Dataway 4.1.6 返回结构的全面控制

哈库纳

spring Spring Boot Dataway Hasor

游戏夜读 | vim,vim,vim

game1night

小谈校招offer选择

dongh11

职场 职业规划 应届毕业 心态 招聘

深入浅出Mysql索引的那些事儿

猿人谷

MySQL 性能优化 索引

Vol.7 聊聊我热爱的陕西省图书馆

pyfn2030

记录 生活,随想

无需代码!通过 Dataway 配置一个带有分页查询的接口

哈库纳

spring springboot Dataway Hasor

Dataway 配置数据接口时和前端进行参数对接

哈库纳

Spring Boot DataQL Dataway Hasor

系统服务化构建-两方OAuth

图南日晟

微服务 软件工程 身份认证 架构设计

tput命令介绍

唯爱

免费领课的活动你错过了么?

池建强

极客时间

Dataway 4.1.5 以上版本升级指南

哈库纳

string StringBoot Dataway Hasor

Vol.6 几个数据库相关的词

pyfn2030

数据库 大数据 新手指南

【写作群星榜】5.22~5.28写作平台优秀作者&文章排名

InfoQ写作平台官方

写作平台 排行榜

绝了!Dataway让Spring Boot不再需要Controller、Service、DAO、Mapper

哈库纳

StringBoot DataQL

Dataway 整合 Swagger2,让 API 管理更顺畅

哈库纳

Spring Boot DataQL Dataway Hasor

珍藏已久的 OS 学习网站拿出来分享给大家

cxuan

操作系统

使用SpreadJS 开发在线问卷系统,构筑CCP(云数据采集)平台

Geek_Willie

数据挖掘 大数据 SpreadJS CCP

【快点查查】微信小程序使用流程

tomatocc

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

系统管理员必读的容器入门指南-InfoQ