1.什么是Docker

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

Docker使用Google公司推出的Go语言进行开发实现.

Docker是linux容器的一种封装,提供简单易用的容器使用接口.它是最流行的Linux容器解决方案.

Docker的接口相当简单,用户可以方便的创建、销毁容器.

Docker将应用程序与程序的依赖,打包在一个文件里面.运行这个文件就会生成一个虚拟容器.

程序运行在虚拟容器里,如同在真实物理机上运行一样,有了docker,就不用担心环境问题了.

2.Docker应用场景

web应用的自动化打包和发布

自动化测试和持续集成、发布

在服务型环境中部署和调整数据库或其他应用

3.为什么要用Docker?

我们先看看很久很久以前,服务器是怎么部署应用的!



由于物理机的诸多问题,后来出现了虚拟机!



但是虚拟化也是有局限性的,每一个虚拟机都是一个完整的操作系统,要分配系统资源,虚拟机多道一定程度时,操作系统本身资源也就消耗殆尽,或者说必须扩容.

4.Docker与虚拟机的区别

Docker VS 传统虚拟机
特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱
系统支持量 单机支持上千个容器 一般几十个

4.1物理机是这样的

4.2 虚拟机是这样的

4.3 容器是这样的

5.环境配置的难题

让开发人员最头疼的麻烦事之一就是环境配置了,每台计算机的环境都不相同,应该如何确保自己的程序换一台机器能运行起来呢?

用户必须确保的是:

操作系统的相同

各种平台库和组件的安装

例如:python依赖包,环境变量等.

如何一些低版本的依赖模块和当前环境不兼容,那就头疼了...

如果环境配置这么痛苦的话,换一台机器,就得重新配置一下,那么在安装软件的时候,带着原始环境一模一样的复制过来.

5.1解决方案-虚拟机

虚拟机也可以制作模板,基于模板创建虚拟机,保证环境问题一致

虚拟机(virtual machine)就是带环境安装的一种解决方案.

它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统.

应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样.

而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响.

虽然用户可以通过虚拟机还原软件的原始环境.

缺点

(1)资源占用多

虚拟机会独占一部分内存和硬盘空间.

它运行的时候,其他程序就不能使用这些资源了.

哪怕虚拟机里面的应用程序,真正使用的内存只有1MB,

虚拟机依然需要几百MB的内存才能运行.

(2)冗余步骤多

虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录.

(3)启动慢

启动操作系统需要多久,启动虚拟机就需要多久.可能要等几分钟,应用程序才能真正运行.

优点

(1)资源池 - 一个物理机的资源分配到了不同的虚拟机里

(2)很容易扩展 - 加物理机器或加虚拟机

(3)很容易云化 - 亚马逊AWS, 阿里云等

5.2解决方案二-Linux容器

现在:自从用上docker容器后,可以实现开发、测试和生产环境的统一化和标准化.

镜像作为标准的交付件,可在开发、测试和生产环境上以容器来运行,最终实现三套环境上的应用以及运行所依赖内容的完全一致.

由于虚拟机的诸多问题,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写LXC).

Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离.在正常进程的外面套了一个保护层,对于容器里面进程来说,它接触的资源都是虚拟的,从而实现和底层系统的隔离.

(1)启动快

容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程.所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多.

(2)资源占用少

容器只占用需要的资源,不占用那些没有用到的资源.虚拟机由于是完整的操作系统,不可避免要占用所有资源.另外,多个容器可以共享资源,虚拟机都是独享资源.

(3)体积小

容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多.

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多.

6.Docker容器的优势

更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker对系统资源的利用率更高.

无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效.因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用.

6.1更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间.大>大的节约了开发、测试、部署的时间.

6.2一致的运行环境

开发过程中一个常见的问题是环境一致性问题.由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现.

而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现这段代码在我机器上没问题啊这类问题.

6.3持续交付和部署

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行.

使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署.开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,

而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署.

而且使用Dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像.

6.4更轻松的迁移

由于Docker确保了执行环境的一致性,使得应用的迁移更加容易.Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的.

因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况.

7.Docker三大概念

容器三大基本概念
镜像 image
容器 container
仓库 repository
docker整个生命周期就是这三个概念.

7.1Docker镜像

Docker镜像就是一个只读的模板.

例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序.

镜像可以用来创建Docker容器.

Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用.

7.2image的分层存储

因为镜像包含完整的root文件系统,体积是非常庞大的,因此docker在设计时按照Union FS的技术,将其设计为分层存储的架构.

镜像不是ISO那种完整的打包文件,镜像只是一个虚拟的概念,他不是一个完整的文件,而是由一组文件组成,或者多组文件系统联合组成.

7.3Docker容器(container)

image和container的关系,就像面向对象程序设计中的类和实例一样,镜像是静态的定义(class),容器是镜像运行时的实体(object).

容器可以被创建、启动、停止、删除、暂停

Docker利用容器来运行应用.

容器是从镜像创建的运行实例.它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台.

可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序.

注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层.

7.4Docker仓库(repository)

仓库是集中存放镜像文件的场所.有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分.实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag).

仓库分为公开仓库(Public)和私有仓库(Private)两种形式.

最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载.国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问.

当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了.

注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务.

8.Docker Registry

Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务.

一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像.

最常使用的Registry公开服务是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像.

除此以外,还有CoreOS的Quay.io,CoreOS相关的镜像存储在这里;

Google的Google Container Registry,Kubernetes的镜像使用的就是这个服务.

由于某些原因,在国内访问这些服务可能会比较慢.

国内的一些云服务商提供了针对Docker Hub的镜像服务(Registry Mirror),这些镜像服务被称为加速器.

常见的有阿里云加速器、DaoCloud 加速器、灵雀云加速器等.

使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多.

国内也有一些云服务商提供类似于Docker Hub的公开服务.比如时速云镜像仓库、网易云镜像服务、DaoCloud镜像市场、阿里云镜像库等.

Docker介绍及优缺点对比分析的更多相关文章

  1. JSON与XML优缺点对比分析

    本文从各个方面向大家对比展示了json和xml的优缺点,十分的全面细致,有需要的小伙伴可以参考下. 1. 定义介绍 1.1 XML定义 扩展标记语言 (Extensible Markup Langua ...

  2. [转帖]LCD与LED的区别之背光原理与优缺点对比介绍

    LCD与LED的区别之背光原理与优缺点对比介绍 http://m.elecfans.com/article/620376.html 时下液晶面板与液晶电视技术已经达到炉火纯青的境界,并已经成为大屏幕平 ...

  3. GitHub & Bitbucket & GitLab & Coding 的对比分析

    目前基于 Git 做版本控制的代码托管平台有很多种,比较流行的服务有 Github.Bitbucket. GitLab. Coding,他们各自有什么特点,个人使用者和开发团队又该如何选择? 在这篇文 ...

  4. Protobuf的简单介绍、使用和分析

      Protobuf的简单介绍.使用和分析   一.protobuf是什么? protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库( ...

  5. 转载:负载均衡器技术Nginx和F5的优缺点对比

    https://blog.csdn.net/zxc456733/article/details/78861100 nginx(一) nginx详解 nginx是一个被广泛使用的集群架构组件,我们有必要 ...

  6. (转)磁盘阵列RAID原理、种类及性能优缺点对比

    磁盘阵列RAID原理.种类及性能优缺点对比 原文:http://www.cnblogs.com/chuncn/p/6008173.html 磁盘阵列(Redundant Arrays of Indep ...

  7. php开发面试题---Redis和Memcache区别,优缺点对比

    php开发面试题---Redis和Memcache区别,优缺点对比 一.总结 一句话总结: Redis相当于Memcache的扩展,增加比如持久化.多种数据结构.集群分布式功能 反思的回顾非常有用,因 ...

  8. 转!!负载均衡器技术Nginx和F5的优缺点对比

    对于数据流量过大的网络中,往往单一设备无法承担,需要多台设备进行数据分流,而负载均衡器就是用来将数据分流到多台设备的一个转发器. 目前有许多不同的负载均衡技术用以满足不同的应用需求,如软/硬件负载均衡 ...

  9. Android和Linux应用综合对比分析

    原文地址:http://www.cnblogs.com/beer/p/3325242.html 免责声明: 当时写完这篇调查报告,给同事看了后,他觉得蛮喜欢,然后想把这篇文章修改一下,然后往期刊上发表 ...

随机推荐

  1. 设置U盘启动

    利用快捷键来设置U盘启动,利用快捷键启动相对来说比较简单快捷,推荐大家使用(重要提醒:选择热键前,请先插入U盘) 组装机主板 品牌笔记本 品牌台式机 主板品牌 启动按键 笔记本品牌 启动按键 台式机品 ...

  2. js - 类模拟

    JavaScript 中并没有真正的类,但JavaScript 中有 构造函数 和 new 运算符. - 任何JavaScript 函数都可以用做构造函数, - 构造函数必须使用 new 运算符来创建 ...

  3. Mac终端主题Peppermint

    Peppermint主题下载 下载地址:https://noahfrederick.com/log/lion-terminal-theme-peppermint 配置颜色: 1.写配置文件 vim ~ ...

  4. View的setTag和getTag使用

    在listview 优化其中,会使用到setTag()以及getTag()方法 代码例如以下: @Override public View getView(int position, View con ...

  5. Atitit.虚拟机与指令系统的设计

    Atitit.虚拟机与指令系统的设计 1. 两种计算模型  ,堆栈机和状态机(基于寄存器的虚拟机1 1.1.1. 堆栈机1 1.1.2. 状态机2 2. 为什么状态机比堆栈机快呢?3 2.1. Sta ...

  6. CCS调试教程

    包括CCS3.3和CCS5.5两个版本的调试教程. CCS3.3 3.3教程来自http://zhujlhome.blog.163.com/blog/static/205621092201261032 ...

  7. HDU5374 Tetris (2015年多校比赛第7场)大模拟

    思路: 先写好了几个函数.旋转,四种操作,推断能否够进行合并消除 题中有好几处要考虑的细节问题,如 自然下落究竟部时不进行合并的推断,而是当自然下落非法时才推断 假设消除一行,这一行上面的所以方块仅仅 ...

  8. mock带参数的构造函数

    @RunWith(PowerMockRunner.class)@PrepareForTest(Helper.class)//1.添加要初始化的类,就是构造函数所在的类public class Help ...

  9. 用@spy模拟真实对象的部分行为

    1.说明在某些情况下,我们需要使用一个真实对象.但是,我们同时需要自定义该对象的部分行 为,此时用@spy 就可以帮我们达到这个目的. 2.用法: categoryService = PowerMoc ...

  10. jdbctemplate中的query(sql,params,mapper)与queryForList(sql,params,class)区别

    query(sql,params,mapper):是针对自定义对象类型的查询语句,比如: jdbcTrade.query(sql, params, new AMapper()); queryForLi ...