热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

由浅入深docker系列:(4)容器与虚拟机

如果你认真对着前三篇教程做了练习,那么想必现在对docker的使用已经比较熟悉,对于不太复杂的需求也能做到胸有成竹,但是,你还是不敢声称熟悉docker,因为你完全不了解docke






如果你认真对着前三篇教程做了练习,那么想必现在对 docker 的使用已经比较熟悉,对于不太复杂的需求也能做到胸有成竹,但是,你还是不敢声称熟悉 docker,因为你完全不了解 docker 的内部原理,对于你它完全是个孤立的黑匣子。

那么接下来,我将带领你去认识它,让它不再陌生。


一:Ubuntu 18.04和 16.04的内核版本一样么

首先,容器和虚拟机的区别是什么呢?你一定看到过很多答案,说容器更轻量,更快,虚拟机要虚拟化硬件等等,还有这张经典图,但是可能你并不是很理解,至少我当时看的一头雾水。
虚拟机、容器架构

我们知道,ubuntu 16.04和 ubuntu18.04的内核版本是不一样的,ubuntu16.04的虚拟机和 ubuntu18.04的虚拟机的内核版本也必定不一致。那么,如果是 ubuntu16.04和 ubuntu18.04的 docker 环境呢?

我们来试一下:查看linux 系统内核信息可以使用命令 uname -a,剩下的你应该知道怎么做了。不知道的话,再去看一下前几篇。

这是我在 macos上的执行结果:

uname -a

我们发现,debian 和 ubuntu 的内核版本竟然是一样的!如果你有兴趣,还可以试验 debian或者其他系统,你会发现他们都是一样的!


二:内核 VS 用户程序

我们知道,操作系统分为内核和用户程序,进而存在内核空间(kernel space)和用户空间(user Space)。简单说,Kernel Space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。Kernel space 可以执行任意命令,调用系统的一切资源;User space 只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(又称 system call),才能向内核发出指令。

而容器事实上就是一个用户程序,它同样通过调用系统接口实现功能。对于 docker 而言,如果宿主机是 linux,它就直接使用宿主机内核,如果宿主机是 macos 或者 windows,docker服务会提供一个公用的 linux内核供各容器调用,因此你会看到 ubuntu18.04和16.04的内核版本是一致的。
用户空间和内核空间

而容器镜像里的文件,包括了可执行程序以及它的依赖,例如 ubuntu18.04镜像,就是把18.04的所有可执行程序以及它们的依赖进行打包,容器启动的时候文件被加载进内存,事实上就对应着用户空间,而这些程序的运行,还需要调用系统接口。

你一定会说,那现在容器依赖内核接口,如果内核接口变了,容器不就无法正常运行了?

事实上,内核接口的变更是比较慎重、缓慢的,在短时间内,我们可以预期容器能够正常运行。但是,随着宿主系统尤其是内核的升级,我们并不能保证 docker 容器永远可以正常运行。


三:容器与虚拟机

现在,你应该明白了为什么ubuntu16.04和18.04的 docker 容器内核版本一样,那么,容器和虚拟机的区别也就明显了,它们虚拟化的层次并不一样。

虚拟机完整虚拟了内核和用户空间,而 docker 仅仅虚拟了用户空间,那么 docker 必然更轻量、更快。

再回头看第一张图,也就清晰了。虚拟机建立在虚拟硬件层之上,每个虚拟机都有独立的内核和用户程序以及依赖库;而 docker 容器建立在宿主机内核和 docker 服务之上,使用共同的内核,每个容器仅仅是用户程序、依赖库不同;再更进一步,普通的程序都使用共同的依赖库,只有程序文件不同。

纵观全局,从普通的应用程序,到docker 容器,再到虚拟机技术,无非是对磁盘空间、系统资源和隔离性、安全性的权衡取舍而已。至于 docker 的自动化,对比虚拟机似乎并不公平,于 Vagrant 这样的工具相比倒是更加合适。


四:其它

再解释下之前的问题,既然 docker容器仅仅是一个进程,与虚拟机并不一样,也就不适合以虚拟机的方式使用 docker。 docker 容器的创建、关闭代价很小,我们应该使用独立的docker 容器执行独立的任务,就像之前 mysql、app、nginx各自起独立的 docker 容器,这样更方便容器的复用及更新,也方便对系统资源进行管理。

既然 docker 容器只是一个进程,为什么我们使用的时候感觉和虚拟机很像?在容器里使用 ps 看不到其它进程,看不到其它文件等等。这就涉及到了 linux 内核提供的CGroups机制,它为进程提供了文件、cpu、内存、网络等资源的隔离,是虚拟化技术的基础,也即是我们第五篇要介绍的内容,敬请期待。


参考资料:**

什么是 docker

Architecting Containers




docker


推荐阅读
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 原文地址http://balau82.wordpress.com/2010/02/28/hello-world-for-bare-metal-arm-using-qemu/最开始时 ... [详细]
  • Linux神奇漏洞:长按回车键70秒 即可轻松拿到Root权限
    一般来说获取系统root权限是很困难的,尤其是加密系统中,但西班牙安全研究员hectormarco、ismaelripoll发现,linux系统下只需按住回车键70秒钟,就能轻 ... [详细]
  • k8s进阶之搭建私有镜像仓库
    企业级私有镜像仓 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了在Ubuntu下制作deb安装包及离线安装包的方法,通过备份/var/cache/apt/archives文件夹中的安装包,并建立包列表及依赖信息文件,添加本地源,更新源列表,可以在没有网络的情况下更新系统。同时提供了命令示例和资源下载链接。 ... [详细]
  • 本文介绍了在Web应用系统中,数据库性能是导致系统性能瓶颈最主要的原因之一,尤其是在大规模系统中,数据库集群已经成为必备的配置之一。文章详细介绍了主从数据库架构的好处和实验环境的搭建方法,包括主数据库的配置文件修改和设置需要同步的数据库等内容。MySQL的主从复制功能在国内外大型网站架构体系中被广泛采用,本文总结了作者在实际的Web项目中的实践经验。 ... [详细]
author-avatar
手机用户2502887447
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有