写在前面的话
首先说一下,我本身是做运维的,4 年工作,多家公司。所以可能接下来谈到的更多的是一些在工作过程中积累的个人看法。且有些并不具备普遍性,有不合适的地方,全当我在吹牛逼就行。
一开始我们得谈谈为啥要学 docker?在 17/18 年,有两个东西在业内特别火,一个是区块链比特币,但是现在似乎凉的差不多了。另外一个就是 docker。
那火到什么程度呢?你要是出去找运维的工作说不会 docker,薪资直接降了一档的感觉。越来越多公司陶醉其中,吹牛逼也好,真牛逼也好。它终究已经变成了一种不可逆的趋势。
对公司而言,一般原则就是:别人没有,我有最好。别人有,我要是没有,那就不行。
其次,打工图个啥,不久图个钱吗?新技术的好处就在于,你会了,你就可以去忽悠那些不会的,这样自然而言你的身价就水涨船高了嘛。
当然,你也可以头铁,我就是不学,你拿我咋样!!!确实不能把你咋样,但兄弟,你把自己的路走窄了啊~
再谈谈运维。每个公司的环境有好有差,项目也有美如画和丑成马。这其中原因很多,归根结底大多是钱没到位。于是越来越多的烂项目诞生了。复杂的环境,复杂的部署。那如何规避掉这些,让我们运维人员把“锅”尽量丢远一点?
“一次构建,到处运行!”
记住这句话,这将是我们学习 docker 的核心思想。
虚拟化
在正在学习 docker 之前,我们得先了解一下它一些相关的东西,便于我们横向比较。
首先我们就得说说虚拟化,相信运维的老哥都很熟悉,我这里就提提比较重要的几点,算是班门弄斧并复习一下:
1. 我们所说的虚拟化一般分为两种:主机级虚拟化和容器级虚拟化。
2. 主机级虚拟化:分为作为操作系统安装的虚拟化(如 VMWare ESXI)和在系统上通过虚拟化软件实现得虚拟化(如 VMware Workstation,Virtualbox)。
3. 容器级虚拟化:系统层面,比如系统的三大部分重要组成:Namespace(命名空间),Chroot,CGroup。
4. 在 Namespace 中包括了 6 个重要的组成:UTS(主机名和域名),IPC(信号量,消息队列和共享内存),PID(进程编号),NETWORK(网络设备,网络栈,端口等),MOUNT(挂载点,文件系统),USER(用户和用户组)
上面的内容都只需要简单知道就行,你要是真的感兴趣,那就的靠你自己慢慢去挖掘了 。
容器
我们每次提到 docker,都说 docker 容器,docker 容器,那到底啥是容器啊?
其实容器并得一个新词,早在 Linux 的 LXC 时就提出了这个概念,但是我们这些普通人没人去关注而已。
网上也有大量关于容器的解释。我这里简单的谈谈个人的理解:容器就是一个包含了系统 + 软件于一体的能直接运行的一个包。如下图(图片来自互联网):
这时候我们再来横向看看几个概念:物理机,虚拟机,容器。
物理机:就是一台服务器(比如 DELL R730),这个服务器就是物理机。
虚拟机:我们在物理机上面,通过虚拟化技术,装出来的一个又一个系统。
容器:我们在虚拟机的操作系统上,运行一个又一个“程序”,但是这个程序呢包含了自身运行的环境。
啥是 docker
讲了半天,还是没说啥是 docker 啊?那么到底啥是 docker?码头工人?
先看看 docker 的 logo(图片来自互联网):
还真有码头工人的感觉,老外的东西的 logo 都喜欢用动物。如 MySQL 的海豚,Go 的地鼠,Python 的蟒蛇。
我们先不说 docker 是啥,我们先看对于 docker 我们得知道啥:
1. 开发语言 golang(据说慢慢在自动化运维这一块会取代 Python 的地位)
2. 基于 Linux 内核 CGroup,Namespace,AUFS 类 UnionFS 等技术进行封装隔离,属于系统底层得虚拟化技术。
3. C/S 结构,拥有服务端和客户端。
为啥是 docker
每一次技术的变革都意味着大量人力的投入,为啥越来越多的公司放弃传统虚拟化转投 docker?
先说一下镜像分层:
比如我们有两个基于 CentOS 的应用,一个是 redis 的,一个是 MySQL 的,用传统的虚拟化,我们想要做到隔离,需要装两个 CENTOS 虚拟机,然后各自在上面安装 redis 和 MySQL。
那如果将这种事情交给 docker,他是怎么做的?
在 docker 中,有个概念是镜像,后面会详讲,我们这里把它认为是一个既含有操作系统,又含有我们项目所需的运行环境,还含有的项目的一个包就行。
比如我们像运行一个 redis,那么我们将一个 redis 镜像启动成为容器就行,同理 MySQL 也是如此。
那么问题来了,我们虚拟机本身一个系统,运行两个容器又是两个 CentOS 系统,然后就懵逼了,不是说 docker 节省系统资源吗?
这里我们就得隆重的说明一个概念了:
docker 在我们虚拟机中每运行一个容器,其实际就是一个系统进程。同样,在容器内部,和传统的系统不一样的是,它只要一个进程。那到最后,归根结底你允许的只是一个进程而已。
而且 docker 在镜像上面还采用了分层结构,这意味着你两个容器底层的 CentOS 系统其实是同一个镜像。
那可能又会出现另外一个问题,是不是意味着我们修改一个容器系统的内容后新建的容器的系统内容也跟着变了?
答案是不会。我们需要记住,镜像是只读的,之所以我们在容器中能够独写修改,原因我们在其上面新挂载了一层可写成层,而这一层只针对单个容器。
而且可以简单的说一下,CentOS 镜像的大小只有 200M 左右,所以相比于没新建一个虚拟机,动不动安装出来就占用几个 G 磁盘和多少 CPU,我们这个进程就节省了很多资源呢?
而且虚拟机可能出现资源分配不均的情况,docker 完全不用担心,都在这台机器上,你用多少,各凭本事。但其实我们也是可以加以限制的,当然这也是后话。
再看一个容器和传统虚拟化的比较加深理解(图片来自互联网):
谈谈个人看法
上面我们一直都在谈 docker 的好处,那这里就站在钢筋的角度谈谈它的缺点:(主要从运维的角度)
1. 维护难度增加。以前直接操作主机,追踪问题,定位服务问题都很容易,但是现在不行,运维容器内部很多工具不存在。
2. 服务的稳定性。docker 是 C/S 架构,多了中间商,也就多了业务宕掉的风险。
3. 数据的安全性。容器中的隔离相比传统的隔离差别还是挺大的。举个例子:我们在宿主机执行 rm -r /*,在以前干掉的只是某一台机器,现在则全都干掉了,类似所有鸡蛋放在一个篮子。
当然,我们也没必要为了这些点去纠结。注意以下几点就行:
1. 技术的运用肯定不是说用就用,也不是一用就全都搞上。
2. 项目 docker 化肯定需要更多的人来推动。
3. 在用之前我们得有技术后盾,否则出问题找谁哭去。
4. 选择性使用,比如数据库这种不会迭代的东西,用 docker 的意义说实话目前我还没有找到,可能有些人会说配上网络存储便于迁移。
总的来说,docker 这东西不管对于技术上,还是待遇上都是属于“真香”类型的,我们终究得学,得学好。所以,一起加油~
小结
如果你觉得还行,可以先点个推荐,内容会慢慢写出来,我也是新手,所以如果有写错的地方,也希望大家指出,一起学习,一起进步,关键是一起挣钱~