【探索 Kubernetes|容器基础进阶篇 系列1】容器的本质是进程

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
函数计算FC,每月15万CU 3个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 大家好,我是秋意零。😈 CSDN作者主页• 😎 博客主页👿 简介• 👻 普通本科生在读• 在校期间参与众多计算机相关比赛,如:🌟 “省赛”、“国赛”,斩获多项奖项荣誉证书• 🔥 各个平台,秋意零/秋意临 账号创作者• 🔥 云社区 创建者点赞、收藏+关注下次不迷路!欢迎加入云社区

👹 关于作者


大家好,我是秋意零。

😈 CSDN作者主页

👿 简介

  • 👻 普通本科生在读
  • 在校期间参与众多计算机相关比赛,如:🌟 “省赛”、“国赛”,斩获多项奖项荣誉证书
  • 🔥 各个平台,秋意零/秋意临 账号创作者
  • 🔥 云社区 创建者
点赞、收藏+关注下次不迷路!

欢迎加入云社区


一、为什么会出现容器?

  • 我们来假设一个场景,某个客户向某个公司定制了一个产品,经过2个月的使用这个产品终于完成了,并且在>自己公司中也是可以安全运行的,这个时候就需要到客户哪里交付,需要现场安装部署。
  • 在安装部署过程中,需要在客户哪里准备好自己产品的运行环境,由于产品比较大,配置环境是非常浪费时间和精力的,而且这个过程中或许还会出现自己公司没有遇到过的问题。
  • 显然这种传统方式,是需要优化改进的。这个时候就出现了容器部署,容器解决了应用打包的这个根本难题

当然还要其它应用场景,这里只是说明一个举例。

二、容器是什么?

紧跟上面的例子:

容器解决了应用打包的这个根本难题

  • 这个打包包含应用环境和应用本身,就是说可以打包自己应用和环境,这就是一个镜像,有了这个镜像,我们只需要携带这个镜像到客户现场运行这个镜像就行了,这时运行的镜像就称为容器。
  • 容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用“装”起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。

专业名词:

  • image: 镜像包含应用和应用环境
  • contaienr: 容器是镜像的运行出来的状态
  • registry: 仓库是存放镜像的地方

容器本身没有太大价值,有价值的是“容器编排” (相当于是说,技术本身没有价值,价值在于解决实际问题)


  • 编排主要是容器之间的关系,也之所以 Kubernetes 项目和CNCF社区 火的原因之一

这里简单提一嘴: Kubernetes 可以看作是操作系统,而容器就是应用程序进程

三、容器“边界”的实现手段

3.1、进程如何运行的?

  • 假如,你要写一个计算加减法的程序,这个程序需要的输入来自一个文件,计算结果输出到另一个文件
  • 因为计算机只认识二进制 0 和 1,不管用什么语言编写,都需要将这段代码编译成二进制文件,这样计算机才能运行。
  • 我们知道我们的数据(程序)是存放在磁盘当中的,运行程序时需要将磁盘数据放入内存中,这样CPU、寄存器和内存协作计算,还有被打开的文件,以及各种各样的 I/O 设备在不断地调用中修改自己的状态,这个程序就运行起来了。
  • 一旦“程序”被执行起来,它就从磁盘上的二进制文件,变成了内存中的数据、寄存器里的值、堆栈中的指令、被打开的文件,以及各种设备的状态信息的一个集合。这样的一个程序运行集合就是我们的今天的主角:进程
  • 所以,对于进程来说,它的静态表现是程序,存放在磁盘中动态表现是进程,数据和状态的集合

3.2、Namespace 与 Docker 边界

  • 而容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。
  • 对于 Docker 等大多数 Linux 容器,Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术则是用来修改进程视图的主要方法。

可能觉得 Cgroups 和 Namespace 这两个概念很抽象,我们一起动手实践一下,就很容易理解这两项技术了。

我们使用 docker run 运行一个镜像容器,-it 参数是分配一个文本输入/输出环境,TTY

[root@master01 ~]# docker run -it busybox /bin/sh

/ # ps

PID   USER     TIME  COMMAND

   1 root      0:00 /bin/sh

   7 root      0:00 ps

可以看到,我们第一个进程号是 PID=1,并且运行的是 /bin/sh 命令,还有一个就是我们刚才执行的 ps 命令
可以看到,我们已经被 Docker 隔离在一个跟宿主机完全不同的环境当中。

容器的本质是一个进程

宿主机上我们执行 ps 命令可以看到,宿主机上有个进程,这个进程是我们运行容器时所使用的命令,也代表了我们容器也是一个进程表现出来的,所以 容器的本质是一个进程

[root@master01 ~]# ps -aux | grep "/bin/sh"

...

root      97285  0.3  0.2 933264 21796 pts/0    Sl+  11:33   0:00 docker run -it busybox /bin/sh

...

为了表现这个容器是进程我们做一个实验

  • 首先连接工具开两个窗口
  • 一个运行的是 docker run -it busybox /bin/sh 这样一条命令
  • 另一个执行 ps -aux | grep "/bin/sh" 找到这里的 docker run -it busybox /bin/sh 进程,执行 kill -9 97285 (这里通过 ps 命令可以看到我的容器 PID 是97285)杀掉这个进程,如图可以看到  docker run -it busybox /bin/sh 进程退出了,说明了 容器的本质是一个进程

这是怎么做到的呢?

  • 本来,每当我们在宿主机上运行了一个 /bin/sh 程序时,操作系统都会给它分配一个进程编号,比如 PID=1000。 进程编号具有唯一标识,就像员工的工号,所以我们可以看作 /bin/sh 是公司里的第 1000 名员工,而 1 号员工就是老板,管理全局的人。
  • 现在,我们通过 Docker 把这个 /bin/sh 程序运行在一个容器中。这时,Docker 就会在这个 1000 号员工入职时给他一个“障眼法”,让他永远看不到前面的其他 999 个员工,更看不到老板。这样,他就会以为自己第 1 号员工。

这种机制,其实就是对被隔离应用的进程空间做了手脚,也就是使用了 Linxu 中的 Namespace 技术

这种 Namespace 使用方式,其实是 Linux 创建新进程的一个可选参数,比如:

# 创建一个新的进程,并且返回它的进程号 pid

int pid = clone(main_function, stack_size, SIGCHLD, NULL);

而当我们用 clone() 系统调用创建一个新进程时,就可以在参数中指定 CLONE_NEWPID 参数(新PID),比如:

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);

这时,新创建的这个进程将会“看到”一个全新的进程空间,在这个进程空间里,它的 PID 是 1。之所以说“看到”,是因为这只是一个“障眼法”,在宿主机真实的进程空间里,这个进程的 PID 还是真实的数值,比如 100。

  • 我们还可以多次执行上面的 clone() 调用,这样就会创建多个 PID Namespace,而每个 Namespace 里的应用进程,都会认为自己是当前容器里的第 1 号进程
  • 除了我们刚刚用到的 PID Namespace,Linux 操作系统还提供了 Mount、UTS、IPC、Network 和 User 这些 Namespace,用来对各种不同的进程上下文进行“障眼法”操作。
  • 比如,Mount Namespace,用于让被隔离进程只看到当前 Namespace 里的挂载点信息;Network Namespace,用于让被隔离进程看到当前 Namespace 里的网络设备和配置。

这,就是 Linux 容器最基本的实现原理了

Docker 容器这个听起来玄而又玄的概念,实际上是在创建容器进程时,指定了这个进程所需要启用的一组 Namespace 参数。这样,容器就只能“看”到当前 Namespace 所限定的资源、文件、设备、状态,或者配置。而对于宿主机以及其他不相关的程序,它就完全看不到了。

所以说,容器,其实是一种特殊的进程而已。

总结

相信大家学容器时都看过这个虚拟机和容器的对比图。

  • 左边是虚拟机的工作原理,其中 Hypervisor 软件是虚拟机最重要的部分它可以实现模拟出各种硬件,比如:CPU、内存、磁盘等,在 Hypervisor 软件层之上创建 Guest OS 也就是客户机操作系统,Guest OS 和 Hypervisor 模拟出来的硬件交互 ,这样用户应用程序就可以运行在这个虚拟机中,用户自然看到的就是这个新的操作系统的文件系统结构,这也是虚拟机也能起到将不同应用程序相互隔离的原因
  • 右边,则用一个名为 Docker Engine 的软件替换了 Hypervisor。这也是为什么,很多人会把 Docker 项目称为“轻量级”虚拟化技术的原因,实际上就是把虚拟机的概念套在了容器上这样的说明并不严谨,因为 容器本质是运行在宿主机上的进程,使用的是 Namespace 技术,通过 Namespace 技术实现网络、磁盘、PID、用户等隔离

相信你此刻已经会心一笑:容器隔离不过都是“障眼法”罢了

✊ 最后


👏 我是秋意临,欢迎大家一键三连、加入云社区

👋 我们下期再见(⊙o⊙)!!!



相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
2月前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
7天前
|
PHP Docker 容器
如何在宿主主机运行容器中的php守护进程
在Docker容器中同时运行多个程序(如Nginx+PHP+Ftp)时,需用`docker exec`命令启动额外服务。首先通过`php -v`查看PHP版本,再用`which php-fpm7.4`确认PHP安装路径,通常返回`/usr/sbin/php-fpm7.4`。最后直接运行该路径启动PHP-FPM服务,确保其正常工作。
38 14
|
1月前
|
存储 运维 Kubernetes
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
飞轮科技推出了 Doris 的 Kubernetes Operator 开源项目(简称:Doris Operator),并捐赠给 Apache 基金会。该工具集成了原生 Kubernetes 资源的复杂管理能力,并融合了 Doris 组件间的分布式协同、用户集群形态的按需定制等经验,为用户提供了一个更简洁、高效、易用的容器化部署方案。
正式开源,Doris Operator 支持高效 Kubernetes 容器化部署方案
|
27天前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
114 25
|
1月前
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
2月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
172 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
1月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
184 11
|
2月前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
2月前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
1月前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。

相关产品

  • 容器服务Kubernetes版