一. 为什么会出现docker?

不用说, 肯定是时代进步的产物. 那么, 他为什么能火? 一定是解决了痛点问题. docker也不是一下子就火起来了, 他的火也是有一个过程的, 我们先来看看为什么会出现docker, 他解决了什么样的问题.

第一种情况: 解决环境不一致的问题

通常, 程序员开发的时候是在开发环境, 提测阶段部署到测试环境. 那么常常会遇到一个现象, 在开发环境运行的好好的, 怎么一部署到测试环境就有问题了呢? 开始各种排查, 最后发现, 可能是机器配置不一样, 导致tomcat启动超时等等等. 这种问题必须排查, 但是特别耗时, 仔细想想, 并不是特别需要. 如果能避免, 也给开发和运维节省了不少时间.

第二种情况: 解决集群环境, 服务器繁多复杂的问题

通常我们会有三套环境, 开发环境, 测试环境,线上环境. 每一套环境都是一个集群.

一个集群里, 各种各样的软件, jdk, nginx, mysql, mongodb, redis......有很多. 以前运维老师是怎么干的? 搭建一个新的环境, 一台服务器一台服务器的安装. 像mysql还有配置环境, 一个服务器一个服务器的配置, 累得半死.

这种重复造轮子的工作, 在java代码中是尽量避免的. 那么在运维环境是否也可以避免呢? 有想法,那么就会有实践. docker的实用场景之一就是一次部署, 到处使用

怎么个到处实用法呢? 举个例子

搬家, 我们以前搬家都是怎么搬的? 我要从A地搬到B地了. 雇一个把家公司, 把家里的家具全部都搬走, 搬到另一个地方, 一团乱, 然后慢慢收拾

如果很牛逼的话, 找一个省事的办法. 我直接吧A地的房子咔嚓, 直接把房子搬到B地. 房子里的东西原来放哪里,现在还放哪里. 这是不是就省了不少的事.

从搬家--->搬房子, 不得不说是一个思想的进步.

对运维来说,也是如此, 如果能够将环境一起打包, 然后在各个机器上一件安装, 的确可以节省不少时间.

二. docker的理念

docker的思想来源于集装箱. 原来我们在项目中, 如果想要有一个通用的模块给到其他各个服务使用, 我们可以打成jar包, 但打jar存在的问题是什么? jar爆冲突, 第一个jar引入了一个依赖, 第二个jar包也引入了这个依赖, 他们的版本还不相同, 就会有冲突. 因为jar包和jar包之前是相互交叉.

docker刚好相反, docker是隔离的, 隔离是docker的核心. 隔离就可以理解为集装箱的打包装箱. 每一个箱子都是互相隔离的. 使用docker, 我们就不用担心冲突问题了, 也不用担心环境问题了. 我们可以直接通过docker来进行部署.

有了隔离机制, 如果一个出了问题, 不会影响其他的. 另一个好处就是, 可以将服务器压榨到极致. 我们平时跑项目的时候, 要启动mysql, redis, tomcat等全部跑起来很浪费内存空间. 而docker由于相互之间是隔离的, 那么可以利用起来很小的空间, 将服务器压榨到极致.

docker还有一个好处, 就是将内存空间压榨到极致.

docker是基于go语言实现的云开源项目

docker的主要目标是: "Build, ship and Run Any App, Anywhere", 即: 构建,分发,部署,运行等, 一次操作, 在各个app,各个地方都可以运行. 做到:"一次封装, 到处运行"

汇总一句话: 解决了运行环境和配置问题软件容器, 方便做持续集成并有助于整体发布的容器虚拟化技术.

三. docker的历史

  1. 2010年, 几个年轻的美国人成立了一家公司叫做dotCloud,这家公司主要做pass云计算服务,其底层技术上,dotCloud 平台利用了 Linux 容器技术,他们将自己的的技术命名为docker.
  2. docker刚诞生的时候, 并没有引起行业的注意, dotCloud公司越来越难, 经济效益也不景气, 后来就要活不下去了, 他们有强烈的愿望, 希望能活下去. 于是, 想了一个办法, 将docker开源.
  3. 2013年, docker开源了. 并且他们也将公司正式改名为Docker. docker受到越来越多的人关注. 渐渐的docker就火了. 活了以后, docker每个月就会更新一个版本. 2014年.4.9 docker1.0发布.

从这里, 我们可以学到什么?

没有谁的成功是一帆风顺的, 如果不是因为dotCloud公司效益不景气, 如果不是大家齐心协力想要活下去, 可能docker会更晚和我们见面. 遇到问题, 没关系, 一定要想办法克服困难, 克服了的困难就不是困难了.

四. docker和虚拟机的区别

虚拟机: 在windows中安装一个vmware, 通过这个软件我们可以虚拟查来一台或者多台电脑,

虚拟机属于虚拟化技术, docker容器是一种容器技术, 他也是一种虚拟化技术.

对虚拟机而言, 我们需要关注软件和硬件, 而docker容器,我们更多的是关注其软件.

举例: 在vm上安装linux centos原生镜像, 这就是安装一个独立的电脑, 好处是和其他主机/虚拟机相互隔离.

在docker上也可以安装linux镜像, 这个镜像和vm上安装的镜像是不一样的. 在docker上安装的镜像通常只有4M, 就够了, 这里只需要安装linux centos的核心, 他的核心就是一些操作命令+开机启动等. docker上的镜像是十分小巧的.

docker的一个最大的优势就是, 轻量, 小巧!

要了解docker和虚拟机的区别. 我们首先要知道虚拟机是什么原理, docker是怎么个原理,然后对比二者的异同~

4.1 虚拟机

我们基本都使用过虚拟机, 常用的虚拟机是Vmware. 为什么会使用虚拟机呢? 通常我使用的是windows电脑, 我想要模拟一台linux服务器, 方便部署应用. 或者我现在使用的mac, 但是很多应用都习惯了使用windows, 所以 在mac上安装了一台虚拟机, 这样, 想用mac就用mac, 想用windows就可以用windows了.

  • 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。
  • 主操作系统(Host Operating System)。你的个人电脑之上,运行的可能是MacOS,Windows或者某个Linux发行版。
  • 虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。
  • 子操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个子操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存.

上面是从虚拟机和主机之间的角度来分析了解虚拟机是如何搭建的, 通过上图, 我们可以看出, 一台主机上可以安装一个或者多个虚拟机, 但是每个虚拟机都比较耗费资源. 为什么会耗费很多的资源呢, 我们再从虚拟机自己的结构来说明, 如下图:

我们知道, 虚拟机就是虚拟的和主机一样功能的机器, 所以主机需要什么, 虚拟机也需要什么.

  1. 首先要有内核, 一台服务器, 他的内核是很小的.

2.各种lib库, 每一个虚拟机都拥有自己的lib库,

  1. 然后,我们可以在虚拟机上安装各种应用. 这些应用依赖于lib库. 由于共享同一份lib库, 那么就可能会出现冲突问题, 比如端口, 一个端口只能被一个应用使用.

我们每次创建一台虚拟机, 都要为其分配内核, 各种lib库. 并且每次创建都要重复创建这些东西. 这样耗费资源就会很多, 冗余步骤很多, 由于本身又比较笨重, 启动速度会比较慢.

4.2 docker

  • 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。
  • 主操作系统(Host Operating System)。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也可以运行Docker。
  • Docker守护进程(Docker Daemon) 。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器
  • 各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。
  • 应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

以上是从一台主机的角度来分析docker, 下面从docker容器的角度来看看:

我们的计算机是有一个Kernel内核, 容器共享了主机的内核, 在内核上运行很多个容器, 每个容器有自己的lib库, 容器和容器之间是相互隔离的, 就算容器A和容器B都可以使用8080端口. 和虚拟机相比, 我们发现容器比虚拟机轻量了很多很多. 少了内核, 少了硬件, 只有必须的lib库.

4.3 两者的区别

虚拟机技术的缺点:

  • 资源占用十分多
  • 用于步骤很多
  • 启动速度慢

docker与虚拟机的不同

  • 传统虚拟机, 虚拟出一条硬件,运行完整的操作系统, 然后在这个操作系统上安装和运行软件
  • 容器内的应用直接安装在主机的内核上, 容器没有自己的内核, 也没有虚拟的硬件, 所以就轻便了.由于没有臃肿的子操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。
  • 每个容器间是相互隔离的, 每个容器都有自己的文件系统, 互不影响.
  • 容器的启动速度很快, 一般在几毫秒~几十毫秒

Docker有很多优势,但是也不能替代虚拟机技术,因为两者有不同的使用场景。

  • 虚拟机更擅长于彻底隔离整个运行环境.例如,云服务提供商通常采用虚拟机技术隔离不同的用户。Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
  • 容器和虚拟机都可以获取整个网络链接。
  • 容器运行的是不完整的操作系统(尽管它们可以),虚拟机必须运行完整的。
  • 容器和虚拟机相比, 可以更多的利用起来小块的闲置资源,它们不运行完整的操作系统。
  • 容器需要毫秒分配,虚拟机需要几分钟。所以,你可以另配、重新平衡、释放以及使用容器比虚拟机的迭代更加迅速。
  • 离目标进程越远,隔离会变得更昂贵。虚拟机是伟大的,它通过抽象来增加并行,服务于多操作系统的使用情况以及业界最好的安全性。但对于隔离,它们相当的昂贵,容器提供的隔离就便宜。

我们需要根据不同的应用场景和需求采用不同的方式使用Docker技术或使用服务器虚拟化技术。例如一个典型的Docker应用场景是当主机上的Docker实例属于单一用户的情况下,在保证安全的同时可以充分发挥Docker的技术优势。对于隔离要求较高的环境如混合用户环境,就可以使用服务器虚拟化技术。

五. 容器在DevOps(开发,运维)中的作用

  • 应用更快速的交付和部署

传统: 每台服务器要安装哪些应用, 配置哪些环境变量, 安装顺序, 都会一一记录到帮助文档

docker: 打包镜像, 一键运行.

  • 更便捷的升级和扩缩容

传统: 需要安装软件, 部署, 重复工作

docker: 部署应用就像搭积木, 项目打包为一个镜像, 扩展服务器非常方便.

  • 更简单的系统运维

在容易化部署之后, 我们的开发, 测试环境都是高度一致的, 不会出现在开发耗时, 部署到测试,线上不好使的情况

  • 更高效的利用计算机资源

docker是内核级别的虚拟化, 可以在一个物理机上运行很多个容器实例, 服务器的性能可以被压榨到极致.

通常, 一台主机只能同时运行2-3个虚拟机, 但是可以同时运行20-30个容器

六. 我们来看一下各大佬公司是如何使用docker的

1. 新浪微博

这里注意一个重点你:docker使大规模动态调度成为可能, 因为他可以弹性的扩缩容

2. 美团

3.蘑菇街