从docker介绍及其简介

1、引言

1.我本地代码运行没问题啊,可是别人机器运行不了,从而致使环境不一致的问题php

2.那个兄弟又写死循环了,怎么这么卡,在多用户的操做系统下,会相互影响。html

  1. 天猫双十一的状况下,用户量暴涨,从而致使运维成本太高的问题linux

image-20201203085054538

2、docker的由来

Docker 是一个开源项目,诞生于 2013 年初,最初是dotCloud 公司内部的一个业余项目。它基于 Google 公 司推出的 Go 语言实现。2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源。git

image-20201203093035368

听从了 Apache 2.0 协议,项目代码在 GitHub上进行 维护。Docker 自开源后受到普遍的关注和讨论,以致于 dotCloud公司后来都更名为 Docker Inc。Redhat已经 在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS产品中普遍应用。Docker 项目的目标是实现轻量级的 操做系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一 步的封装,让用户不须要去关心容器的管理,使得操做更为简便。用户操做 Docker 的容器就像操做一个快速轻量级的虚拟机同样简单。Docker 可让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然 后发布到任何流行的 Linux 机器上,也能够实现虚拟化。容器是彻底使用沙箱机制,相互之间不会有任何接口 (相似iPhoneapp),更重要的是容器性能开销极低。web

3、为何要有docker?(why?)

先说docker是干啥用的。由于如今物理服务器是很强大的,咱们若是在一台物理机上只跑一个服务就浪费了。而同时跑不少服务他们之间又互相影响,好比一个服务出了内存泄漏把整个服务器的内存都占满了,其余服务跟着倒霉。因此要把每一个服务都必须隔离起来,让它们只使用本身那部分有限的CPU、内存、硬盘以及本身所依赖的软件包。在容器技术以前,这个最先是用的是虚拟机--------业界的网红。虚拟机技术的表明,是VMWareOpenStack因此,早先每一个服务之间是用虚拟机来实现隔离的,可是对资源有点浪费,因而就有了docker,一个机器上能够装十几个到几十个docker,他们共享操做系统核心,占用资源少,启动速度快,但又能提供资源(CPU、内存、磁盘等)的必定程度的隔离。docker

简单来讲就是,不一样的应用程序所依赖的环境不同,若是把他们依赖的软件都安装在一个服务器上,不只须要调试好久,并且可能会有冲突。tomcat

若是想把两个应用程序隔离起来,能够在服务器上建立不一样的虚拟机,不一样的虚拟机放不一样的应用,可是虚拟机的开销比较高。docker做为轻量级的虚拟机,是一个很好的工具。安全

## 服务器

4、什么是docker?(what?)

引入:咱们知道,软件的依赖环境大体包括配置文件、代码、tomcat(web轻量应用服务器)JDK(软件开发工具包)、操做系统架构

  • IT 软件中所说的 “Docker” ,是指容器虚拟化技术,docker自己并非容器,而是用于支持建立和使用 Linux 容器的工具。

  • 在实际应用中是软件部署的一种解决方案:做为一个软件集装箱化平台,可让开发者构建应用程序时,将它与其依赖环境一块儿打包到一个容器中,而后很容易地发布和应用到任意平台中也能够实现虚拟化,容器是彻底使用沙箱机制,相互之间不会有任何接口。同时,也提高计算机硬件资源的利用率。

    补充 说明

    # 沙箱机制(Sandboxie)
    1、沙箱是什么?
      沙箱是一个虚拟系统程序,沙箱提供的环境相对于每个运行的程序都是独立的,并且不会对现有的系统产生影响,即沙箱提供一个限制该应用程序对系统资源的访问权限。

    2、沙箱的应用
      (1)搭建测试环境。沙箱的应用只能访问本身的应用访问目录,而不能应用之间的资源进行共享,这样就造成了一个相对安全的机制,因为沙箱具备很是良好的独立性、隔离性,因此可以搭建一些具备高风险的软件进行测试。

      (2)应用容器的利用,如Docker就是应用沙箱机制,这样使得应用组件通过Docker的封装,使得在项目的迁移、测试环境到生产环境的部署,保证了应用程序的运行环境保持一致性,同时也减小大量在环境搭建上的工做量。

围绕Docker引擎进行开发和集成的产品

示例

  1. 首先,鲸鱼是操做系统。要交付的应用程序是各类货物,要将各类形状和尺寸不一样的货物放到大鲸鱼上,得考虑每件货物怎么安放(应用程序配套的环境),还得考虑货物和货物之间可否重叠起来(应用程序依赖的环境是否会冲突)。

  2. 如今使用了集装箱(容器)把每件货物都放到集装箱里,这样大鲸鱼能够用一样地方式安放、堆叠集装了,省事省力。

  3. 即:打包放到鲸鱼上,鲸鱼放到服务器上。也就是搭建(建立)=》运输(发送)=》运行:“build——ship——run”,这样在本身的电脑上怎么运行,在服务器上也会怎么运行。

用docker运行一个程序的过程:

去仓库把镜像拉到本地,而后用一条命令把镜像运行起来,变成容器。

image-20201202120626320

5、docker的思想

集装箱:

  • 会将全部须要的内容放到不一样的集装箱中,谁须要这些环境就直接拿到这个集装箱就能够

标准化

  • 运输的标准化:docker有一个码头全部上传的集装箱都放在了这个码头上,当谁须要某一个环境,就直接指派大鲸鱼去搬运这个集装箱就能够了

  • 命令的标准化:docker提供了一系列的命令,帮助咱们去获取集装箱等等操做,固然,也能够上传等操做

  • 提供了RESTAPI:衍生出了不少的图形化界面,Rancher等

    • PS:REST API是一组关于如何构建Web应用程序API的架构规则、标准或指导,REST API遵循API原则的架构风格。REST是专门针对Web应用程序而设计的,其目的在于下降开发的复杂度,提升系统的可伸缩性。

隔离

  • docker在运行集装箱内的内容时,会在linux的内核中单独的开辟一片空间,这片空间不会影响到其余程序

 

6、docker的核心

docker三大核心:镜像、容器、仓库

镜像:(Image)=>复制的程序

定义:Docker 镜像能够看做是一个特殊的文件系统(模板),除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

做用:相似于虚拟机的快照,用来建立新的容器

特色:镜像不包含任何动态数据,其内容在构建以后也不会被改变。

image-20201203091105075

容器:(Container)=>集装箱

  • 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例同样,镜像是静态 的定义,容器是镜像运行时的实体。容器能够被建立、启动、中止、删除、暂停等。

仓库: (Repository)=存放镜像的地方

用来保存镜像的仓库,控制版本,相似于git。当咱们构建好本身的镜像以后,须要存放在仓库中,当咱们须要启动一个镜像时,能够在仓库中下载下来。

7、docker的做用

  • 解决运行环境不一致所致使的问题。这样就不会产生“本地运行没问题,可一到服务器上就不行了”的状况。

  • 限定最大的cpu使用内存硬盘,这样就起到了隔离的做用,避免产生“一块代码产生死循环,把磁盘占满了,其它程序也挂了”的状况。

  • 双11时扩展机器用,下降运维人员的成本。

image-20201203092656526

总结:

docker的标准化让快速扩展,弹性伸缩变得简单

使用以前:

每次发布一个程序,都要走一遍如下的流程:

image-20201203092021035

使用以后:

迁移的时候,只须要在新的服务器上启动须要的容器就能够了,

不管新旧服务器是不是同一类别的平台。这无疑帮助咱们节约了大量的宝贵时间,并下降部署过程出现问题的风险。

image-20201203092109569

 

8、docker与虚拟机的比较

做为一个做为一种轻量级的虚拟化方式,Docker 在运行应用上跟传统的虚拟机的方式相比具备以下显著优点:

  • Docker 容器启动很快,启动和中止能够实现秒级,相比传统的虚拟机方式(分钟级)要快速不少。

  • Docker 容器对系统资源需求不多,一台主机上能够同时运行数千个 Docker 容器。

  • Docker 经过相似 git 设计理念的操做来方便用户获取、分发和更新应用镜像,存储复用,增量更新。

  • Docker 经过Dockerfile支持灵活的自动化建立和部署机制,能够提升工做效率,并标准化流程。

 

特性 容器 虚拟机
启动速度 秒级 分钟级
隔离级别 进程级 操做系统级别
隔离策略 CGroups Hypervisor
性能 接近原生 较好
内存 MB级 GB级
系统资源 0~5% 5~15%
镜像储存 KB-MB GB-TB
硬盘适应 MB级 GB级
集群规模 上万 上百
运行密度 单台主机支持上千个 单台主机支持几个
隔离性 安全隔离 彻底隔离
迁移 优秀 通常
高可用策略 弹性、负载、动态 备份、容灾、迁移

dockerVM快的缘由:

  1. docker有着比虚拟机更少的抽象层

    • 因为docker不须要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源 所以在CPU、内存利用率上docker将会在效率上有明显优点

  2. docker利用的是宿主机的内核,而不须要Centos

    • 所以当新建一个容器时,docker不须要和虚拟机同样从新加载这个操做系统内核 进而避免寻找、加载操做系统内核比较费时费资源的过程

  3. 当新建个虚拟机时,虚拟机软件须要加载Centos这个新建过程是"分钟级别的"

    • docker因为直接利用宿主机的操做系统,则省略了这个个过程所以新建一个docker容器只须要"几秒钟"

9、docker与虚拟化

Docker 以及其余容器技术,都属于操做系统虚拟化范畴,操做系统细腻化最大的特色就是不须要额外的 supervisor 支持。Docker 虚拟化方式之因此有众多优点,跟操做系统虚拟化技术自身的设计和实现分不开。

image-20201203110242073

传统方式是在硬件层面实现虚拟化,须要有额外的虚拟机管理应用和虚拟机操做系统层。Docker 容器时在操做系统层面实现虚拟化,直接复用本地主机的操做系统,所以更加轻量级。

虚拟机技术:

  • 在一个操做系统之上运行 / 安装另外一种操做系统

  • 应用程序, 操做系统和硬件三者之间的关系不变

缺点:

  1. 资源占用多

  2. 冗余步骤多

  3. 启动慢(分钟级)

容器虚拟化技术:

💪虚拟化技术详解,在下一篇文章中介绍猛👉👉👉戳我

  • 不是模拟一个完整的操做系统, 他是将软件运行所须要的全部资源打包到一个隔离的容器

  • 只须要软件工做所须要的库资源和设置

  • 所以系统变得高效轻量, 且能保证任何环境中软件都能始终如一的运行

容器虚拟化技术

10、docker的运行原理

docker的基本架构图:

image-20201203095037568

低层原理

原理解析

  • docker pull的时候,Docker damemon先在本地仓库中找,若是没有,再去中央仓库中拉取,拉取到本地仓库就行了。

  • docker run的时候,也是先在本地仓库中找,若是有,直接放到容器里用。不然,去中央仓库中拉取。

docker的工做方式:

  • Docker是一个Client-Server结构的系统

  • Docker守护进程运行在主机上,而后经过Socket链接从客户端访问, 守护进程从客户端接受命令并管理运行在主机上的容器,而容器,就是一个运行时的环境

img

 

11、docker理念(在开发和运维之间的优点):

docker的理念:一次构建到处运行

对于开发和运维人员来讲,最求之不得的效果可能就是一次建立和配置,以后能够在任意地方、任意时间让应用正常运行,而 Docker 偏偏能够实现这一中级目标。具体来讲,在开发和运维过程当中,Docker 具备如下几个方面的优点:

  • 更快的应用交付和部署

    • 传统的应用开发完成后,须要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行

    • 使用Docker以后只须要交付少许容器镜像文件,在正式生产环境加载镜像并运行便可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间

  • 更便捷的升级和扩缩容

    • 随着微服务架构和Docker的发展,大量的应用会经过微服务方式架构,应用的开发构建将变成搭乐高积木同样,每一个"Docker容"器将变成一块"积木","应用的升级将变得很是容易"

    • 当现有的容器不足以支撑业务处理时,可经过镜像运行"新的容器进行快速扩容",使应用系统的扩容从原先的天级变成分钟级甚至秒级

  • 更简单的运维系统

    • 应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用"高度一致",容器会将应用程序相关的环境和状态彻底封装起来,不会由于底层基础架构和操做系统的不一致性给应用带来影响,产生新的BUG

    • 当出现程序异常时,也能够经过测试环境的相同容器进行快速定位和修复

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

    • Docker是内核级虚拟化,其不像传统的虚拟化技术同样须要额外的Hypervisor支持,因此在一台物理机上"能够运行不少个容器实例",可大大"提高物理服务器的CPU和内存的利用率"

12、docker总结:

  • Docker自己并非容器,它是建立容器的工具,是应用容器引擎。

  • Docker 是一个容器运行载体或称之为管理引擎

  • image 文件生成的容器实例,自己也是一个文件,称为镜像文件

  • 同一个 image 文件,能够生成多个同时运行的容器实例

  • 一个容器运行一种服务,当咱们须要的时候,就能够经过docker客户端建立一个对应的运行实例,也就是咱们的容器

  • 至于仓库,就是放了一堆镜像的地方,咱们能够把镜像发布到仓库中,须要的时候从仓库中拉下来就能够了

 

附赠宝典秘籍

如下是一些关于docker的参考资料,有兴趣的能够看看:

https://www.zhihu.com/question/28300645

http://blog.51cto.com/ganbing/2085769?from=timeline&isappinstalled=0

http://c.biancheng.net/view/3118.html

https://www.cnblogs.com/mrhelloworld/p/docker1.html

相关文章
相关标签/搜索