【01】循序渐进学 docker:到底啥是 docker

写在前面的话

首先说一下,我本身是做运维,4 年的经验,多家公司。所以可能接下来谈到的一些东西都是自己在工作过程中经历的东西。有些事情并不具备普遍性,所以可以全当我在讲故事就行。

为啥要学 docker?因为 17/18 年似乎全世界都在讲 docker,此技术被越来越多公司慢慢的应用起来。已经出现了不可逆的趋势。一般公司的原则就是别人没有,我有最好。别人有,我要是没有,那就不行。这是市场需求。

其次,学新技术很重要一个原因就是这项技术能让我的薪资更上一层楼。你可以不会,但是你的路会越走越窄。

在做运维这些年里,有的公司管理的好,所以环境管控方面做的很好,有的则做的很差,这出于很多原因,不可规避。所以,产品上线堵在运维面前最高的一堵墙可能就是环境的一致性了。docker 的很大一个好处就在于解决这一方面的问题,所谓“一次构建,到处运行”。

另外一点,就是资源使用上。如果公司肯出钱还好,资源不够,加机器就行。但是有的在这一块上面的投入确实不多,那如何尽可能在有限的资源的情况下做好系统隔离和资源合理使用呢,那又得提到 docker,至于 docker 导致是啥,我们接下来慢慢的谈。

虚拟化

我们现在所说得虚拟化一般有两种:主机级虚拟化和容器级虚拟化。

主机级虚拟化:分为直接在机器上面作为操作系统安装的虚拟化,如 VMWare ESXI 这种。另外一种就是系统上面再度安装虚拟化软件的,如 VMware Workstation,Virtualbox 这些。

容器级虚拟化:这个就更靠近系统层面的知识了,我也就只能就行简单的谈谈,具体感兴趣的可以去深入了解。比如一个系统,我们必须有三大部分重要的内容,Namespace(命名空间),ChrootCGroup

其中 Namespace 又包括 6 个重要的组成:UTS(主机名和域名),IPC(信号量,消息队列和共享内存),PID(进程编号),NETWORK(网络设备,网络栈,端口等),MOUNT(挂载点,文件系统),USER(用户和用户组)

上面的内容都是作为一个独立的系统所需具备的东西 。

容器

在说 docker 之前,得先了解一下一个词,容器。

这并不是一个新词,比如 Linux 的 LXC,只是摆在之前我们很多人并未对其上心而已。 网上关于容器的解释大致如此:将软件打包成标准化单元,用于开发,交付,部署啥。其实可以这样理解,容器就是一个包含了系统 + 软件于一体的能直接运行的一个包。如下图(图片来自互联网):

然后很多人还是一脸懵逼,这图能说明啥?

我们需要结合物理机,虚拟机,容器来比较着看,为了便于理解,在这里打个比方,假设,一台机器就一个小区:

物理机:就是这个小区开发商一样,这个机器一开始全是你的,啥都是你的。

虚拟机:这就相当于开发商修好房子以后,将小区分成几栋几栋,这里的每一栋就相当于一个虚拟机。

容器:相当于某一栋里面的某一户。独立于其他户,但是又没独立于某一栋,没用独立于这个小区。

所以,容器更像在物理机或者虚拟机中运行的一个程序。我们可以像启停一个应用一样去启停他。只是这个程序比较牛逼,包含了操作系统。

docker

讲了半天,还是没说啥是 docker 啊?那么到达啥是 docker?

码头工人?大概是这样吧,我们可以看看 docker 的 logo(图片来自互联网):

对于 docker,我们首先得知道,开发语言 golang(据说慢慢在自动化运维这一块会取代 Python 的地位),基于 Linux 内核 CGroup,Namespace,AUFS 类 UnionFS 等技术就行封装隔离,属于操作系统底层的虚拟化技术。

相比于传统的虚拟化技术,docker 将容器进行了分层,怎么说呢?

比如我们有两个基于 CENTOS 的容器,一个是 redis 的,一个是 MySQL 的,用我们之前的说法,需要系统和程序打包,那这就意味我们需要两个 CENTOS 系统。

而实际是,完全不需要。因为这两个 docker 容器会共用底层的 CENTOS 镜像。那么有人又会问,如果公用一个镜像,那么怎么实现隔离,怎么保证我修改了 redis 不会影响到 MySQL 呢?

这就牵扯到 docker 容器中一个重要的概念,我们在创建的容器的时候,这些镜像都是只读的。之所以我们能够修改他,我们其实是修改挂载在原本镜像上面的可读写层。这也是 docker 为啥节省资源的原因。

这里一开始不了解不重要,有这个概念就行,后续慢慢的学习就明白了。

我们再看一个容器和传统虚拟化的比较(图片来自互联网):

 

这个图就很清晰的说明了 docker 和虚拟机的区别。

谈谈个人对于 docker 的看法

上面我们一直都在谈 docker 的好处,比如节省资源,部署方便能够保持环境的一致性等等等,那么它就这么优秀,没缺点了?显然不是。

我们从开发的角度出发,docker 能够很好的解决开发过程中很多问题,而且很方便。但是从运维角度出发,问题可能就出现了:

1. 维护成本增加了。以前直接操作主机,可能很多人得心应手,但是现在用 docker,我们再追踪问题,定位服务问题上面就没有那么容易了,以前再主机中的很多调试命令再容器的操作系统中其实是不存在的。

2. 稳定性。我这里所说的稳定性值得是服务的稳定性,因为 docker 是 C/S 架构的原因,我们是再应用之上才有了这个容器技术,意味着增加了业务宕掉的风险。

3. 安全性。这里的安全性是维护的安全性。在容器中,我们也提到隔离这种词汇,但是这里的隔离一直都是应用层面的隔离,而非物理层面的隔离,比如我们在宿主机执行 rm -r /*,可能在以前干掉的只是某一台机器,现在可能干掉的就在这台机器上面所有的东西了。

当然,我们也没必要为了这一点去纠结。

另外,技术的运用肯定不是说用就用,也不是一用就全都搞上。

首先,公司的项目 docker 化肯定需要更多的人来推动。

其次,这里面也许有一个在这方面能力比较强的人作为技术后盾,否则出问题找谁哭去。

最后,就是选择性使用,比如数据库这种我们都不会去迭代的东西,用 docker 的意义说实话目前我还没有找到,可能很多人会说配上网络存储便于迁移这些。

总的来说,这个东西不管对于技术上,还是工资待遇上都是属于“真香”类型的,我们终究必须得学,而且得学好。所以,慢慢来,急不得~ 

小结

如果你觉得还行,可以先点个推荐,搞个收藏什么的,内容会慢慢写出来,因为我现在也是新手,所以如果有写错的地方,也希望大家指出,一起学习,一起进步,关键是一起挣钱~

猜你喜欢

转载自www.cnblogs.com/Dy1an/p/10594748.html