一、Docker记忆

首先,分享一个docker资料《Docker从零基础到专家实战教程 》,下载地址:http://pan.baidu.com/s/1o8iKKFC 密码:of0z

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,一个容器可就是一个虚拟机,即一个进程就是一个虚拟机,轻量化实现虚拟化,且关键是容器性能开销极低,属轻量化虚拟化的分布式应用解决方案。Dockers可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台,应用于项目软件快速敏捷交付,更加效率便捷。

深入浅出docker 脚本之家下载 深入浅出docker 百度云_深入浅出docker 脚本之家下载

容器是完全使用沙箱机制,相互之间不会有任何接口;Docker通常用于如下场景:

1)web应用的自动化打包和发布;
2)自动化测试和持续集成、发布(CI/CD);
3)在服务型环境中部署和调整数据库或其他的后台应用;
4)从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

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

Docker 的优点:

1)Docker部署交付简单快捷:Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,Docker容器,只需要数秒就能部署完成,完成一键发布一键部署。方便快捷已经是 Docker的最大优势。
2)部署应用简单:Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。
3)节约且开支小:Docker改变了虚拟化的方式。改变了高性能必然高价格的常规。Docker与云的结合,可让云空间得到更充分的利用,切一台主机部署10000台虚拟机,实际往往实际部署800台左右,而docker作为进程,可完全实现10000台虚拟机,降低成本。

Docker 的局限性:

1)Docker是基于Linux 64bit 的,无法在32bit的linux/Windows/unix环境下使用
2)LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
3)隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
4)网络管理相对简单,隔离性不太好,主要是基于namespace隔离
5)cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
6)Docker对disk的管理比较有限
7)container随着用户进程的停止而销毁,container中的log等用户数据也随即不再被收集

二、Docker架构

深入浅出docker 脚本之家下载 深入浅出docker 百度云_客户端_02

● distribution 负责与docker registry交互,上传镜像以及v2 registry 有关的源数据
● registry负责docker registry有关的身份认证、镜像查找、镜像验证以及管理registry mirror等交互操作
● image 负责与镜像源数据有关的存储、查找,镜像层的索引、查找以及镜像tar包有关的导入、导出操作
● reference负责存储本地所有镜像的repository和tag名,并维护与镜像id之间的映射关系
● layer模块负责与镜像层和容器层源数据有关的增删改查,并负责将镜像层的增删改查映射到实际存储镜像层文件的graphdriver模块
● graghdriver是所有与容器镜像相关操作的执行者

2.1、Docker 两个主要部件:

Docker: 开源的容器虚拟化平台
Docker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平台 – Docker Hub

Docker 使用客户端-服务器 (C/S) 架构模式。 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。Docker 客户端会与 Docker 守护进程进行通信,客户端和服务端既可以运行在一个机器上。。Docker 守护进程会处理复杂繁重的任务,例如建立、运行、发布你的 Docker 容器。Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker 客户端去连接一个远程的 Docker 守护进程。Docker 客户端和守护进程之间通过 socket 或者 RESTful API 进行通信。

深入浅出docker 脚本之家下载 深入浅出docker 百度云_dockerfile_03

1、docker daemon(dockerd)

docker daemon是docker server常驻的后台程序,处理数据请求。docker server就是后台程序docker接受数据请求,然后交给route,路由给指定的容器,然后handler处理请求信息数据(区分数据就是区分头部信息的类型,我请求的是什么类型的数据就去不同的服务器),然后交给docker engine,形成要执行的job任务下发给相关组件。比如,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。

Daemon进程(dockerd)会常驻监听Docker API的请求,并管理 images, containers, networks, 和volumes等对象。且docker守护进程还可以与其他守护进程通信以管理 Docker 服务。

深入浅出docker 脚本之家下载 深入浅出docker 百度云_深入浅出docker 脚本之家下载_04

2、Graph驱动模块(docker engine):

需要对任务处理,处理docker engine需要从网上下载镜像,或者从本地拉取镜像,保存在本地的叫graph,graph分成两个部分,graphDB用来存储镜像之间的存储关系,graph images 用来存储镜像的。

Repostitory(仓库):下载的镜像保存,

GraphDB :容器与镜像关系的记录。

镜像是不同层的文件组合,如果镜像相同的层有很多,只会合并成一份,如果有百度云盘,所有保存的电影其实在百度云上就一部。

3、Driver模块:

定制容器的环境,如:cpu多少,内存多少,硬盘多少,容器的生命后期根据程序的生命周期决定,运行什么驱动什么,从而提高容器运行的效率。驱动分为三个部分进行驱动,第一个驱动是物理机启动时需要哪些目录结构,镜像所需要的目录结构,他直接启动的是rootfs,然后启动的是网路结构,networkdriver,让容器和物理机能连接起来,

bridge:启动容器后会出现docker0,关闭后就会消失,真正通讯是容器桥接到docker0,相当于一个路由,然后在将docker0 桥接到物理网卡上。驱动对容器里边的东西进行驱动,IP network interface port

execdriver 执行驱动:主要驱动不容系统里的namespaces和cgroup,最总把这个六个选项启动,开启了一个容器,然后在rootfs里打开一个容器。

driver模块的好处是需要什么驱动什么,提高容器运行的效率;

(1)graphdriver主要用于完成镜像的管理,存储,读取,下载下来的镜像的存储也是他,驱动存储镜像

驱动不同的操作系统有不同的文件系统管理,

driver存储结构:

btrfs-deban

vfs-centos

aufs-ubuntu

devmapper-gm

(2)networkdriver

bridge 桥接到docker0上,直接进到物理机上。把容器和桥接到docker0,然后通过docker 0 转给容器,只要放到物理机上就好。

networkif 防火墙,路由等

ip 地址

port 端口

属于容器内部操作,放到container上就行。

(3)execdriver

execdriver 容器的执行驱动,负责容器在创建空间是的命名规则和容器资源限制,native一共有两个分支,LXC (1.2版本以前) native(1.2以后)跨平台用,依赖于native ,可以控制任何一个操作系统上都可以分割namespace空间和cgroup结构,

(4)libcontainer模块

正是由于libcontainer的存在,Docker可以直接调用libcontainer,而最终操纵容器的namespace、cgroups、apparmor、网络设备以及防火墙规则等,libcontainer可以看作是一个独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。

(5)container模块

Docker container(Docker容器)是Docker架构中服务交付的最终体现形式

(6)rootfs模块

docker的目录结构

4、docker客户端

Docker 客户端 (docker) 是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如 docker run 之类的命令时,客户端会将这些命令发送到 dockerd,后者会执行这些命令。 docker 命令使用 Docker API。 Docker 客户端可以与多个守护进程通信。

深入浅出docker 脚本之家下载 深入浅出docker 百度云_深入浅出docker 脚本之家下载_05


工作原理:在Docker C/S架构中,Docker 客户端与 Docker 守护进程(dockerd)交互,后者负责构建、运行和分发 Docker 容器的繁重工作。两者既可以运行在同一宿主,也可分布在不同主机上;Docker client 和daemon是借助宿主底层 UNIX sockets和网络通过 REST API来完成交互;对于Docker Compose这个docker客户端,可以帮我我们通过一组应用组合打包成一个containers。当客户端发出请求,daemon 接收到创建新容器的命令时,它就会向 containerd 发出调用,daemon 使用一种 CRUD 风格的 API,通过 gRPC 与 containerd 进行通信,但 containerd并不负责创建容器,而是指挥 runc 去做。containerd 将 Docker 镜像转换为 OCI bundle,并让 runc 基于此创建一个新的容器。然后,runc 与操作系统内核接口进行通信,基于所有必要的工具(Namespace、CGroup等)来创建容器。容器进程作为 runc 的子进程启动,启动完毕后,runc 将会退出。一旦容器进程的父进程 runc 退出,相关联的 containerd-shim 进程就会成为容器的父进程。当 daemon 重启的时候,容器不会终止,并且可以将容器的退出状态反馈给 daemon。

深入浅出docker 脚本之家下载 深入浅出docker 百度云_dockerfile_06

三、Docker概念

1、Docker 客户端:

实际上是 docker 的二进制程序,是主要的用户与 Docker 交互方式。它接收用户指令并且与背后的 Docker 守护进程通信,如此来回往复。

2、Docker 守护进程:

Docker 守护进程运行在一台主机上。用户并不直接和守护进程进行交互,而是通过 Docker 客户端间接和其通信。

3、Docker 内部构建:

Docker 镜像 (Docker images)、Docker 仓库 (Docker registeries)、Docker 容器 (Docker containers)

深入浅出docker 脚本之家下载 深入浅出docker 百度云_docker_07

Docker 镜像(image)

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新 的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

Docker 仓库(repository)

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

Docker 容器(container)

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。

但Linux系统中的“containers”并实际不是真实存在的。在Linux中,没有叫做“container”(容器)的实体。所说的容器,其实是依托于Linux的两个特性而运行的正常的系统进程,这两个特性是命名空间cgroups。命名空间提供对于某个进程的一种“视图”,可以将其它命名空间的东西隐藏,从而为该进程提供它自己独立运行的环境。这使得进程之间互相不可见,也不可相互影响。

  1. 命名空间
  2. cgroups: (Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。简单说,cgroups 可以限制、记录任务组所使用的物理资源。本质上来说,cgroups 是内核附加在程序上的一系列钩子(hook),通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。

实现 cgroups 的主要目的是为不同用户层面的资源管理提供一个统一化的接口。从单个任务的资源控制到操作系统层面的虚拟化,cgroups 提供了四大功能:

资源限制:cgroups 可以对任务所要的资源总额进行限制。比如设定任务运行时使用的内存上限,一旦超出就发 OOM。
优先级分配:通过分配的 CPU 时间片数量和磁盘 IO 带宽,实际上就等同于控制了任务运行的优先级。
资源统计:cgoups 可以统计系统的资源使用量,比如 CPU 使用时长、内存用量等。这个功能非常适合当前云端产品按使用量计费的方式。
任务控制:cgroups 可以对任务执行挂起、恢复等操作。

Task(任务) 在 linux 系统中,内核本身的调度和管理并不对进程和线程进行区分,只是根据 clone 时传入的参数的不同来从概念上区分进程和线程。这里使用 task 来表示系统的一个进程或线程。Cgroup(控制组) cgroups 中的资源控制以 cgroup 为单位实现。Cgroup 表示按某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个 cgroup,也可以从某个 cgroup 迁移到另一个 cgroup。

Subsystem(子系统) 是一个资源调度控制器(又叫 controllers)。比如 CPU 子系统可以控制 CPU 的时间分配,内存子系统可以限制内存的使用量。支持的 subsystem 可通过cat /proc/cgroups查看:

深入浅出docker 脚本之家下载 深入浅出docker 百度云_docker_08


其中,说明如下:

blkio 对块设备的 IO 进行限制。
cpu 限制 CPU 时间片的分配,与 cpuacct 挂载在同一目录。
cpuacct 生成 cgroup 中的任务占用 CPU 资源的报告,与 cpu 挂载在同一目录。
cpuset 给 cgroup 中的任务分配独立的 CPU(多处理器系统) 和内存节点。
devices 允许或禁止 cgroup 中的任务访问设备。
freezer 暂停/恢复 cgroup 中的任务。
hugetlb 限制使用的内存页数量。
memory 对 cgroup 中的任务的可用内存进行限制,并自动生成资源占用报告。
net_cls 使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包,并进行网络限制。
net_prio 允许基于 cgroup 设置网络流量(netowork traffic)的优先级。
perf_event 允许使用 perf 工具来监控 cgroup。
pids 限制任务的数量。

4、libcontainer:

Docker 从 0.9 版本开始使用 libcontainer 替代 lxc,libcontainer 和 Linux 系统的交互图如下:

深入浅出docker 脚本之家下载 深入浅出docker 百度云_客户端_09

5、命名空间(Namespaces):

Docker充分利用了一项称为namespaces的技术来提供隔离的工作空间,我们称之为 container(容器)。当你运行一个容器的时候,Docker为该容器创建了一个命名空间集合。每一个应用在它们自己的命名空间中运行而且不会访问到命名空间之外。不同用户的进程就是通过 pid namespace 隔离开的,且不同 namespace 中可以有相同 PID。具有以下特征:

1)每个 namespace 中的 pid 是有自己的 pid=1 的进程(类似 /sbin/init 进程)
2)每个 namespace 中的进程只能影响自己的同一个 namespace 或子 namespace 中的进程
3)因为 /proc 包含正在运行的进程,因此在 container 中的 pseudo-filesystem 的 /proc 目录只能看到自己 namespace 中的进程
4)因为 namespace 允许嵌套,父 namespace 可以影响子 namespace 的进程,所以子 namespace 的进程可以在父 namespace 中看到,但是具有不同的 pid。

Docker使用到的命名空间有:

pid命名空间: 使用在进程隔离(PID: Process ID)。
net命名空间: 使用在管理网络接口(NET: Networking)。
ipc命名空间: 使用在管理进程间通信资源 (IPC: InterProcess Communication)。
mnt命名空间: 使用在管理挂载点 (MNT: Mount)。
uts命名空间: 使用在隔离内核和版本标识 (UTS: Unix Timesharing System)。

深入浅出docker 脚本之家下载 深入浅出docker 百度云_深入浅出docker 脚本之家下载_10

mnt namespace

类似 chroot,将一个进程放到一个特定的目录执行。mnt namespace 允许不同 namespace 的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个 namespace 中的 container 在 /proc/mounts 的信息只包含所在 namespace 的 mount point。

net namespace

网络隔离是通过 net namespace 实现的, 每个 net namespace 有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个 container 的网络就能隔离开来。 docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的一个 docker bridge 连接在一起。

深入浅出docker 脚本之家下载 深入浅出docker 百度云_docker_11

uts namespace

UTS (“UNIX Time-sharing System”) namespace 允许每个 container 拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。

ipc namespace

container 中进程交互还是采用 Linux 常见的进程间交互方法 (interprocess communication - IPC), 包括常见的信号量、消息队列和共享内存。然而同 VM 不同,container 的进程间交互实际上还是 host 上具有相同 pid namespace 中的进程间交互,因此需要在IPC资源申请时加入 namespace 信息 - 每个 IPC 资源有一个唯一的 32bit ID。

user namespace

每个 container 可以有不同的 user 和 group id, 也就是说可以以 container 内部的用户在 container 内部执行程序而非 Host 上的用户。

有了以上 6 种 namespace 从进程、网络、IPC、文件系统、UTS 和用户角度的隔离,一个 container 就可以对外展现出一个独立计算机的能力,并且不同 container 从 OS 层面实现了隔离。 然而不同 namespace 之间资源还是相互竞争的,仍然需要类似 ulimit 来管理每个 container 所能使用的资源 - cgroup。

参考地址:https://ruby-china.org/topics/22004

6、资源配额「cgroups」

cgroups 实现了对资源的配额和度量。 cgroups 的使用非常简单,提供类似文件的接口,在 /cgroup 目录下新建一个文件夹即可新建一个 group,在此文件夹中新建 task 文件,并将 pid 写入该文件,即可实现对该进程的资源控制。具体的资源配置选项可以在该文件夹中新建子 subsystem ,{子系统前缀}.{资源项} 是典型的配置方法, 如 memory.usageinbytes 就定义了该 group 在 subsystem memory 中的一个内存限制选项。 另外,cgroups 中的 subsystem 可以随意组合,一个 subsystem 可以在不同的 group 中,也可以一个 group 包含多个 subsystem - 也就是说一个 subsystem。

memory:内存相关的限制
cpu:在 cgroup 中,并不能像硬件虚拟化方案一样能够定义 CPU 能力,但是能够定义 CPU 轮转的优先级,因此具有较高 CPU 优先级的进程会更可能得到 CPU 运算。 通过将参数写入 cpu.shares ,即可定义改 cgroup 的 CPU 优先级 - 这里是一个相对权重,而非绝对值
blkio:block IO 相关的统计和限制,byte/operation 统计和限制 (IOPS 等),读写速度限制等,但是这里主要统计的都是同步 IO
devices:设备权限限制

7、Dockerfile文件

Dockerfile 作为一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,Docker通过读取Dockerfile中的指令来自动生成映像。Dockerfile中的每条指令都会创建一个新的镜像层,如下所示:

深入浅出docker 脚本之家下载 深入浅出docker 百度云_docker_12


以下是一个Nginx容器镜像的分层:

第⑥层:container容器层——可读可写——运行image镜像——需要CMD、entrypoint来启动用(定义:nginx -g daemon off / run.sh)
第⑤层:调整配置文件——镜像层4——run sed -i /usr/local/nginx/conf/nginx.conf
第④层:配置编译安装——./configure && make&&make install——镜像层3——run cd /opt/nginx-1.12.0
第③层:安装依赖环境——yum install gcc gcc-c++ make -y——镜像层2——run yum install——yum install gd-devel
第②层:解压nginx软件包——镜像层1——run tar
第①层:指定安装特定操作系统作为——base image(基础镜像)

Docker镜像位于bootfs之上,每一层镜像是下一层的父镜像,第一层镜像:base image ( 操作系统环境镜像),最顶层writable容器层:可读可写,中间容器层以下都是readonly。

我们可使用docker build命令从Dockerfile读取指令构建创建容器的映像。Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,其中,’#’ 为 Dockerfile 中的注释。Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以应避免过多无意义的层,造成镜像膨胀过大。

可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

docker build -f /path/to/a/Dockerfile

Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。Dockerfile常用指令:

深入浅出docker 脚本之家下载 深入浅出docker 百度云_Docker_13


Dockerfile文件语法:

#指定基础镜像,FROM必须为第一个命令,tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
#维护者信息
MAINTAINER <name>
#RUN:构建镜像时,在镜像容器中执行的命令,RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定--no-cache参数,如:docker build --no-cache。RUN有两种命令执行方式:
##1)shell执行格式:
RUN <command>
##2)exec执行格式:
RUN ["executable", "param1", "param2"]
##示例:
    RUN ["executable", "param1", "param2"]
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
#ADD:用于将本地文件添加到容器中,压缩格式为 gzip, bzip2 以及 xz 的类型文件会自动解压(网络压缩资源不会被解压),也可以访问网络资源,类似wget;格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] #用于支持包含空格的路径
#示例:多用 COPY
    ADD hom* /mydir/          # 添加所有以"hom"开头的文件
    ADD hom?.txt /mydir/      # ? 替代**一个单字符**,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 /relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
#COPY:功能类似ADD,从上下文目录中复制文件或者目录到容器里指定路径。但是是不会自动解压文件,也不能访问网络资源;[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。<源路径>:源文件或者源目录,这里可以是通配符表达式;<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。命令格式:
COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]
## 示例:
COPY hom* /mydir/   #复制以"hom"开头的文件到容器内/mydir/
COPY hom?.txt /mydir/

8、Union FS

联合文件系统(UnionFS):它是一种为 Linux 操作系统设计的用于把多个文件系统联合到同一个挂载点的文件系统服务。而 AUFS 即 Advanced UnionFS 其实就是 UnionFS 的升级版,它能够提供更优秀的性能和效率。OverlayFS 也是一种与 AUFS 类似的联合文件系统,同样属于文件级的存储驱动,包含了最初的Overlay 和更新更稳定的 overlay2。Overlay 只有两层:upper 层和 Lower 层。Lower 层代表镜像层,upper 层代表容器可写层。Docker 支持了不同的存储驱动,包括 aufs、devicemapper、overlay2、zfs 和 vfs 等等,在最新的 Docker 中,overlay2 取代了 aufs 成为了推荐的存储驱动,但是在没有 overlay2 驱动的机器上仍然会使用 aufs 作为 Docker 的默认驱动。

深入浅出docker 脚本之家下载 深入浅出docker 百度云_Docker_14

四、附录:《Docker命名官方文档》

3.1、版本说明

官网有docker desktop和docker engine两种;Docker Engine 是 Docker 官方维护的开源版本,它为所有用户提供一致的体验。Docker-ce 是 Docker 公司维护的社区版本,它在 Docker Engine 的基础上增加了额外的功能和支持,例如商业支持和企业级功能。

…………未完待整理