应该是最近两周吧,都在研究、学习docker,看了三本docker方面的书、大量的技术博客(最后会附上),有些问题想不通,也有想通,我本身是做开发,docker中有些内容涉及到文件系统的我还是一知半解的,不过不影响我对docker的热情。
白天在公司写代码,晚上回家学习docker,docker确实给我一种很爽很爽的感觉。简单的几个命令就可以run一个操作系统,或者一个mysql、mongo数据库,而且启动时间也是超快。对于经常需要对操作系统、数据库进行调试的绝对是一个好东西。
docker的执行流程
假设现在启动一个新的docker应用(app1),它的工作流程大概如下,
image- docker client向daemon发送app1指令。
- 因为我们的服务器只有docker软件包,没有app1相关软件或者服务docker daemon就像求发送给docker官方仓库,在仓库中搜索app1。
- 如果找到app1这个应用,就把它下载到我们的服务器上。
- docker daemon启动app1这个应用。
- 把app1应用是否启动成功的结果返回给docker client。
docker的其它操作,比如停止或者删除和docker应用的启动流程基本上差不多。
docker的好处在哪里呢?
你去百度估计这个问题估计100个人有100个说法,我总结了网上说的几个比较多答案,
- 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell
- 文件系统隔离:每个进程容器运行在完全独立的根文件系统里
- 写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间
- 资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源
- 网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址
- 日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索
- 变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置
作为新手搞懂这个几个概念还是有些难,需要大量的练习加上实战经验才能理解,反正我是没理解。
对于docker,我目前能理解的有以下几点,
- 容器隔离,docker能够提供给你一个类似虚拟机一样的环境系统,里面包含网络、存储还能安装软件,意思就是说不管你怎么玩、怎么删也不会把宿主机搞坏,同样的也不会影响到别的docker容器。假设有一个centos的docker镜像,你在里面执行
rm -rf
完全可以,最终的结果也就是你当前这个容器坏了,对其余的没有影响,非常爽。 - 资源限制,像上面说的我可以在一台服务器上运行几十个docker容器,可以针对其中比较消耗资源的镜像进行资源控制,防止一个镜像消耗了所有的cpu或者内存,造成其他服务响应延迟。通常的做法都是通过操作系统来限制,这样做太麻烦,而且容易出错,如果换一台机器还是要做同样的事情。如果使用docker可以在制作镜像的时候通过几个参数就可以搞定了,而且是一次设置,终身有效。
- 镜像管理,这个是整个docker的精髓,docker中的镜像制作实际上是一堆文件系统,涉及到的有镜像分层,dockerfile,其中dockerfile是用来订制自己的私有镜像的。简单的docker镜像可以理解为ghost系统,里面有操作系统、有各种软件、各种设置,你拿着这个ghost镜像可以在任何一台电脑上安装,而且立马就能用;同样的,docker也是的,你可以将制作好的docker镜像上传到docker仓库,在其他任何一台安装了docker engine的地方都可以运行,无需在安装其它的依赖包,这也是docker说提倡的一次打包,各处运行 。
- 网络管理,这个是docker中最复杂的部分,主要解决的是容器和容器、容器与外部网络、外部网络与容器之间的相互通信问题。网上看到说docker提供了非常强大的网络管理,提供了四种网络模式,host模式,container模式,none模式, bridge模式,同样的槽点也很多。我对这网络研究不深,也就不说啥了,我目前线下环境使用的host模式,为什么会选择它,我后面会有介绍。
- 仓库管理,docker有共有仓库和私有仓库,这个概念有点类似nexus一样,nexus也分公、私仓库。docker官方仓库是docker hub,如果通过pull命令下载一个镜像如果本地私仓没有镜像便从docker hub上获得一个共有镜像。本地私仓可以通过
registry
进行管理,并且registry
提供一套非常丰富的reset api来管理仓库中的docker镜像。 - 数据管理,docker容器一旦被删除,容器本身对应的roogfs文件系统也会被删除,容器中的所有数据也将被删除。有的时候我们需要将数据如日志或者其他需要持久化的数据不随着容器删除而删除,还有的时候需要将容器之间的数据进行共享。可以使用docker的数据卷或者数据卷容器来解决。
什么场景下适合使用docker?
哪个场景下适合用docker,这个还真不好说,只能具体事物具体对待了,我从网上找了八个Docker的真实应用场景 供参考,这文章内容说的有点玄乎,似对非对,不是一般人能看懂的。我找了实际开发中几个痛点,有的似乎适合docker,有的似乎不适合,我列出来供参考,如下,
- 小A是一名资深码农,作为新招聘实习生的导师,小A要给实习生的开发机装一套和自己开发机一样的运行环境,不仅要安装Nginx、Java、Mysqld和一些依赖库等,还要修改相关的配置文件。结果花了一天时间,小A也没把实习生的开发环境搞定,在徒弟面前颜面尽失,尴尬不已。
- 小B是一名QA测试工程师,他按开发给的文档、部署的服务,测试出一大堆问题,通过和开发的沟通,发现是开发和测试环境不一致引起的。
- 小C作为一名业务运维工程师,同时维护开发、测试、生产三套环境,经常在不同环境下装相同的包,做大量重复工作。
- 小D同时在为三个项目开发功能模块,他要不停地修改他的开发环境为适应在三个项目间开发、联调测试。
- 小E发现服务器被入侵过,他想知道什么文件被篡改过。
- 小F从离职同事那里接手一个系统,文档不全,突然一台机器硬件故障,他不知道该如何重新部署这个应用。
- 小G新上线一个游戏,游戏火爆超预期,需要紧急扩容,花了一两个小时才完成扩容,期间用户体验很卡,流失不少潜在用户。
- 小H和小I共同维护一套系统,分工轮流值夜班,但一出现突发故障,排查问题时,即便半夜,还需要把对方叫醒,确认下对方在前一天有没有变更过什么配置。
- 小M的一个机房要裁撤了,该机房的数千个应用都要迁移到其他机房,小M觉得这项工作非常庞大,半年时间都未必能完成。
这篇文章是我的个人理解,能力有限,理解不深,或许对新手整理思路有所帮助。
最后附上我参考过的资料,
网友评论