docker作为容器化映像以及容器化运行时,已经流行并成为事实上的标准。随着现代应用程序越来越复杂,对微服务的关注度越来越高,Docker采用得越来越广。Docker允许将应用程序以及它们的依赖打包成文件,作为可以在任何系统上运行的容器。这使得应用部署的周转时间更快,复杂度更低,并解决了兼容性问题。
本书首先介绍容器化的基础知识,让你认识Docker,了解Dockerfile和Docker Volumes等术语,然后演示使用Docker部署简单的python数据、flask应用。
容器化
在本章中,我们将探讨什么是Docker,以及什么是容器化,以及它与虚拟化的区别。
什么是Docker?当我们回答这个问题时,我们需要明确 "docker "这个词,。因为Docker已经成为容器的代名词。
Docker这个公司 Docker Inc.是Docker背后的公司。Docker Inc.由Solomon Hykes在2010年成立,名为dotCloud Inc.。dotCloud的工程师为Linux容器构建了抽象和工具,并使用了Linux Kernel的特性cgroups和命名空间,目的是降低使用Linux容器的复杂性。dotCloud将他们的工具开源,并将重点从PaaS业务转向专注于容器化。Docker Inc.将dotCloud卖给了cloudControl,后者最终申请破产。
Docker这个软件技术 Docker是提供操作系统级虚拟化的技术,称为容器。需要注意的是,这和硬件虚拟化是不一样的。我们将在本章后面探讨这个问题。Docker使用Linux内核的资源隔离功能,如cgroups、内核命名空间和OverlayFS,都在同一个物理机或虚拟机内。OverlayFS是一个可联合的文件系统,它将多个文件和目录组合成一个文件系统,以便运行多个应用程序,这些应用程序是相互隔离和包含的,都在同一个物理机或虚拟机内。
在很长一段时间内,对于系统管理员来说,设置开发者工作站是一项非常麻烦的任务。即使完全自动化地安装开发者工具,当你混合使用不同的操作系统、不同版本的操作系统以及不同版本的库和编程语言时,设置一个一致的、提供统一体验的工作空间几乎是不可能的。Docker通过减少移动部件来解决这个问题。现在的目标不再是操作系统和编程版本,而是Docker引擎和运行时。Docker引擎提供了一个来自底层系统的统一抽象,使得开发人员非常容易测试他们的代码。
1979年:chroot 1979年,Chroot系统调用在Version 7 UNIX中被引入。chroot的前提是它改变了当前正在运行的进程及其子进程的明显根目录。在chroot中启动的进程不能访问指定目录树以外的文件。这种环境被称为chroot监狱。
2000: 在chroot概念的基础上,FreeBSD增加了一个功能,允许将FreeBSD系统分割成几个独立的、隔离的系统,称为jail。每一个jail都是主机系统上的一个虚拟环境,拥有自己的文件、进程和用户帐号。
chroot 只限制了进程对文件系统的浏览, 而 FreeBSD jails 则限制了被囚禁的进程对整个系统的活动, 包括与之绑定的 IP 地址。这使得FreeBSD越狱成为测试新的互联网连接软件配置的理想方式,使得试验不同的配置变得容易,同时又不允许越狱的改变影响到外部的主系统。
2005: OpenVZ OpenVZ在为低端虚拟专用服务器(VPS)提供商提供操作系统虚拟化方面相当流行。OpenVZ允许一个物理服务器运行多个隔离的操作系统实例,即所谓的 "OpenVZ"。
作为容器。OpenVZ使用打过补丁的Linux内核,与所有容器共享。每个容器作为一个独立的实体,拥有自己的虚拟化文件、用户、组、进程树和虚拟网络设备集。
2006年:cgroups 最初被称为进程容器,cgroups(控制组的简称)。
cgroups是Linux内核的一个功能,它可以将资源的使用(如CPU、内存、磁盘I/O和网络)限制并隔离到一系列进程中。cgroups已经被重新设计过多次,每次重新设计都会考虑到越来越多的使用案例和所需功能。
2008: LXC LXC通过结合Linux内核的cgroups和对隔离命名空间的支持,为应用程序提供一个隔离的环境,从而提供操作系统级别的虚拟化。Docker最初使用LXC提供隔离功能,但后来改用自己的库。
参考资料
- 本讲座目录
- 代码地址 https://github.com/china-testing/python-testing-examples/tree/master/pytest_projects 建议拷贝到浏览器访问
- 本文涉及的python测试开发库 谢谢点赞!
- 本文相关海量书籍下载
容器和虚拟机的区别
很多人认为,既然容器隔离了应用,那么就和虚拟机一样。乍一看好像是这样,但根本的区别是容器和主机共享同一个内核。
Docker只隔离一个进程(或一组进程。取决于镜像的构建方式),所有的容器都运行在同一个主机系统上。由于隔离是应用在内核层面,所以与虚拟机相比,运行容器不会给主机带来沉重的开销。当一个容器被启动时,所选的进程 或一组进程仍然运行在同一台主机上,不需要虚拟化或仿真任何东西。图1-1显示了在一台物理主机上的三个不同容器上运行的三个应用程序。
![](https://img.haomeiwen.com/i12713060/2542dacc417863a3.png)
当一个虚拟机被启动时,管理程序将整个系统虚拟化--从CPU到RAM到存储。为了支持这个虚拟化系统,需要安装整个操作系统。
就所有实际目的而言,虚拟化系统就是一台运行在计算机中的整台计算机。现在如果你能想象运行一个单一的操作系统需要多少开销,那么想象一下,如果你运行一个嵌套的操作系统,会是怎样的情况!
![](https://img.haomeiwen.com/i12713060/efe03317aedf9ff4.png)
在虚拟机的情况下,我们不仅需要应用程序的依赖库,还需要一个操作系统来运行应用程序。相比之下,对于容器来说,主机操作系统的内核与应用共享,就意味着去掉了一个额外操作系统的开销。这不仅极大地提高了性能,也让我们提高了资源利用率,最大限度地减少了计算能力的浪费。
总结
在这一章中,你了解了一些关于Docker这个公司、Docker容器以及容器与虚拟机的比较。你还了解了一些关于容器试图解决的现实世界的问题。
网友评论