学习目标
本文为Amazon容器入门课程笔记,内容是容器化背后的发展历史和概念,介绍容器生态系统中使用的特定技术,并讨论容器在微服务架构中的重要性。
本篇文章仅做前两个小结的梳理和总结。看完这篇文章之后应该掌握容器背后的发展历史、技术和术语。
什么是容器?
现实世界中容器是一种标准化的存储单元,以前运输货物是一件非常困难的事情,因为货物的形状各异,有的放得住,有的放不住,有的站得住,有的站不住,你是没有办法船上运输某些东西的。
到了18世纪,集装箱出现并沿用至今,持续200多年。后来有两个人把集装箱申请专利了。集装箱的出现改善了货物的装卸,同时还为货物提供了一致可预测的存储单元,可以方便的将集装箱再转运到卡车或者开运输工具上。将重点放到了集装箱,而不是单件货物上,我们提高了效率,提高了生产力,同时降低了消费者的成本。这就是使用抽象来提高敏捷性的一个很好的例子。
现在让我们回到计算机的世界当中。 在计算平台中,容器是一种标准化的软件单元,可在运行容器化平台的任何计算环境中快速可靠的运行。容器是在操作系统级别实施的一种形式的虚拟化。容器是独立的轻量级软件包,其中包括运行应用程序所需的一切,例如代码,运行时,系统工具,系统库和设置。
一台服务器可以托管多个容器,而且所有容器共享底层主机系统的操作系统内核。这些容器可以是大型企业应用程序中的服务,也可以是在隔离环境中运行的独立应用程序。
容器与其他形式的虚拟化的区别
技术的成熟度水平通常伴随着抽象水平的提高。
裸机服务器时代
使用裸机服务器,人们可以构建架构层,例如基础设施和应用程序软件层。例如在服务器硬件上安装操作系统,在该操作系统上安装所有共享库。然后再安装使用这些库的应用程序。这种运行方式持续了很长一段时间。
这种架构的问题在于效率极低。 无论是以0%的利用率还是100%的利用率运行,硬件成本都是相同的。所有应用程序都需要争夺相同的资源,并且你必须使库的版本与所有应用程序保持同步。如果一个应用程序需要库的更新版本,但主机上运行的其他应用程序不兼容这个版本。这时就会遇到问题。
虚拟机
你可以通过在操作系统上放置虚拟化平台来提高敏捷性。现在你已经使用虚拟机自带的完整操作系统隔离了应用程序及其库,这样你就可以使用现有的硬件运行更多的虚拟机,从而提高了利用率,并大大减少了物理占用空间。虚拟机的缺点是含有非常多的虚拟化层。 在下图的例子中,主机上现在有四个操作系统,而不是一个,这意味着需要更多的补丁和更新,同时在物理主机上占用了更多的空间,此外还有很严重的冗余,比如你可能把相同的操作系统安装了四次,还可能将相同的库安装了三次。
容器他来了
为了解决虚拟机的问题,我们引入了容器。容器运行时共享操作系统内核,让您能够使用文件系统层创建容器镜像。
容器具有轻量级、高效、快速的特点,与虚拟机相比,容器的启动和关闭速度更快,从而可以更好的利用基础硬件。你可以按需共享库,也可以为不同的应用程序提供不同的库,彼此互不影响。而且容器高度可移植。由于容器将软件与其他层隔离开来,因此各软件的代码可以在不同的环境中无差别的运行。从开发一直到生产的各个阶段。
总结两句
裸机服务器 | 虚拟机 | 容器 | |
---|---|---|---|
存在的问题 | 效率低下 | 1.含有过多虚拟化层 2.造成冗余 | |
优点 | 提高敏捷性 | 1.轻量级、高效、快速。 2.高度可移植 |
容器化并不新奇!!!
容器化不是一个全新的概念。操作系统层面的虚拟化是一个相当成熟的思路:
- 2004 年 - Solaris Zones
- 2000年 -FreeBSD jails
- 1982 年 - Unix chroot
操作系统层虚拟化是指通过划分一个宿主操作系统的特定部分,产生一个个隔离的操作执行环境。操作系统层的虚拟化是操作系统内核直接提供的虚拟化,虚拟出的操作系统之间共享底层宿主操作系统内核和底层的硬件资源。操作系统虚拟化的关键点在于将操作系统与上层应用隔离开,将对操作系统资源的访问进行虚拟化,使上层应用觉得自己独占操作系统。
为什么现在容器如此流行?
原因之一是docker作为虚拟化平台的兴起。2013年三月发布的docker是一个轻量级容器虚拟化平台,提供用于创建存储,管理和运行容器的工具,并且可轻松与自动构建测试和部署管道相集成。
Docker只是小鲸鱼?🐳
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的优缺点
在课程中简述了docker的几大优势:
- 可移植的运行时应用程序环境
- 可将应用程序和依赖项打包进单一的不可变构件中
- 能够同时运行具有不同依赖项的不同应用程序版本
- 更快的开发和部署周期
- 提高资源利用率和效率
映像,容器的模板
映像是一个包含容器创建说明的只读模板。正在运行的容器是映像的实例。
你可以有两条路:
从头开始创建映像 | 使用由其他人创建并发布到公有或私有注册表的映像 |
---|---|
![]() | ![]() |
一个映象通常在另一个映像的基础上进行了一些自定义。
例如,你可以继续注册表中的Linux印象构建新的映像,但是除了基本配置之外,为使你的应用程序运行,它还会安装web服务器和你所要用到的一些应用程序。
若要构建新映像,你可以使用简单的语法创建一个docker file,对于定义如何创建并运行印象。docker file中的每条指令都会在印象中创建一个只读层。
代码示例
我们来看几个例子:
-
例子1
FROM ubuntu:latest CMD echo "Hello world"
在第一个简单的事例中,你首先使用现有的映像。映像托管在docker hub或其他站点上,您只需添加一个命令容器在启动后输出
hello world
。 -
例子2
FROM openjdk:8 COPY/hello.jar/usr/src/hello.jar CMD java-cp/usr/src/hello.jar o rg.example.App
第二段代码是运行JAVA的应用程序。你使用openjdk 8映像开始。将包含代码的jar文件从系统复制到容器中,然调用JAVA来运行代码。对此,容器进行实例化后,它将运行该JAVA应用程序。
-
例子3
FROM centos:7 RUN yum-y update && yum -y install httpd EXPOSE 80 ADD run-httpd.sh/run-httpd.sh RUN chmod-v +x/run-httpd.sh CMD["/run-httpd.sh"]
这是一个更真实的docker flie的例子。你从centos 7映像开始,接下来更新操作系统并安装apache。然后开放端口80。最后复制你的应用程序的shell脚本,并授予他可执行权限。初始化容器后命令会运行该shell脚本。
补充:
FROM centos:7 # 我们有软件更新和apache安装的基本层 RUN yum-y update && yum -y install httpd # 有打开并开放端口80的层 EXPOSE 80 # 有复制shell脚本的层 ADD run-httpd.sh/run-httpd.sh # 还有使shell脚本可执行的层。 RUN chmod-v +x/run-httpd.sh CMD["/run-httpd.sh"]
Docker flie中的每条指令都会创建一个层:
- 我们有软件更新和apache安装的基本层。
- 有打开并开放端口80的层。
- 有复制shell脚本的层。
- 还有使shell脚本可执行的层。
这些层都是只读的,因此容印象是不可变对象。 如果更改docker file并重建印象,则仅会重建以更改的那些层。与其他虚拟化技术相比,这也是帮助容器印象实现轻量化,小型和快速的因素之一。
- 在docker的网站上提到了docker的典型场景:
- Automating the packaging and deployment of applications(使应用的打包与部署自动化)
- Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
- Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
- Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)
Docker镜像操作:
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
相关术语
我们来了解一下相关术语:
容器映像是高度可移植的不可变只读模板,可以将其移植到支持docker的任何环境,也可将其存储在注册表中,以便重复使用。
容器是映像的实例,你可以基于该映像启动一个或多个容器容器。
对容器进行实例化时,每个容器在其现有映像之上都有一个精简的读/写层。这使得快速启动容器成为可能。
由于文件系统层的原因,大多数实际工作中其实都是只读的。Docker使用其“写时复制”系统,可以将更改后的文件写入容器的读/写层。底层映像不会发生更改,因此多个容器可以共享对同一底层印象的访问,但同时仍然具有独立的数据状态。删除容器后,该可写层也会被删除。容器的的读写层保证你的应用程序能够在运行时保持正常运行状态,但他并不适用于长期存储数据。要永久保留数据,应将其存储在某处的卷中。也就是说应将容器视为离散计算单元,而不是存储单元。
课后测验
容器和虚拟机之间有什么区别?
A.容器共享底层主机系统的操作系统内核。
B.每个容器都经历一个完整的操作系统启动周期。
C.容器可能需要很长时间才能启动。
D.以上皆是。
答案:A