通过网盘分享的文件:MD文档笔记
链接: https://pan.baidu.com/s/1ao2wfyLEdN50YmIqdzfGYQ?pwd=5w5z 提取码: 5w5z
–来自百度网盘超级会员v6的分享

一.Docker简介

1.什么是Docker

Docker 是一个开源的应用容器引擎,是创建容器的工具

让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化

容器是完全使用沙箱机制,相互之间不会有任何接口

就像杯子可以装水、笔筒可以放笔、书包可以放书、可以把hello word放在docker中、可以把网站放入docker中、可以把任何想得到的程序放在docker中

Docker 从 17.03 版本之后分为 CE(Community Edition:社区版) 和 EE(Enterprise Edition:企业版)

官网: https://www.docker.com

2.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).超快的启动时间

传统的虚拟机技术启动应用一般需要数分钟

  1. 首先需要启动虚拟机
  2. 然后再加载虚拟机操作系统
  3. 最后还需要再手工启动应用

而 Docker 容器应用由于直接运行于宿主机系统中无需启动操作系统因此可以做到秒级、甚至毫秒级的启动

(4).更轻松的维护和扩展

Docker 公司及各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单

二.虚拟方式对比

1.虚拟机技术

(1).什么是虚拟技术

虚拟机就是带环境安装的一种解决方案

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

应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响

这类虚拟机完美的运行了另一套系统,能够使应用程序、操作系统和硬件三者之间的逻辑不变

在这里插入图片描述

(2).创建虚拟机过程

实现一台虚拟机要进行如下操作

  1. 首先需要一台物理机
  2. 在物理机上安装好操作系统比如windows或者linux操作系统
  3. 在操作系统上安装虚拟机软件
  4. 使用虚拟机软件虚拟一台或者多台虚拟机,虚拟化虚拟机时要分配给虚拟机硬件资源(比如一定量的内存、处理器、硬盘容量等)
  5. 在虚拟机上安装操作系统(比如CentOS、Ubuntu等)
  6. 再安装应用程序需要的各种软件(比如JDK、Maven、Tomcat、MySQL等)

这是在一台主机上部署一个程序就需要这些

如果在另一台主机上部署另一个程序或者在同一台主机上部署另一个程序,同样需要再创建一个虚拟机,然后再安装各种软件

这样的方式不仅会占用系统大量的资源,也会造成大量资源的浪费,因为在创建虚拟机时分配给虚拟机的内存就被这个虚拟机占用了,不管这个虚拟机实际使用了多少内存,这些内存都会被虚拟机占用着,同时大量重复这些操作也会相当的耗时,还容易出问题

2.Docker虚拟技术

(1).Docker虚拟技术

由于前面虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)

Docker 容器运行在 Docker 引擎之上,所有 Docker 容器共享同一个 Docker 引擎, 但它们的运行又是相互隔离、互不干扰的

由于 Docker 容器不需要进行虚拟硬件及操作系统,而是共享的宿主机的硬件与操作系统,所以 Docker 容器对系统资源的占用很少,仅包含运行时必须的一些资源

所有 Docker 容器对于系统资源的使用都是由 Docker 引擎统一进行管理,所以对系统资源的利用率很高,无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效

在这里插入图片描述

(2).Docker创建过程

使用Docker技术部署程序仅需做如下事情

  1. 首先需要一台物理机
  2. 在物理机上安装好操作系统,比如windows或者linux操作系统
  3. 在操作系统上安装Docker引擎
  4. 部署镜像生成容器

3.Windows 系统的虚拟化

(1).Hypervisor

Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件,也可叫做 VMM( virtual machine monitor )即虚拟机监视器

Hypervisors 是一种在虚拟环境中的"元"操作系统,他们可以访问服务器上包括磁盘和内存在内的所有物理设备

Hypervisors 不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护

当服务器启动并执行 Hypervisor 时,它会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存、CPU、网络和磁盘

(2).Hyper-V

在这里插入图片描述

Hyper-V 是微软的一款虚拟化产品,是微软第一个采用类似 Vmware ESXi 和 Citrix Xen 的基于 hypervisor 的技术,这也意味着微软会更加直接地与市场先行者 VMware 展开竞争,但竞争的方式会有所不同

Hyper-V 是微软提出的一种系统管理程序虚拟化技术,能够实现桌面虚拟化

Hyper-V 是微软提供的商业化的 Hypervisor

KVM 与 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(内核)

    • rootfs

      root文件系统

      包含的就是典型 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 Daemon

Docker Daemon(即 Dockerd、Docker 守护进程)监听着 Docker API 请求并管理 Docker对象

例如镜像、容器、网络和卷

守护进程还可以与其他守护进程通信以管理 Docker 服务

2.镜像 Image

镜像是用于创建Docker容器的模板(就像面向对象编程中的类),是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

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

Docker镜像就是一个只读的模板,镜像可以用来创建Docker容器

3.容器Container

Docker容器是镜像运行时的实体

就像面向对象编程中类的实例(一个类可以创建出 N多个实例,那么一个镜像同样也可以创建出N 多个容器)

它可以被启动、开始、停止、删除

每个容器都是相互隔离的、保证安全的平台

可以把容器看做是一个简易版的Linux环境,以及与运行在其中的应用程序打包而成的应用盒子

4.仓库 Repository

Docker仓库是集中存放镜像文件的场所

仓库服务器(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.镜像中心 Registry

Docker 的镜像中心中存放着很多由官方、其他机构或个人创建的 Docker 仓库

Docker用户可以直接从这些仓库中 pull 需要的镜像,也可以将自己制作的镜像 push 到 Docker 镜像中心相应的仓库中

最常用的镜像中心是Docker 官方的"https://hub.docker.com"

五.Docker的优缺点

1.优点

  1. 简化配置

    构建一次后打包后就可以用作测试环境、生产环境或预生产环境,可以省去很多测试环节

    比如一台服务器可以进行多个版本的测试而不用等待

  2. 解决部署难题

    可以解决开发人员部署环境的困难

    好比如一个刚来的新同事安装环境可能需要半天时间,但要是直接运行一个已经配好的容器的话就方便多了

  3. 应用隔离

    一个服务器可以用docker部署多套业务并且隔离性很高(除了虚拟机)

  4. 资源利用率

    可以减少资源的利用

    和虚拟机比较省去了很多不必要的资源

  5. 扩容方便

    对于运维来说可以快速的进行扩容

  1. 可以多平台部署

2.缺点

Docker运行环境的限制

  1. 运行环境的限制

    Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用

    容器的guest系统只能是linux base的,因为制作每个镜像的时候,该镜像最底层都是一个微型的linux内核,在linux内核的基础上安装各种软件,部署应用系统,再将整个环境打包。所以每个镜像都可以看做是一个微型的linux系统

  2. 隔离性

    隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库

  3. 网络管理

    网络管理相对简单,主要是基于namespace隔离

  1. Docker对disk的管理比较有限
  2. 容器随着用户进程的停止而销毁,容器中的log等用户数据不便收集
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐