zoukankan      html  css  js  c++  java
  • Docker 简介

    Docker 是什么?

      Docker 是开源的应用容器引擎、

      Docker 可以让你将所有应用软件以及它的依赖打包成软件开发的标准化单元。

      Docker 容器将软件以及它运行安装所需的一切文件(代码、运行时、系统工具、系统库)打包到一起,这就保证了不管是在什么样的运行环境,总是能以相同的方式运行。就好像 Java 虚拟机一样,“一次编写,到处运行(Write once,run anywhere)”,而 Docker 是 “一次构建,到处运行(Build once,run anywhere)”。

      Docker 是一种“容器即服务”(Docker Containers as a Service ,简称 CaaS),使得开发和IT运营团队可以对于应用的构建、发布、运行更加敏捷和可控。

      概括的说:Docker 是为开发人员和系统管理员用于构建、发布、并运行分布式应用程序的开放式平台。该平台由 Docker 引擎(一个便携、轻巧的运行时和打包工具) 和 Docker Hub (一个共享应用程序和自动化工作流的云服务)等组成。Docker 可以使应用程序从组件迅速组装并消除了开发、质量保证和生产环境之间的摩擦问题。这样一来,IT部门可以更快地发布,而这些应用程序不管是运行在笔记本电脑、数据中心的虚拟机,还是任何的云,其运行过程和结果都是一致的。

      我们再来看下 Docker 的 Logo 。很明显,这是一只鲸鱼,它托着许多集装箱。我们可以把宿主机可当做这只鲸鱼,把相互隔离的容器可看成集装箱,每个集装箱中都包含自己的应用程序。

      KVM,Virtualbox,Vmware 是虚拟出机器,让每个实例看到一个单独的机器;而 Docker 是虚拟出操作系统,实现应用之间的隔离,让各个应用觉得自己有一个自己的操作系统,而且彼此之间隔离。

    Docker 的优点

    轻量级:所有容器在一台机器上共享同一个操作系统内核,这样他们立即开始,并更有效地利用内存。Image 是从分层文件系统的构建,这样他们能够能够共享公共文件,使得磁盘使用率和 Image 的下载更加高效。

    开放:Docker 容器是基于开发的标准,允许容器运行在主流的 Linux 发布版和 Microsoft 操作系统作为所有的基础设施。

    安全:容器使得应用程序彼此隔离,而基础架构同时为应用程序提供了额外的保护层。

    为什么要用 Docker

    开发更加敏捷:Docker 让开发人员可以自由定义环境,创建和部署的应用程序更快、更容易,IT 运维人员快速应对变化也更加灵活。

    更加可控:Docker 使得开发人员保存从基础设施到应用的代码,帮助 IT 运维人员管理拥有标准的、安全的、可扩展的操作系统。

    高可移植性:Docker 允许自由选择,可以从笔记本电脑到一个团队,从私人基础设施到公共云提供商。

    这样,可以专注于开发应用,其他的繁琐事情交给 Docker 去做。

    Docker 解决了什么问题

    Docker 和虚拟主机(VM)要解决的问题是非常类似的:

    1、在同一台主机上运行不同的程序,而这些不同的程序之间有可能存在依赖冲突的情况;

    2、即便依赖冲突能在同一台主机上解决,但随着运行的程序的数量互相交织,维护的成本也将成指数上升;

    3、程序开发过程中,由于硬件、操作系统的细微差别,在多人共同开发和部署到生产环境上后,可能会出现难以被排查出来的问题;

    4、分布式 / 集群环境的程序分发和环境配置问题;

    5、硬件资源的利用率;

    Docker 与虚拟机的区别

    容器与虚拟机有着类似的资源隔离和分配的优点,但不同的架构方法使容器能够更加便携,高效等。

    虚拟机架构

      容器的架构

    从硬件资源利用情况看

    虚拟机(VM)实际上利用了虚拟化的技术,获取了主机上实际的硬件资源(内存、CPU),通过获取到的硬件资源重新构建一个接近于真实的机器,而这部分被分配过的硬件资源(比如 512MB 内存)在虚拟机启动了以后,不管是否真的有使用到了,对于主机来说就真的少了这部分的资源了( 可用内存 = 物理内存 - 512MB);

    而 Docker 利用的是 Linux 主机上的内核技术,当一个容器在运行的时候,实际上是“映射”成主机上的一批进程,这些进程相互独立,共享主机的硬件资源,假设容器1运行 MySQL 占用了 100MB 内存,容器2运行 nginx 占用 50MB 内存,在理论上(不计算容器本身的损耗的话)主机当前剩余可用内存 = 物理内存 - 100MB - 50MB;

    === 从程序运行归属情况看 ===

    VM中的程序,是在隔离于主机的一个独立的操作系统(GuestOS)中运行的,程序运行的前提是 GuestOS 处于启动的状态,而程序运行后对于主机来说是完全透明的,主机无法看到VM中运行了什么进程;

    而在 Docker 容器中运行的程序,只是隔离了程序的依赖关系(Bins/Libs),程序的执行者还是属于主机的,对主机来说所有容器在执行的程序都是主机的进程,不存在 GuestOS 所以也不存在需要启动 GuestOS;

    === 从对主机操作系统的依赖看 ===

    VM依赖的是虚拟化技术(Hypervisor),当具体使用的技术是在对应的平台下能运行的话,该操作系统平台就可以创建VM并运行;

    而 Docker 的运行原理是基于 LXC,这是基于 Linux 内核版本 2.6.24+ 以上才有的技术,所以依赖于 Linux,在其它平台上(Windows、OSX)无法直接使用(但可通过VM创建一个Linux系统来使用);

    === Docker Logo 的解读 ===

    其实 Docker 的 Logo 很形象的说明了它自身的概念

    鲸鱼通过身上的集装箱(Container)来将不同种类的货物进行隔离;而不是通过生出很多小鲸鱼(Guest OS)来承运不同种类的货物。

    每个虚拟机都包括应用程序、必要的二进制文件和库以及一个完整的客户操作系统(Guest OS),尽管它们被分离,它们共享并利用主机的硬件资源,将近需要十几个 GB 的大小。

    容器包括应用程序及其所有的依赖,但与其他容器共享内核。它们以独立的用户空间进程形式运行在主机操作系统上。他们也不依赖于任何特定的基础设施,Docker 容器可以运行在任何计算机上,任何基础设施和任何云上。

      Docker 的容器利用了 LXC,管理利用了 namespaces 来做权限的控制和隔离,cgroups 来进行资源的配置,并且还通过 aufs 来进一步提高文件系统的资源利用率,而这些技术都不是 Docker 独创。

      LXC 

      LXC 与虚拟机的不同之处在于,它是一个操作系统级别的虚拟化环境,而不是硬件虚拟化环境。他们都做同样的事情,但 LXC 是操作系统级别的虚拟化环境,虚拟环境有它自己的进程和网络空间,而不是创建一个完整成熟的虚拟机。因此,一个 LXC 虚拟操作系统具有最小的资源需求,并启动只需几秒钟。

     

    1、安装的时候把原始环境一模一样的复制过来,开发利用Docker可以消除协作编码时,在“我的机器上可以正常工作”的问题。

    以前开发人员只是提交代码,现在我们要提交整个环境,以前是搬家,现在是搬整栋楼。

    问题1:什么是镜像?

    以前我们的代码就是应用,我们只管把我们的代码写完了,编译好的文件交给运维,由运维去部署。

    从现在开始要有这个理念,我们不仅仅是提交代码,还有运行的文档、配置的环境,运行环境、运行依赖包等等……就像我们说的,搬家搬整栋楼;这样的话可以将当前这个功能能稳定运行的一整套环境,带着环境安装到Docker上面,让运维工程师发布,那么这样的话呢,就可以把原始环境一模一样的复制,消除了在开发这里能跑,运维工程师这里不能跑的问题;

    而且,运维还有个非常苦逼的概念是什么概念呢?由于互联网高并发的环境和大流量的访问,运维工程师要部署的时候,就是集群(简单的说就是多台),如果每一台都要需要去安装数据库等,重复性的工作会发疯的。JAVA的思想要把相同出现的代码抽取出来,形成一个公用的方法并且对外暴露。

    那我们就不用到处编,调一次就行了,Docker会认为:能不能把一个良好的软件运行环境,打个包封装成一个东西叫做镜像,然后需要安装的每个人,有这么一份镜像,不就OK的吗?那么这种理念就是我们的Docker理念的雏形。

    总结(Docker思想雏形&什么是镜像):

    理念就是一次构建,处处运行。
    我们不再提交代码,而是提交镜像,什么叫做镜像(就是含代码以外还有一堆东西的原始环境,保证正常运行)。
    Docker理念
    问题1:Docker的logo为什么是它是一只鲸鱼,背上有一个一个的集装箱,集装箱之间有隔离的这种区别?

    大家带着这个问题,我们首先大家读一下这张图:

    不用再给运维人员软件安装清单了,开发本地需要用到nginx、redis、mongoDB、Mysql四个,把你的这4个环境,相当于说放在4个集装箱(ship)里面,构建一下形成一个镜像文件,那这个镜像文件里面就有4个集装箱,每一个集装箱就是你本地正确运行的软件的一份克隆,一个镜像;

    四个镜像放到Docker上面跑,好比鲸鱼背上4个集装箱各自独立,那么我这边运维呢,就只装一个东西,我也不想去装4次了,这就装一个东西Docker,就是那只鲸鱼,背上由你开发给我一个镜像,这一个镜像里面就有这4个集装箱,这4个集装箱放到Docker上面,那么我运行的跟你一模一样。

    总结:相当于一次配套环境换到别的机器上,一键运维部署好,大大的进化了我们的运维的操作,那么这个时候彻彻底底完成了一次封装构建到处运行的理念。

    百度百科(Dokcer是什么?)

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

    能干嘛
    之前的虚拟机技术&容器虚拟化技术
    虚拟机就是在一个操作系统里面运行另外一个操作系统,比如在windows系统里面运行Linux系统,应用程序对此毫无感知,因此虚拟机看上去跟真实系统一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响,这类区域以及完美的运行了,另一套系统能够使应用程序操作系统和硬件三者之间的逻辑不变。

    虚拟机及其强大模拟的是整套操作系统(打印机等软件、硬件)。

    但是启动虚拟机真的是很慢的,是分钟界别,但是Docker是秒级别。

    虚拟机的缺点:

    1、资源占用多  2、冗余步骤多  3、启动慢

    Docker提出在Linux基础之上,提出Linux Container,不是完整的一个操作系统,将软件运行所需要的所有资源打包到一个隔离的容器中(可以当做一个集装箱ship)。

    比较了Docker和传统虚拟化方式的不同之处:

    传统虚拟机技术是虚拟出一套硬件后,在其上运行的一个完整操作系统,在系统上在运行所需应用进程;
    而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传荣虚拟机更为轻便。
    每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
    Docker就是小型的Linux系统。

    开发/运维(DevOps)
    开发自己运维,不用运维了,开发也能干运维的活。(因此构建,随处运行)

    问题:Docker开发的好处?

    1、更快捷的应用交付和部署 2、更便捷的升级和扩缩容 3、更简单的系统运维 4、更搞笑的计算资源利用

    去哪下
    docker官网:http://docker-cn.com/what-docker

    仓库:http://hub.docker.com/

    Docker安装
    Docker的基本说明
    CentOS Docker 安装
    Docker支持以下的CentOS版本:
    CentOS 7 (64-bit)
    CentOS 6.5 (64-bit) 或更高的版本
     
    前提条件
    目前,CentOS 仅发行版本中的内核支持 Docker。
    Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
    Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
     
    查看自己的内核
    uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。

     
    查看已安装的CentOS版本信息(CentOS6.8有,CentOS7无该命令)

     
     

    基本组成和Docker架构图


    架构图


    解释说明
    问题1:什么是镜像?

    问题2:什么是容器?

    问题3:什么是仓库?

    小总结:

    需要正确的理解仓储/镜像/容器这几个概念:
     
     Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
     
    *  image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
     
    *  一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
     
    * 至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。

  • 相关阅读:
    L1-045 宇宙无敌大招呼 (5分)
    L1-044 稳赢 (15分)
    L1-043 阅览室 (20分)
    L1-042 日期格式化 (5分)
    L1-041 寻找250 (10分)
    L1-040 最佳情侣身高差 (10分)
    L1-039 古风排版 (20分)
    L1-038 新世界 (5分)
    L1-037 A除以B (10分)
    利用C一种最有效的文件存储方式——16bit有符号位2进制存储
  • 原文地址:https://www.cnblogs.com/2567xl/p/12562440.html
Copyright © 2011-2022 走看看