热门标签 | 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


推荐阅读
  • 本文主要介绍关于linux文件描述符设置,centos7设置文件句柄数,centos7查看进程数的知识点,对【Linux之进程数和句柄数】和【linux句柄数含义】有兴趣的朋友可以看下由【东城绝神】投 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • (九)Docker常用安装
    一、总体步骤1、搜索镜像2、拉取镜像3、查看镜像4、启动镜像5、停止镜像6、移除镜像二、安装tomcat1、dockerhub上面查找tomcat镜像 dockersearchto ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • mysql自动打开文件_让docker中的mysql启动时自动执行sql文件
    本文提要本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动My ... [详细]
  • k8s进阶之搭建私有镜像仓库
    企业级私有镜像仓 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • Linux神奇漏洞:长按回车键70秒 即可轻松拿到Root权限
    一般来说获取系统root权限是很困难的,尤其是加密系统中,但西班牙安全研究员hectormarco、ismaelripoll发现,linux系统下只需按住回车键70秒钟,就能轻 ... [详细]
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社区 版权所有