写在前面的话

首先说一下,我本身是做运维的,4 年工作,多家公司。所以可能接下来谈到的更多的是一些在工作过程中积累的个人看法。且有些并不具备普遍性,有不合适的地方,全当我在吹牛逼就行。

一开始我们得谈谈为啥要学 docker?在 17/18 年,有两个东西在业内特别火,一个是区块链比特币,但是现在似乎凉的差不多了。另外一个就是 docker。

那火到什么程度呢?你要是出去找运维的工作说不会 docker,薪资直接降了一档的感觉。越来越多公司陶醉其中,吹牛逼也好,真牛逼也好。它终究已经变成了一种不可逆的趋势。

对公司而言,一般原则就是:别人没有,我有最好。别人有,我要是没有,那就不行。

其次,打工图个啥,不久图个钱吗?新技术的好处就在于,你会了,你就可以去忽悠那些不会的,这样自然而言你的身价就水涨船高了嘛。

当然,你也可以头铁,我就是不学,你拿我咋样!!!确实不能把你咋样,但兄弟,你把自己的路走窄了啊~

再谈谈运维。每个公司的环境有好有差,项目也有美如画和丑成马。这其中原因很多,归根结底大多是钱没到位。于是越来越多的烂项目诞生了。复杂的环境,复杂的部署。那如何规避掉这些,让我们运维人员把“锅”尽量丢远一点?

“一次构建,到处运行!”

记住这句话,这将是我们学习 docker 的核心思想。

虚拟化

在正在学习 docker 之前,我们得先了解一下它一些相关的东西,便于我们横向比较。

首先我们就得说说虚拟化,相信运维的老哥都很熟悉,我这里就提提比较重要的几点,算是班门弄斧并复习一下:

1. 我们所说的虚拟化一般分为两种:主机级虚拟化和容器级虚拟化。

2. 主机级虚拟化:分为作为操作系统安装的虚拟化(如 VMWare ESXI)和在系统上通过虚拟化软件实现得虚拟化(如 VMware Workstation,Virtualbox)。

3. 容器级虚拟化:系统层面,比如系统的三大部分重要组成:Namespace(命名空间),ChrootCGroup

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 这东西不管对于技术上,还是待遇上都是属于“真香”类型的,我们终究得学,得学好。所以,一起加油~

小结

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

【01】循序渐进学 docker:到底是啥的更多相关文章

  1. 【09】循序渐进学 docker:docker swarm

    写在前面的话 至此,docker 的基础知识已经了解的差不多了,接下来就来谈谈对于 docker 容器,我们如何来管理它. docker swarm 在学习 docker swarm 之前,得先知道容 ...

  2. 【07】循序渐进学 docker:数据持久化

    写在前面的话 学到这里相信有心的朋友都发现问题了,我们每次都会去删掉容器,在创建新的容器.那数据怎么办?岂不删库跑路了? 就算不是数据库,假设公司有日志保留的需求,那每一次发布岂不日志都被干掉了? D ...

  3. 【05】循序渐进学 docker:系统资源和网络

    写在前面的话 在上一篇学习 Dockerfile 的时候其实还有几个相当重要得关键中没有谈到,但没关系,在后面的内容会单独提出来一个一个的学习.这里就先谈谈关于资源的控制个容器的网络~ 资源限制 其实 ...

  4. 【02】循序渐进学 docker:如何安装

    写在前面的话 我们接下来的操作都是 CentOS 7.5 以下完成的,为了避免你我结果不一致,建议你也采用 CentOS 7.5,原因如下: 1. 个人几年工作下来经历的公司,包括身边的运维朋友,90 ...

  5. 【08】循序渐进学 docker:docker compose

    写在前面的话 在之前的操作中,即使是单个容器每次都需要敲很长的命令,当需要多个容器组合着用的时候更加麻烦,此时我们急需找到一种一次配置,随便运行的方法. 这就是这一节重点,单机容器编排工具:docke ...

  6. 【06】循序渐进学 docker:跨主机通信

    写在前面的话 目前解决容器跨主机通信的方案有很多种,这里给出的只是其中的一种,而且还不是最好的方案,不过归根结底,大同小异.在学习 docker swarm 之前,大家可以先看看这种. 啥是 over ...

  7. 【04】循序渐进学 docker:Dockerfile

    写在前面的话 从前面我们简单的了解了镜像,也运行了容器,各种官方的镜像显然无法满足我们自己的需求,我们目的终究是运行自己的业务. 所以,本章节的 Dockerfile 就主要讲怎么在官方镜像的基础上制 ...

  8. 【03】循序渐进学 docker:基础命令

    写在前面的话 之前谈了啥是 docker 和怎么安装 docker,这里就谈谈 docker 命令的使用,当然,这里的使用可能只是局限于 docker 的增删查改. 另外需要注意的是,为了图片的美观, ...

  9. 人均年薪50万以上,docker到底是什么?为什么这么火?

    为什么要使用Docker? 场景一:公司双十一买了一堆服务器,技术总监让你给它们一个个都配置上JDK.Mysql.Redis等软件环境. 你心里小声嘀咕:"这总监不讲武德!"然后你 ...

随机推荐

  1. 1132 Cut Integer

    题意:略. 思路:注意除数可能为0的情况,不然会导致浮点错误. 代码: #include <iostream> #include <string> using namespac ...

  2. Oracle日常性能问题查看

    1 判断回滚段竞争的sql --当Ratio大于2时存在回滚段竞争,需要增加更多的回滚段) ratio from v$rollstat rs, v$rollname rn where rs.USN = ...

  3. Win7开始菜单所在目录

    C:\ProgramData\Microsoft\Windows\Start Menu\Programs 可在此目录下归类,建文件夹

  4. 如何查看apache加载了哪些模块

    apache2/bin/apachectl -l 可以看到类似下面的结果: 这是编译时就已编译在apache中的模块,启动时自然会加载. 另外一部分,要看apach的配置文件(httpd.conf)的 ...

  5. python与桶排序

    问题提出: 将以下数据: 6, 8, 2, 3, 4, 0, 9, 1, 5,1 按从小到达排列. 桶排序原理: 桶排序也叫计数排序,简单来说,就是将数据集里面所有元素按顺序列举出来,然后统计元素出现 ...

  6. c++builder Active Form

    新增的属性.方法刷新一下才可以生成方法的实现.保存按钮不生成,刷新就好了. Refresh Implemention

  7. SpringMVC总结三:请求Controller返回视图类型以及请求方式、参数介绍

    视图解析,请求Controller返回的视图类型: @Controller @RequestMapping("/test") public class TestController ...

  8. Github简单的上传和修改

    先自己手动创建一个仓库 echo "# delet" >> README.md git init git add . git commit -m "first ...

  9. 项目代码:js

    1 //获取发文时间 function selectWriteTime(){ $("#writing_time_index").on("click"," ...

  10. Python倒序循环列表(序列)

    如果要倒序遍历访问序列中的元素,可以对该序列使用reversed() 函数,reversed函数会生成一份倒序列表的拷贝,但是不会改变原列表.这个函数理解起来很自然,例如 for i in rever ...