陈奇网络工作室

Docker是什么?一个程序员应该如何理解容器docker?

本文的内容

显示

1.

容器技术的起源

2.

容器技术vs虚拟机

3.

什么是容器?

4.

docker是什么?

5.

如何使用docker

6.

docker是如何工作的

6.1.

1、docker构建

6.2.

2、码头运行

6.3.

3、码头工人拉

7.

docker的底层实现

7.1.

命名空间

7.2.

对照组

8.

摘要

8.1.

推荐阅读

Docker是什么?作为程序员,应该如何理解docker?本文将回答容器技术的起源、容器技术与虚拟机的区别、什么是容器、什么是docker、如何使用docker、docker的工作原理以及docker的底层实现等问题,从而帮助您彻底了解容器docker。

容器技术的起源

假设你的公司正在秘密开发下一个“今日头条”APP,姑且称之为明日头条吧。程序员从头到尾搭建了一个环境,开始写代码。写完代码,程序员还要交给测试生测试。此时测试生已经开始从头到尾搭建这个环境,程序员不用担心测试过程中出现问题。他们可以天真烂漫,撒娇,“明明可以在别人的环境里跑。”

考完试学生终于可以上线了。这个时候,运维同学就要从头到尾的重建环境了。构建环境和上线花费了大量精力。更糟糕的是,在线系统崩溃了。这个时候,心理素质好的程序员就可以再次表演演技了。“明明可以在别人的环境下运行。”

从整个过程中我们可以看到,不仅重复搭建了三套环境,还强迫程序员转做演员浪费表演天赋,是典型的浪费时间和效率。聪明的程序员永远不会满足于现状,所以程序员又到了改变世界的时候了,容器技术应运而生。

有的同学可能会说:“等等,先别改变世界。我们有虚拟机。VMware可以轻松飞翔。要不我们先搭建一个虚拟机环境,然后克隆出来测试运行?”

在容器技术之前,这确实是一个好主意,但并没有那么好。

先说科学。现在云计算的底层基石是虚拟机技术。云计算厂商买一堆硬件建一个数据中心后,可以用虚拟机技术划分硬件资源,比如可以划分100台虚拟机,卖给很多用户。

你可能会奇怪为什么这个方法不好?

容器技术vs虚拟机

我们知道,相对于一个简单的应用程序,操作系统是一个很重很笨的程序,简称繁琐。有多繁琐?

我们知道操作系统需要占用大量资源才能运行,大家对此一定深有体会。新安装的系统尚未部署。一个简单的操作系统从至少几十吉字节的磁盘占用和几吉字节的内存开始。

假设我有一台16G内存的机器,需要部署三个应用程序,那么使用虚拟机技术可以划分如下:

在这台机器上启动三台虚拟机,每台虚拟机上部署一个应用,其中VM1占用2G内存,VM2占用1G内存,VM3占用4G内存。

我们可以看到,virtual本身总共占用了7G的内存,所以不能划分成更多的虚拟机来部署更多的应用,而是部署应用,用应用代替操作系统。

如果有一种技术可以防止我们在“无用”的操作系统上浪费内存,那不是很好吗?这是第一个问题,主要是操作系统太重。

还有一个问题,就是启动时间。我们知道操作系统重启是很慢的,因为操作系统从头到尾都要加载所有已经检测加载过的东西。这个过程很慢,要几分钟,所以操作系统还是太笨了。

那么有没有一种技术可以让我们获得虚拟机的好处,同时克服这些缺点,从而实现鱼和熊掌兼得呢?

答案是肯定的,这就是容器技术。

什么是容器?

container这个词在英文中是container,其实container也是容器的意思。集装箱绝对是商业史上的一大发明,大大降低了海上贸易的运输成本。让我们看看容器的好处:

容器是相互隔离的。

长期反复使用

快速装卸

规范和标准可以放在港口和船上。

回到软件中的容器,其实容器和容器在概念上非常相似。

现代软件开发的主要目的之一是隔离。应用程序相互独立,运行时互不干扰。这种隔离不容易实现。其中一个解决方案就是上面提到的虚拟机技术,可以通过在不同的虚拟机中部署应用来实现隔离。

但是虚拟机技术有上面提到的种种缺点,那么容器技术呢?

不同于通过操作系统隔离虚拟机,容器技术只是隔离了应用的运行时环境,但是容器可以共享同一个操作系统。这里的运行时环境指的是程序运行的各种库和配置。

从图中我们可以看到,容器更轻,占用的资源更少。相对于操作系统的内存占用,容器技术只需要几米的空间,所以我们可以在相同规格的硬件上部署大量的容器,这是虚拟机无法比拟的。而且,与操作系统启动时间长达几分钟不同,容器技术提供了一种更高效的封装服务栈的方式,太酷了。

那么我们如何使用容器呢?这是关于docker的。

注意,容器是一种通用技术,docker只是它的一种实现。

docker是什么?

Docker是一个用Go语言实现的开源项目,它允许我们方便地创建和使用容器。docker将程序及其所有依赖项打包到docker容器中,这样你的程序在任何环境下都可以有一致的性能。这里程序运行的依赖性是,容器就像一个集装箱,集装箱所处的操作系统环境就像一艘货船或港口。程序的性能只与集装箱有关,与集装箱放在哪个货船或港口(操作系统)无关。

所以我们可以看到docker是可以屏蔽环境差异的。也就是说,只要你的程序被打包在docker中,程序无论运行在什么环境下,其行为都是一致的,程序员就再也无法施展自己的性能天赋了。不会再有“在我的环境中运行”,真正做到“一次构建,处处运行”。

此外,docker的另一个优势是快速部署,这是目前互联网公司最常见的应用场景。一个原因是容器启动非常快,另一个原因是只要容器中的程序运行正确,你就可以确定无论在生产环境中部署多少,它都会正确运行。

如何使用docker

docker中有几个概念:

dockerfile文件

图像

容器

其实你可以简单的把image理解成一个可执行的程序,container就是一个运行的进程。

那么写一个程序就需要源代码,那么“写”一个映像就需要dockerfile,docker就是映像的源代码,docker就是“编译器”。

所以我们只需要在dockerfile中指定需要哪些程序,依赖什么配置,然后把dockerfile交给“编译器”docker进行“编译”,也就是docker build命令。生成的可执行程序就是镜像,然后我们就可以运行镜像了,也就是docker run命令。当映像运行时,它是docker容器。

这里就不重复具体用法了。可以参考docker的官方文档,里面有详细的解释。

docker是如何工作的

其实docker用的是常见的CS架构,也就是客户端-服务器模式。docker客户端负责处理用户输入的各种命令,比如docker build和docker run。真正起作用的其实是服务器,也就是docker demon。值得注意的是,docker客户端和docker demon可以在同一台机器上运行。

接下来,让我们用几个命令来解释docker的工作流程:

1、docker构建

我们编写dockerfile并交给docker进行“编译”时会用到这个命令,然后客户端收到请求后转发给docker daemon,再由docker daemon根据dockerfile创建一个“可执行程序”镜像。

2、码头运行

有了“可执行程序”镜像,你就可以运行程序,然后使用docker run命令。docker daemon收到命令后找到具体的镜像,然后加载到内存开始执行。形象就是所谓的容器。

3、码头工人拉

实际上,docker build和docker run是两个核心命令。docker基本可以配合这两个命令使用,剩下的就是一些补充。

那么docker拉是什么意思呢?

我们之前说过,docker中图像的概念类似于“可执行程序”。哪里可以下载别人写的应用?很简单,那就是App Store,就是APP Store。同样,既然image也是一个可执行程序,那么是否存在一个“docker映像库”?答案是肯定的。这就是docker Hub,docker的官方“应用商店”。这里可以下载别人写的图片,不用自己写dockerfile。

Docker registry可以用来存储各种图片,任何人都可以下载图片的公共仓库就是docker Hub。那么如何从Docker Hub下载镜像呢?这是docker pull命令。

所以这个命令的实现也很简单,就是用户通过docker客户端发送命令,docker daemon收到命令后向docker registry发送镜像下载请求,下载后保存在本地,这样我们就可以使用镜像了。

最后,我们来看看docker的底层实现。

docker的底层实现

Docker是基于Linux内核提供的以下函数实现的:

命名空间

我们知道Linux中的PID、IPC、network等资源是全局的,命名空间机制是一种资源隔离方案。在这种机制下,这些资源不再是全局的,而是属于一个特定的命名空间,每个命名空间下的资源互不干扰,这就使得每个命名空间看起来像一个独立的操作系统,但只有命名空间是不够的。

对照组

虽然命名空间技术可以实现资源隔离,但进程仍然可以不受控制地访问系统资源,如CPU、内存、磁盘、网络等。为了控制容器中的进程对资源的访问,Docker采用了控制组技术(即cgroup)。使用cgroup,可以控制容器中进程对系统资源的消耗,比如可以限制容器使用的内存上限,CPU可以在上面运行等等。

有了这两种技术,容器看起来真的像一个独立的操作系统。

摘要

Docker是目前非常热门的技术,很多公司都在生产环境中使用,但是docker所依赖的底层技术其实早就出现了。现在以docker的形式盘活,可以很好的解决问题。希望这篇文章能帮助你了解docker。当然,如果想尝试docker产品,老刘推荐UCloud雕刻Docker产品魔方。详见老刘博客前几篇《UCloud优刻得Serverless容器服务产品Cube免费公测》,《UCloud容器实例Cube免费公测附测试交流群二维码》或《优刻得推出Serverless容器实例Cube快杰版,计算性能提升16%》。

来源:程序员gray“ID:chengxuyuanxiaohui”

关于西部数码代理

成都西维数码科技有限公司成立于2002年,注册资金1000万元。其总部位于天府之国成都——,品牌为西部数码代理(www.chenqinet.cn)。深耕IDC行业十余年,在中国拥有北京、广东、郑州、成都、绵阳、香港等多家IDC云计算安全数据中心,在美国拥有海外数据中心。自主研发了虚拟主机、灵活度云服务器、西部数据企业云邮箱等产品,广受用户欢迎。我们始终坚持用户体验至上的价值导向,深度挖掘用户需求。目前,超过100万用户通过我们注册和管理了超过1000万个域名,共有超过50万个网站在我们自研的云主机平台上运行。我们服务的用户有:宝贝回家找子网、四川大学、链家网(北京)科技有限公司、四川省互联网协会、沱牌集团、谭木匠、中铁二局、四川省中国青年旅行社。

我们始终坚持“以人为本、以客为尊、持续创新”的核心价值观,抓住各种发展机遇,不断创新发展理念,不断转变发展方式,不断解决发展难题。随着企业的发展,我们的业务也不断发展为基于云计算的云托管业务、域名注册、域名交易等相关业务。公司从最初的几个员工发展到近200人的精英团队,并在IDC和中国建立了业务。成为拥有多项自主知识产权的国家高新技术企业、获得ICANN和CNNIC双重认证的国际顶级域名注册服务机构、首批获得工信部颁发的国家云服务牌照的企业之一。

后台-系统设置-扩展变量-手机广告位-内容页底部广告位3