Docker解决的问题


由于不同的机器有不同的操作系统,以及不同的库和组件,将一个应用程序部署到多台机器上需要进行大量的环境配置操作。(例如经常出现的类似"在我的机器上就没问题"这样的情况)

Docker主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用Docker可以不修改应用程序代码,不需要开发人员

学习特定环境下的技术,就能够将现有的应用部署到其它机器上,从而实现一次打包,多次部署的目的。

与虚拟机的比较

虚拟机也是一种虚拟化技术,它与Docker最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。

启动速度

启动虚拟机需要先启动虚拟机的操作系统,再启动应用,这个过程非常慢。

启动Docker相当于启动宿主机操作系统上的一个进程,为秒级别。

占用资源

虚拟机是一个完整的操作系统,需要占用大量的磁盘空间、内存和CPU资源;

Docker只是一个进程,只需要将应用及相关的组件打包,在运行时占用很少的资源,一台机器上可以开启成千上万个Docker。

镜像与容器

镜像是一种静态的结构,可以理解为是容器的源代码,也可以看作是面向对象中的类,而容器是镜像(类)的一个实例。

镜像包含着容器运行时所需要的代码及其它组件,它是一种分层结构,每次层都是只读的(Read-only layers)。构建镜像时,会一层层构建,前一层是后一层的基础,镜像的这种分层

结构很适合镜像的复用及定制。构建容器时,通过在镜像的基础上添加一个可写层,用来保存着容器运行过程中的修改。

优点:

1.部署方便

在我们最开始学习编程的时候,搭建环境这一步往往要耗费我们很长时间,其中一个小问题也有可能需要很长时间去解决。而有了容器之后,这些都变得非常容易,我们的开发环境就只

是一个或者几个容器镜像的地址,最多在再需要一个控制部署流程的执行脚本,或者进一步将你的环境镜像以及镜像脚本放入一个Git项目发布到云端,需要的时候将它拉取到本地即可。

# git clone https://github.com/my-project

# sh ./my-build-boot.sh

2.部署安全

当我们收到一个bug反馈的时候,很多时候心里的第一反应都是"在我本地就是好的啊,是不是你环境有问题?"这种情况的发生就在于本地环境的不一致(也既我们常说的异构),我们在开发环境中调试往往不

能保证其它环境的问题,但却要为此买单,有了容器之后,各个环节采用统一标准(环境),这种情况将很少发生。我们可以通过容器技术将开发环境和测试环境以及生产环境保持版本和

依赖上的统一,保证我们的代码在一个高度统一的标准上执行,而测试环境的同意,也同样能解决CI(持续集成)流程对环境的要求。

在分布式技术和扩容需求日益增长的今天,如果运维能够通过容器技术来进行环境的统一部署,不仅在部署的时间上节省不少,也能把很多人工配置环境过程中产生的失误降到最低。

3.隔离性好

不管是开发还是生产,往往我们一台机器上可能要跑多个服务,而服务各自依赖的配置又不尽相同,假如说两个应用需要使用同一依赖,或者两个应用需要的依赖之间有一些冲突,这个

时候就很容易出现问题,所以同一台服务器上不同应用提供的不同服务,最好还是将其隔离起来,而容器在这一方面就有其天然的优势,每一个容器就是一个隔离的环境,容器内部所提

供的服务对环境依赖的要求,容器可以自内部全部提供,这种高内聚的表现可以快速分离有问题的服务,在一些复杂应用系统中能够实现快速拍错和即时处理。

4.快速回滚

容器之前的回滚机制,一般要基于上个版本的应用重新部署,且替换掉目前有问题的版本,在最初的时代,可能是一套完成的从开发到部署的流程,而执行这一套流程往往需要花费很长

时间,在基于Git的环境中,可能是回退某个历史提交,然后重新部署,这些跟容器相比,都不够快,而且可能会产生新的问题。而容器技术天生带有回滚特性,因为每个历史容器或者镜

像都会保存,而替换某个容器或者镜像是非常快速和简单的。

5.成本低

这可能是一个最明显和有用的优点了,在容器出现之前,我们往往会因为构筑一个服务,就要提供一台服务器或者一台虚拟机,服务器的购置成本和运维成本都比较高,而虚拟机所占用

的资源又相对较高,相比之下,容器就小巧轻便的多,只需要给一个容器内部构建应用所需的依赖就可以了,这也是容器技术发展如此迅速的最主要原因。

6.管理成本低

随着容器技术的不断普及和发展,随之而来的容器管理和编排技术也同样得到发展,诸如Docker Swarm,K8S,Mesos等容器编排工具也在不停的迭代更新,这让容器技术在生产环境中拥

有了更大的可能性和更多的发挥空间,随着大环境的发展,docker等容器的使用和学习成本也越来越低,成为更多开发者和企业的选择。

缺点:

1.隔离性

基于hypervisor的虚拟技术,在隔离性上比容器技术要好,它们的系统硬件资源完全上虚拟化的,当一台虚拟机出现系统级别的问题,往往不会蔓延到同一宿主机上的其它虚拟机上,但是

容器就不一样了,容器之间共享同一个操作系统内核及其它组件,所以在受到诸如黑客攻击这种情况的时候,很容易通过底层操作系统影响的其它容器,甚至逐个击破,产生连锁反应,当

然,这个问题可以通过部署容器来解决,但随之又会产生新的问题,比如成本增加以及性能问题。

2.性能

不管是虚拟机还是容器,都是运用不同的技术对应用本身进行了一定程度的封装与隔离,在降低应用和应用之间以及应用和环境之间的耦合性上做了很多努力,但是随之而来的,就会产生

更过的网络连接转发和数据交互,这在低并发系统上虽然不会很明显,但是当同一虚拟机或者服务器下面的容器需要更高并发量支撑的时候,也就是并发问题成为系统瓶颈的时候,容器会

将这个问题放大,所以,并不是所有的场景都适合容器技术。

3.存储方案

容器的诞生并不是为OS抽象服务的,这是它和虚拟机最大的区别,这样的基因意味着容器天生是为应用环境做更多的努力,容器的伸缩也是基于容器的这一特性,而与之相对的,需要持久

化存储方案恰恰相反,在数据存储这一点上Docker容器提供的解决方案是利用volume接口(存储卷)形成数据的映射和转移,以实现数据持久化的目的。但是这样同样也会造成一部分资源的

浪费和更多的交互,不管是映射到宿主机上还是网络磁盘,都是退而求其次的解决方案。

参考链接:https://cloud.tencent.com/developer/article/1457282

Docker的优缺点的更多相关文章

  1. 面试题|Docker的优缺点

    开源Linux 长按二维码加关注~ 上一篇:Linux中几个正则表达式的用法 Docker解决的问题: 由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环 ...

  2. docker 1.1 介绍和安装

    1.docker是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现 ...

  3. doker基本使用

    Docker与虚拟机的区别 docker和虚拟机最大的不同,docker共用宿主机的内核,虚拟机中每个虚拟机中有单独的内核虚拟出来,如上图所示: docker不能做后端兼容性测试,因为其没有独立的虚拟 ...

  4. Linux运维博客大全

    系统 U盘安装Linux详细步骤_hanxh7的博客-CSDN博客_u盘安装linux 使用U盘安装linux系统 - lwenhao - OSCHINA 各厂商服务器存储默认管理口登录信息(默认IP ...

  5. Docker介绍及优缺点对比分析

    1.什么是Docker Docker最初是dotCloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,于2013年3月以Apache 2.0授权协议开源,主要项目代码在Git ...

  6. docker简介以及优缺点

    1.docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制, ...

  7. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  8. CI Weekly #6 | 再谈 Docker / CI / CD 实践经验

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  9. Docker化运维方式讲解

    应用迁移需求 应用运维需要考虑的一个重要问题就是迁移, 在不同机器.机房.环境间迁移.迁移的原因有很多, 比如硬件过保(硬件故障), 机房迁移, 应用扩缩容等. 应用迁移的核心需求是: 简单.迁移操作 ...

随机推荐

  1. Javaweb表格加载---DataTable

    Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 使用 jQuery Datatable 构造数据列表,并且增加或者隐藏相应的列,已达 ...

  2. JavaWeb配置详解(结合框架SpringMVC)

    详解 先说一说常识性的东西,我们的JavaWeb程序运行一开始走的是web.xml文件,这是我们的核心文件,可以说没有web.xml文件我们就无法运行项目,这个文件长什么样子,读者自己新建一个web项 ...

  3. 洛谷 P4401 [IOI2007]Miners 矿工配餐

    题意简述 有两个矿洞,已知食物的种类(≤3)和顺序,将他们送往任一矿洞, 若一个矿洞3次食物相同,贡献1:若有2种不同食物,贡献2:若有3种不同食物,贡献3 求最大贡献 题解思路 food[i] 为当 ...

  4. .net软件开发脚本规范-代码标准(webform)

    一. 代码标准 列表界面 1.1前台代码 1) 样式与js脚本,UI.css为界面样式,Font.css为字体样式,Common.js为通用基础js脚本,基本所有页面都需要,如果有需要新增的复制一行, ...

  5. c# 20160721

    ctrl y =>反撤销 ctrl m m 隐藏当前代码段 重载运算符语法 把事件处理程序注册为 click事件的监听程序 [newButton.click+=newButton_click] ...

  6. Windows Server 2008在网络环境配置打印机

    下面学习在Windows Server2008在网络环境搭建打印机服务器,打印机服务器也是很常用的,特别是在中大型企业里面,打印机数量比较多为方便管理,可以搭建一个打印机服务,这里介绍一下,本地打印机 ...

  7. Ubuntu18设置mysql的sql_mode

    原因: MySQL 5.7.5及以上功能依赖检测功能.如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引 ...

  8. 优化Recorder H5录音:可边录边转码上传服务器,支持微信提供Android IOS Hybrid App源码

    Recorder H5 GitHub开源库随着支持功能的增多,音频转码处理效率渐渐的跟不上需求了,近期抽时间对音频转码部分进行了升级优化,以支持更多实用的功能. 另外IOS的Hybrid App也完成 ...

  9. java高并发系列 - 第31天:获取线程执行结果,这6种方法你都知道?

    这是java高并发系列第31篇. 环境:jdk1.8. java高并发系列已经学了不少东西了,本篇文章,我们用前面学的知识来实现一个需求: 在一个线程中需要获取其他线程的执行结果,能想到几种方式?各有 ...

  10. 记录一下vue transition 过渡各状态()

    .slide-fade-enter{   opacity: 0;   transform: translateX(100px);   /*从哪里开始过渡:在过渡之前我就把位置定义在100px的位置,并 ...