1

Docker最主要解决了环境部署问题,其次是解决应用之间相互影响的问题。


关于这个问题,首先我们需要从Docker定义来说起。


Docker定义



维基百科是这么定义Docker:

Docker 是一个开放源代码软件,是一个开放平台,用于开发应用、交付应用、运行应用。 Docker允许用户将基础设施中的应用单独分割出来,形成更小的颗粒,从而提高交付软件的速度。 Docker容器 与虚拟机类似,但原理上,容器是将操作系统层虚拟化,虚拟机则是虚拟化硬件,因此容器更具有便携性、高效地利用服务器。


通俗的说,就好比我打包了个QQ软件,然后传给了你,你只要在你电脑装了Docker,在它上面运行起来就可以使用。


Docker出现解决了什么问题?


A.解决环境部署问题

在Docker未出现之前,我们一般在一台Linux服务器上要部署环境,需要安装各种系统依赖包,配置各种开源的中间件,最后才能部署好一个业务系统。


这样的工作,换了一台新的服务器,你又得重新来一遍,是不是很痛苦。


  • 开发人员需要部署开发环境,以便各个开发人员共同使用。
  • 测试人员需要部署测试环境测试,才能开始验证测试。
  • 运维人员部署生产环境同样也得重新部署一次。

而Docker的出现,解决了环境部署问题。同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。


B.持续集成+持续部署+持续交付流水线管理


持续集成,持续部署,持续交付对于微服务开发来说,是提高团队整体效率不可或缺的一环。


随着持续集成工具(比如Jenkins)的快速发展,也增加了对Docker的支持,代码从开发者的机器到最终在生产环境上的部署,大大提高了生产效率。


有兴趣的可以了解下:SpringBoot + maven + Jenkins + docker 。


C.解决应用之间相互影响的问题


当我们只有一台Linux服务器,但是需要安装两套应用服务,而这两套服务系统依赖的版本不一致,那么用Docker创建两个不同的容器就可以轻松解决这个问题。



Docker VS 虚拟机


我们首先来看下虚拟机的架构,如下图所示:


再来看下Docker的架构,如下图所示:



从这里可以看到主要少了Hypervisor、Guest OS两层。


  • 由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,所以效率更高。
  • Docker由于直接利用宿主机的操作系统,则省略了Guest OS这个过程,因此新建一个docker容器只需要几秒钟。

下面在看这个形象的比喻,可能会更直观。


  • 虚拟机是这样的:


  • Docker是这样的:




总而言之:容器性价比高,做的事少并且使用起来相当廉价,而虚拟机提供整个虚拟化硬件层,可以做更多的事情但是使用成本显著。


我自己使用的Docker


持续集成部署这里我就不展示了,这里展示我本机电脑安装的Docker服务。




比如:

  • 下载一个精简版的CentOS7,然后自己DIY加服务。
  • 下载个Kali Linux 学习下安全知识。


再看看我在服务器搭建的Oracle服务:


如果你有过搭建环境的基础,你也可以自己搭建一个Oracle服务镜像,测试人员和开发人员用这个oracle基本能满足需求。



结束语


总之,Docker的出现是有它的必然性,轻便,简单,能快速提高效率,为何不尝试一下呢?


当你会用Docker之后,你可以自己制作镜像,供其他人使用。


备注:部分图片来自网上截图,如有侵权,请联系本人删除。

最佳贡献者
2

没有比较就没有伤害。


先看看没有Docker时,如果需要部署一个应用系统,是如何配置环境的。

1,安装操作系统,比如Ubuntu18.4;

2,安装运行环境,比如Python3.6;

3,安装依赖库,比如Dlib;

4,复制代码,或者预先编译好的应用程序;

5,配置需要的环境变量、开放的端口,等等;

6,运行启动命令或者预先准备的脚本文件。



为了解决系统部署交付难题,Docker容器技术应运而生。

Docker是一个开源的应用容器引擎,将应用以及依赖打包到一个可移植的镜像中,然后发布到服务器上,有助于快捷高效的交付应用。

1,编写Dockerfile,将环境配置和应用依赖打包到镜像中;

2,运行docker build或者使用容器镜像服务,构建Docker镜像;

3,运行docker pull将镜像文件拉取到服务器,也可以使用云化的容器实例;

4,运行docker exec启动容器实例,或者启动云服务器。




也就是说,以前需要手动完成的环境依赖配置,Docker将它们自动化了。

不仅如此,Docker compose提供资源编排服务,定义和运行多个容器组成的应用系统,通过docker-compose.yml文件声明各个服务,作为一个整体来完成应用的创建和启动。


还有Swarm,是Docker官方提供的集群管理工具,将Docker节点统一管理组织,以服务为调度单元,支持动态扩容等特性,和Kubernetes(k8s)相比,更加轻量。


Docker,Compose,Swarm,就是大名鼎鼎的Docker三剑客,助力DevOps,大规模集群化,快捷高效部署应用。


3

  1. 说到docker 我们就不得不提lxc;Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。


  1. lxc在很早之前就被提出,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
  2. Sourceforge上有LXC这个开源项目。LXC项目本身只是一个为用户提供一个用户空间的工具集,用来使用和管理LXC容器。LXC真正的实现则是靠Linux内核的相关特性,LXC项目只是对此做了整合。基于容器的虚拟化技术起源于所谓的资源容器和安全容器。
  3. LXC在资源管理方面依赖于Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag(NEWNS NEWPID等等)
  4. Docker的底层就是使用了LXC来实现的。LXC将Linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。
    在LXC的基础之上,Docker提供了一系列更强的功能。
  5. Docker针对应用的部署做了优化,反映在其API,用户接口,设计原理及文档上面。而LXC仅仅关注容器作为一个轻量级的服务器。
  6. Docker中支持Dockerfile,将应用的所有依赖项,构建工具和包都以源码的形式写在Dockerfile中,然后Docker可以根据Dockerfile构建镜像。该镜像在任何机器上面运行的效果都一样。
  7. Docker对容器提供了类git的版本控制功能,支持版本回滚等功能。Docker也实现了增量上传和下载的功能,节约了上传和下载时的带宽资源。
  8. k8s现在已经成为业界统一的容器编排引擎。为我们的业务应用容器话,进行了同意和规范,也时业内的标杆。
  9. 越来越多的公司采用k8s以及docker技术, 这时大势所趋。

4

能快速交付应用程序,有以下好处:

  • 我们希望你的开发环境能够更好的提高你的工作效率。Docker容器能够帮助开发人员、系统管理员、QA和版本控制工程师在一个生产环节中一起协同工作。我们制定了一套容器标准,而这套容器标准能够使系统管理员更改容器的时候,程序员不需要关心容器的变化,而更专注自己的应用程序代码。从而隔离开了开发和管理,简化了开发和部署的成本。
  • 我们使应用的构建方式更加简单,可以快速的迭代你的应用,并且可以可视化的来查看应用的细微更改。这能够帮助组织里边的成员来更好的理解一个应用从构建到运行的过程。
  • Docker 是一个轻量级的容器,所以它的速度是非常快的,而容器的启动时间只需要一秒钟,从而大大的减少了开发、测试和部署的时间。轻松部署和扩展
  • Docker 容器可以运行在大多数的环境中,你可以在桌面环境、物理主机、虚拟主机再到数据中,私有或者公有云中部署。
  • 因为 Docker 可以从多平台下运行。你可以很容器的迁移你的应用程序。如果需要,你可以非常简单的将应用程序从测试环境迁移到云,或者从云迁移到测试环境。
  • Docker 是一个轻量级的容器,因此它可以在很短的时间内启动和关闭。当你需要的时候,你可以启动多个容器引擎,并且在不需要使用他们的时候,可以将他们全部关闭。

Get higher density and run more workloads

Docker的容器本身不需要额外创建虚拟机管理系统,因此你可以启动多套Docker容器,这样就可以充分发挥主机服务器的物理资源,也可以降低因为采购服务器licenses而带来的额外成本。

快速构建 轻松管理

因为Docker上述轻便,快速的特性。可以使您的应用达到快速迭代的目的。每次小的变更,马上就可以看到效果。而不用将若干个小变更积攒到一定程度再变更。每次变更一小部分其实是一种非常安全的方式。


你的回答

单击“发布您的答案”,即表示您同意我们的服务条款