通过网盘分享的文件MD文档笔记链接: https://pan.baidu.com/s/1ao2wfyLEdN50YmIqdzfGYQ?pwd5w5z 提取码: 5w5z–来自百度网盘超级会员v6的分享一.Docker简介1.什么是DockerDocker 是一个开源的应用容器引擎,是创建容器的工具让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化容器是完全使用沙箱机制,相互之间不会有任何接口就像杯子可以装水、笔筒可以放笔、书包可以放书、可以把hello word放在docker中、可以把网站放入docker中、可以把任何想得到的程序放在docker中Docker 从 17.03 版本之后分为 CE(Community Edition:社区版) 和 EE(Enterprise Edition:企业版)官网: https://www.docker.com2.Docker的设计思想Docker的思想来自于集装箱在一艘大船上可以把货物规整的摆放起来,并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响,此时就不需要专门运送水果的船和专门运送化学品的船了,只要这些货物在集装箱里封装的好好的,那就可以用一艘大船把他们都运走不同的应用程序可能会有不同的应用环境环境隔离问题比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突,这个时候就要隔离.net开发的网站和php开发的网站兼容性问题比如开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题比如有个特殊版本的数据库只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题这时候要是有docker就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker镜像就可以3.Docker的用途(1).提供统一的运行环境在实际工作中很多时候开发、测试及上线环境都是不一样的,从而导致项目(war或 jar)在不同阶段出现很多其它阶段所不存在的奇怪的问题Docker容器除了可以提供相同的应用外,还提供了该应用的统一运行环境,确保在任何宿主机上都可以跑出相同的结果即Docker jar/war 环境(2).便捷的应用迁移由于 Docker 确保了统一的运行环境,使得应用的迁移更加便捷无论是物理机、虚拟机、公有云、私有云上Docker 镜像的运行结果都是相同的用户可以很方便地将一个平台上运行的应用迁移到另一个平台上而无需担心运行环境的变化导致应用无法正常运行(3).超快的启动时间传统的虚拟机技术启动应用一般需要数分钟首先需要启动虚拟机然后再加载虚拟机操作系统最后还需要再手工启动应用而 Docker 容器应用由于直接运行于宿主机系统中无需启动操作系统因此可以做到秒级、甚至毫秒级的启动(4).更轻松的维护和扩展Docker 公司及各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单二.虚拟方式对比1.虚拟机技术(1).什么是虚拟技术虚拟机就是带环境安装的一种解决方案它可以在一种操作系统里面运行另一种操作系统(比如在Windows 系统里面运行Linux 系统)应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响这类虚拟机完美的运行了另一套系统,能够使应用程序、操作系统和硬件三者之间的逻辑不变(2).创建虚拟机过程实现一台虚拟机要进行如下操作首先需要一台物理机在物理机上安装好操作系统比如windows或者linux操作系统在操作系统上安装虚拟机软件使用虚拟机软件虚拟一台或者多台虚拟机,虚拟化虚拟机时要分配给虚拟机硬件资源(比如一定量的内存、处理器、硬盘容量等)在虚拟机上安装操作系统(比如CentOS、Ubuntu等)再安装应用程序需要的各种软件(比如JDK、Maven、Tomcat、MySQL等)这是在一台主机上部署一个程序就需要这些如果在另一台主机上部署另一个程序或者在同一台主机上部署另一个程序,同样需要再创建一个虚拟机,然后再安装各种软件这样的方式不仅会占用系统大量的资源,也会造成大量资源的浪费,因为在创建虚拟机时分配给虚拟机的内存就被这个虚拟机占用了,不管这个虚拟机实际使用了多少内存,这些内存都会被虚拟机占用着,同时大量重复这些操作也会相当的耗时,还容易出问题2.Docker虚拟技术(1).Docker虚拟技术由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)Docker 容器运行在 Docker 引擎之上,所有 Docker 容器共享同一个 Docker 引擎, 但它们的运行又是相互隔离、互不干扰的由于 Docker 容器不需要进行虚拟硬件及操作系统,而是共享的宿主机的硬件与操作系统,所以 Docker 容器对系统资源的占用很少,仅包含运行时必须的一些资源所有 Docker 容器对于系统资源的使用都是由 Docker 引擎统一进行管理,所以对系统资源的利用率很高,无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效(2).Docker创建过程使用Docker技术部署程序仅需做如下事情首先需要一台物理机在物理机上安装好操作系统,比如windows或者linux操作系统在操作系统上安装Docker引擎部署镜像生成容器3.Windows 系统的虚拟化(1).HypervisorHypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件,也可叫做 VMM( virtual machine monitor )即虚拟机监视器Hypervisors 是一种在虚拟环境中的元操作系统,他们可以访问服务器上包括磁盘和内存在内的所有物理设备Hypervisors 不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护当服务器启动并执行 Hypervisor 时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存、CPU、网络和磁盘(2).Hyper-VHyper-V 是微软的一款虚拟化产品,是微软第一个采用类似 Vmware ESXi 和 Citrix Xen 的基于 hypervisor 的技术,这也意味着微软会更加直接地与市场先行者 VMware 展开竞争,但竞争的方式会有所不同Hyper-V 是微软提出的一种系统管理程序虚拟化技术,能够实现桌面虚拟化Hyper-V 是微软提供的商业化的 HypervisorKVM 与 Xen 都是 Linux 系统之上的开源的Hypervisor(3).现在的 Windows 系统现在的 Windows 系统并不是一个纯洁的 windows 了,而是运行在Hyper-V 上的虚拟机原来的应用层现在也是一个运行在 Hyper-V 上的虚拟机,系统上运行的一个个的应用,其实就是运行在应用层虚拟机之中,操作系统虚拟机能够管理应用层虚拟机(4).windows 的启动(5).VMware 与 Windows 系统VMware 采用的是VMM 虚拟化技术,该技术要求直接访问CPU 硬件的虚拟化功能但 VMware 作为 windows 系统中的应用,是运行在应用层虚拟机中的,导致 VMware 无法直接访问 CPU 硬件虚拟化功能,所以在安装 VMware Workstation 时会出现 VMware Workstation与 Hyper-V 不兼容的问题三.Docker镜像原理1.操作系统组成部分操作系统由以下几部分组成进程调度子系统进程通信子系统内存管理子系统设备管理子系统文件管理子系统网络通信子系统作业控制子系统Linux文件系统由bootfs和rootfs两部分组成bootfs包含bootloader(引导加载程序)和 kernel(内核)rootfsroot文件系统包含的就是典型 Linux 系统中的/dev、/proc、/bin、/etc等标准目录和文件不同的linux发行版bootfs基本一样但是rootfs不同如ubuntu、centos等2.统一文件系统统一文件系统技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来只存在一个文件系统docker镜像系统的每一层都是只读的,每一层加载完成之后这些文件都会被看成是在同一个目录中,相当于只有一个文件系统,docker的这种文件系统被称之为镜像上图就是镜像的存储格式这张图是分层的,一层层的好像集装箱罗列在一起的镜像,这就是镜像最直观的存储方式Docker镜像是由特殊的文件系统叠加而成最底端是 bootfs并且使用的是宿主机的bootfs第二层是 root文件系统,rootfs称为base image然后再往上可以叠加其他的镜像文件,这些镜像都是只读的,因为这些镜像是别人的、是为了方便资源的复用,所以是不允许修改的统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来只存在一个文件系统一个镜像可以放在另一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像成为基础镜像当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器最上面一层先忽略不看因为这是和容器有关的3.Run的原理四.Docker系统架构官方架构图1.Docker DaemonDocker Daemon(即 Dockerd、Docker 守护进程)监听着 Docker API 请求并管理 Docker对象例如镜像、容器、网络和卷守护进程还可以与其他守护进程通信以管理 Docker 服务2.镜像 Image镜像是用于创建Docker容器的模板(就像面向对象编程中的类),是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)镜像不包含任何动态数据,其内容在构建之后也不会被改变Docker镜像就是一个只读的模板,镜像可以用来创建Docker容器3.容器ContainerDocker容器是镜像运行时的实体就像面向对象编程中类的实例(一个类可以创建出 N多个实例,那么一个镜像同样也可以创建出N 多个容器)它可以被启动、开始、停止、删除每个容器都是相互隔离的、保证安全的平台可以把容器看做是一个简易版的Linux环境,以及与运行在其中的应用程序打包而成的应用盒子4.仓库 RepositoryDocker仓库是集中存放镜像文件的场所仓库服务器(Registry)是存放仓库的地方,其上往往存放着多个仓库,每个仓库集中存放某一类镜像,通过不同的标签(tag)来进行区分例如存放Ubuntu操作系统镜像的仓库称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像根据存储的镜像公开分享与否Docker仓库分为公开仓库(Public)和私有仓库(Private)两种形式目前最大的公开仓库是Docker Hub(https://hub.docker.com/)Docker Hub存放了数量庞大的镜像供用户下载国内的公开仓库包括Docker Pool等,可以提供稳定的国内访问如果用户不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库当用户创建了自己的镜像之后就可以使用push将它上传到指定的公有或则私有仓库,这样用户下次在另一台机器上使用该镜像时,只需将其从仓库pull下来就可以了5.标签 Tag通过repository:tag即可唯一定位一个镜像即镜像标签其实就是镜像仓库中用于区分各个镜像的一种标识同一仓库中的镜像具有不同的标签6.镜像中心 RegistryDocker 的镜像中心中存放着很多由官方、其他机构或个人创建的 Docker 仓库Docker用户可以直接从这些仓库中 pull 需要的镜像,也可以将自己制作的镜像 push 到 Docker 镜像中心相应的仓库中最常用的镜像中心是Docker 官方的https://hub.docker.com五.Docker的优缺点1.优点简化配置构建一次后打包后就可以用作测试环境、生产环境或预生产环境,可以省去很多测试环节比如一台服务器可以进行多个版本的测试而不用等待解决部署难题可以解决开发人员部署环境的困难好比如一个刚来的新同事安装环境可能需要半天时间,但要是直接运行一个已经配好的容器的话就方便多了应用隔离一个服务器可以用docker部署多套业务并且隔离性很高(除了虚拟机)资源利用率可以减少资源的利用和虚拟机比较省去了很多不必要的资源扩容方便对于运维来说可以快速的进行扩容可以多平台部署2.缺点Docker运行环境的限制运行环境的限制Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用容器的guest系统只能是linux base的,因为制作每个镜像的时候,该镜像最底层都是一个微型的linux内核,在linux内核的基础上安装各种软件,部署应用系统,再将整个环境打包。所以每个镜像都可以看做是一个微型的linux系统隔离性隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库网络管理网络管理相对简单,主要是基于namespace隔离Docker对disk的管理比较有限容器随着用户进程的停止而销毁,容器中的log等用户数据不便收集