-- 知识铺
mall学习教程官网:macrozheng.com
程序员受苦久矣
多年前的一个夜晚,风雨大作,一个名叫Docker的年轻人来到Linux帝国拜见帝国的长老。
“Linux长老,天下程序员苦于应用部署久矣,我要改变这一现状,希望长老你能帮帮我”
长老回答:“哦,小小年纪,口气不小,先请入座,你有何所求,愿闻其详”
Docker坐下后开始侃侃而谈:“当今天下,应用开发、测试、部署,各种库的依赖纷繁复杂,再加上版本之间的差异,经常出现在开发环境运行正常,而到测试环境和线上环境就出问题的现象,程序员们饱受此苦,是时候改变这一状况了。”
Docker回头看了一眼长老接着说到:“我想做一个虚拟的容器,让应用程序们运行其中,将它们需要的依赖环境整体打包,以便在不同机器上移植后,仍然能提供一致的运行环境,彻底将程序员们解放出来!”
Linux长老听闻,微微点头:“年轻人想法不错,不过听你的描述,好像虚拟机就能解决这个问题。将应用和所依赖的环境部署到虚拟机中,然后做个快照,直接部署虚拟机不就可以了吗?”
Docker连连摇头说到:“长老有所不知,虚拟机这家伙笨重如牛,体积又大,动不动就是以G为单位的大小,因为它里面要运行一个完整的操作系统,所以跑起来格外费劲,慢就不说了,还非常占资源,一台机器上跑不了几台虚拟机就把性能拖垮了!而我想要做一个轻量级的虚拟容器,只提供一个运行环境,不用运行一个操作系统,所有容器中的系统内核还是和外面的宿主机共用的,这样就可以批量复制很多个容器,轻便又快捷”
Linux长老站了起来,来回踱步了几圈,思考片刻之后,忽然拍桌子大声说到:“真是个好想法,这个项目我投了!”
Docker眼里见光,喜上眉梢,“这事还真离不开长老的帮助,要实现我说的目标,对进程的管理隔离都至关重要,还望长老助我一臂之力!”
“你稍等”,Linux长老转身回到内屋。没多久就出来了,手里拿了些什么东西。
“年轻人,回去之后,尽管放手大干,我赐你三个锦囊,若遇难题,可依次拆开,必有大用”
Docker开心的收下了三个锦囊,拜别Linux长老后,冒雨而归。
这或许是一个对你有用的开源项目,mall项目是一套基于 SpringBoot3 + JDK 17 + Vue 实现的电商系统(Github标星60K),采用Docker容器化部署,后端支持多模块和微服务架构。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!
项目演示:
Docker项目启动之初,首要任务是限制容器内进程的文件系统访问范围。Docker必须确保这些进程不能随意访问系统目录,而是将活动范围限制在一个特定的区域。这就需要用到Linux系统提供的两个关键函数:chroot和pivot_root。
1. 理解chroot和pivot_root
chroot函数允许改变一个进程的根目录,使得进程只能访问到指定目录下的文件系统。而pivot_root函数则可以修改进程和系统的根目录,这为Docker提供了一种方法来隔离容器内的进程。
2. 应用场景
Docker在启动时,首先需要创建一个隔离的环境。通过使用chroot或pivot_root,Docker可以将容器内的进程的根目录设置为一个特定的目录,从而限制其访问范围。
3. 操作步骤
-
创建隔离环境:Docker首先创建一个隔离的目录,这个目录将作为容器的根目录。
-
应用chroot或pivot_root:接下来,Docker使用chroot或pivot_root将容器内进程的根目录更改为这个隔离目录。
-
伪造文件系统:Docker需要伪造一个文件系统,以欺骗容器内的进程,使其认为它们正在访问的是整个系统,而实际上它们被限制在了隔离目录内。
4. 优势与局限
使用chroot和pivot_root为Docker提供了强大的隔离机制,但同时也存在一些局限性,例如对文件系统的依赖和可能的性能影响。Docker需要权衡这些因素,以确保容器的安全性和效率。
5. 结论
Docker通过chroot和pivot_root函数实现了对容器内进程的文件系统访问限制,为构建安全的容器化环境奠定了基础。
为了不露出破绽,Docker很聪明,用操作系统镜像文件挂载到容器进程的根目录下,变成容器的rootfs,和真实系统目录一模一样,足可以以假乱真:
$ ls /
bin dev etc home lib lib64 mnt opt proc root run sbin sys tmp usr var
Docker与Namespace的邂逅
Docker在解决文件系统问题后,又面临了一个新的挑战:如何隐藏真实系统的世界,让容器内的进程无法窥探到进程列表、网络设备、用户列表等敏感信息。Docker深知,虽然名为容器,但容器内的进程实际上是在宿主操作系统上运行的独立进程。要实现这一目标,需要一种巧妙的机制来遮蔽这些进程的视野。
问题所在Docker曾考虑使用HOOK方法来欺骗进程,但这种方法复杂度高,兼容性和稳定性都无法保证。
锦囊妙计在困惑之际,Docker想起了Linux长老赠予的锦囊。他打开第二个锦囊,上面写着:namespace。
探索NamespaceDocker开始四处打听,经过一番研究,终于明白了namespace的奥秘。Namespace是Linux提供的一种机制,它能够创建多个隔离的命名空间,将进程分配到这些命名空间中,从而达到隔离的效果。
命名空间的作用
- 进程隔离:每个命名空间内的进程只能看到同一命名空间内的其他进程。
- 资源隔离:每个命名空间内的资源分配是独立的,互不影响。
实现方法Docker可以通过创建特定的命名空间,将容器内的进程限制在这些空间内,从而实现对宿主系统的隐藏。
优势
- 简化管理:容器管理变得更为简单,因为进程和资源都被有效隔离。
- 提高安全性:隔离减少了容器内进程对宿主系统的潜在风险。
结论通过使用namespace,Docker能够有效地隐藏宿主系统,为容器内的进程提供一个干净、隔离的运行环境。这不仅简化了容器的管理,也提高了系统的安全性。
在Docker的世界中,命名空间和CGroup是其核心技术的两大支柱。首先,让我们来谈谈命名空间。每个命名空间都是一个独立的世界,其中运行的进程只能看到自己空间内的用户、网络等资源,而对外界一无所知。这种隔离机制为Docker提供了一种障眼法,使得容器内的进程仿佛置身于一个封闭的环境中,无法感知外部世界。
接下来是CGroup,即控制组。这是Linux内核提供的一种机制,用于限制、记录和隔离进程组所使用的物理资源。Docker利用CGroup来管理容器的资源使用,确保每个容器都能获得合理的资源分配,避免因资源过度使用而导致系统不稳定。
Docker在Linux帝国中推广自己的技术,受到了广泛的欢迎。许多知名的服务,如nginx、redis等,都选择使用Docker容器化技术。然而,随着Docker的普及,也带来了一些问题。例如,一个名为Redis的进程由于资源使用过度,几乎耗尽了系统的内存,导致Linux帝国内存管理部不得不采取措施,甚至考虑杀掉一些进程来释放资源。Docker虽然取得了成功,但也面临着资源管理的挑战。
Docker在一次意外中发现Redis进程可能存在安全隐患。在管理人员的犹豫下,Docker得以逃脱,并开始思考如何对容器内的进程进行有效管理。
一、问题发现
Docker意识到,如果容器中的进程不受控制,可能会导致资源的过度使用,如CPU、内存、硬盘和网络等。这不仅影响容器本身的性能,还可能对整个系统造成负担。
二、解决方案
Docker回忆起Linux长老曾提到的CGroup机制,这似乎是解决当前问题的关键。
三、CGroup机制
CGroup是一种Linux内核提供的资源管理机制,可以对进程进行分组,并限制每个分组的资源使用。具体包括:
-
内存上限
-
CPU使用率
-
硬盘空间 系统内核将自动监控和限制这些分组内的进程,确保它们不会超出分配的资源限制。 四、实施管控 Docker决定利用CGroup对容器内的进程进行管控,以防止它们做出超出资源限制的行为,从而保护整个系统的稳定运行。
在Linux世界中,Docker技术因其出色的容器管理能力而备受赞誉。Linux长老们提供了三个关键的锦囊妙计,极大地增强了Docker的功能。这些锦囊不仅让Docker在容器进程管理上更加得心应手,还让Docker成为了Linux帝国中的大名人。
- Linux长老的锦囊:Docker通过采纳Linux长老的建议,实现了更高效的容器管理。
- CGroup技术的应用:Docker整合了CGroup技术,进一步强化了对容器内进程的控制,保障了系统的稳定性和安全性。
- 面对新挑战:尽管Docker已经取得了显著的成就,但它也意识到,随着能力的增长,面临的责任和挑战也在增加。
另一方面,在GitHub上,一个名为
mall
的电商实战项目受到了广泛关注,该项目标星数高达60K。它提供了一套完整的视频教程,这些教程是2023年最新版,总时长约为40小时,共113期。通过学习这套教程,开发者可以掌握主流的Java技术栈,并提升独立开发项目的能力。 项目的整体架构图如下所示,感兴趣的开发者可以通过以下链接深入了解并加入学习:mall视频教程。
视频教程推荐
1. 视频教程概览整套视频教程内容完善,覆盖了以下关键领域:
- Mall项目最佳学习路线
- 整体框架搭建
- 业务与技术实现全方位解析
- 线上Docker环境部署
- 微服务项目学习
2. 教程链接点击这里了解更多视频教程内容。
推荐阅读列表
以下是一些精选的推荐阅读,涵盖了Spring Boot 3、JDK17实战项目,以及开源电商系统等主题:
- 全面升级实战项目:基于Spring Boot 3+JDK17的实战项目。
- 开源电商系统:69K Star的最强开源电商系统。
- Github标星60K教程:涵盖主流Java技术的完整项目实战教程。
- 购物车、订单、支付设计:项目中购物车、订单、支付的一整套设计。
- 支付系统设计:支付系统的设计方法。
- 权限系统设计:权限系统的设计策略。 以上推荐阅读将助你深入了解和掌握相关技术与实战经验。
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek001/post/20240730/%E6%8A%80%E6%9C%AF%E6%80%BB%E7%9B%91%E5%AF%B9Docker%E7%90%86%E8%A7%A3%E7%9A%84%E5%A4%AA%E9%80%8F%E5%BD%BB%E4%BA%86%E5%87%A0%E5%8F%A5%E8%AF%9D%E7%BB%99%E7%A8%8B%E5%BA%8F%E5%91%98%E6%96%B0%E4%BA%BA%E6%95%B4%E7%9A%84%E6%98%8E%E6%98%8E%E7%99%BD%E7%99%BD--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com