龙空技术网

程序员在4个操作系统内的几种安装Docker的方式,学会它,事半功倍

程序员爱学习 449

前言:

眼前大家对“联想e75装win7鼠标不动”大致比较关注,各位老铁们都需要知道一些“联想e75装win7鼠标不动”的相关资讯。那么小编在网络上汇集了一些有关“联想e75装win7鼠标不动””的相关资讯,希望看官们能喜欢,姐妹们一起来了解一下吧!

Docker安装

有很多种方式和场景可以安装Docker。Docker可以安装在Windows、Mac,当然还有Linux之上。除此之外还可以在云上安装,也可以在个人笔记本电脑上安装,诸如此类的例子有很多。除了前面提到的各种安装场景之外,读者还可以选择不同方式完成Docker安装,包括手工安装、通过脚本方式安装和通过向导方式安装等。安装Docker的场景和方式简直是数不胜数。

但是不要害怕!上面提到的Docker的安装其实都很简单。

本文主要介绍了几种重要的安装方式。

桌面安装。Windows版Docker(Docker for Windows)。Mac版Docker(Docker for Mac)。服务器安装。Linux。Windows Server 2016。Docker引擎升级。Docker存储驱动的选择。

也会涉及Docker引擎的升级以及如何选择合适的存储驱动等内容。

3.1 Windows版Docker(DfW)

在了解Windows版Docker之前,读者首先要知道这是由Docker公司提供的一个产品。这意味着它易于下载,并且有一个很灵活的安装器(installer)。Windows版Docker需要运行在一个安装了64位Windows 10操作系统的计算机上,通过启动一个独立的引擎来提供Docker环境。

其次,读者需要知晓Windows版Docker是一个社区版本(Community Edition,CE)的应用,并不是为生产环境设计的。

最后,读者还需要知道Windows版Docker在某些版本特性上可能是延后支持的。这是因为Docker公司对该产品的定位是稳定性第一,新特性其次。

以上3点被添加到Windows版Docker这个安装快捷简单,但并不支持生产环境部署的产品当中。

闲话少说,接下来请读者跟随本书一起了解一下如何安装Windows版Docker。

在安装之前,Windows版Docker的环境有以下要求。

Windows 10 Pro / Enterprise / Education(1607 Anniversary Update、Build 14393或者更新的版本)。Windows必须是64位的版本。需要启用Windows操作系统中的Hyper-V和容器特性。

接下来的步骤会假设读者的计算机已经开启了BIOS设置中的硬件虚拟化支持。如果没有开启,读者需要在机器上执行下面的步骤。

首先,读者需要确认在Windows 10操作系统中,Hyper-V和容器特性已安装并且开启。

(1)右键单击Windows开始按钮并选择“应用和功能”页面。

(2)单击“程序和功能”链接。

(3)单击“启用或关闭Windows功能”。

(4)确认Hyper-V和容器复选框已经被勾选,并单击确定按钮。

按上述步骤操作完成后,会安装并开启Hyper-V和容器特性,如图3.1所示。读者需要重启操作系统。

图3.1 开启Hyper-V和容器特性

其中,容器特性只有在summer 2016 Windows 10 Anniversary Update(build 14393)版本或更高版本上才能开启。

当读者完成Hyper-V和容器特性的安装并重启机器之后,就可以安装Windows版Docker了。

(1)访问Docker的下载页面,并单击其中的Download for Windows按钮。

(2)单击后会跳转到Docker商店,需要读者使用自己的Docker ID进行登录。

(3)单击任意Get Docker下载链接。Docker for Windows分为稳定版(Stable)和抢鲜版(Edge)。抢鲜版当中包含一些新特性,但是可能不够稳定。单击下载链接后,会将名为Docker for Windows Installer.exe的安装包下载到默认下载目录。

(4)找到上一步下载的安装包并运行即可。

以管理员身份运行安装向导,并按照提示一步一步完成整个安装过程。安装完成后Docker会作为系统服务自动启动,并且在Windows的通知栏看到Docker的大鲸鱼图标。

恭喜!到目前为止已经成功完成Windows版Docker的安装。

打开命令行或者PowerShell界面,并尝试执行下面的命令。

Client: Version: 18.01.0-ce API version: 1.35 Go version: go1.9.2 Git commit: 03596f5 Built: Wed Jan 10 20:05:55 2018 OS/Arch: windows/amd64 Experimental: false Orchestrator: swarmServer: Engine: Version: 18.01.0-ce API version: 1.35 (minimum version 1.12) Go version: go1.9.2 Git commit: 03596f5 Built: Wed Jan 10 20:13:12 2018 OS/Arch: linux/amd64 Experimental: false

注意观察命令输出内容,其中Server部分中的OS/Arch属性展示了当前的操作系统是linux/amd64。这是因为在默认安装方式中,Docker daemon是运行在Hyper-V虚拟机中的一个轻量级Linux上的。这种情况下,读者只能在Windows版Docker上运行Linux容器。

如果读者想要运行原生Windows容器(Native Windows Container),可以右击Windows通知栏中的Docker鲸鱼图标,并选择“切换到Windows容器”。使用下面的命令也可以完成切换(进入\Program Files\Docker\Docker目录下执行)。

C:\Program Files\Docker\Docker> .\dockercli -SwitchDaemon

如果没有开启Windows容器特性,则会看到图3.2的提示。

图3.2 没有开启Windows容器特性的提示

如果已经开启了Windows容器特性,则只需要花费数秒就能完成切换。一旦切换完成,在命令行中执行docker version指令的输出内容如下。

C:\> docker versionClient: <Snip>Server: Engine: Version: 18.01.0-ce API version: 1.35 (minimum version 1.24) Go version: go1.9.2 Git commit: 03596f5 Built: Wed Jan 10 20:20:36 2018 OS/Arch: windows/amd64 Experimental: true

可以看到,现在Server版本信息变成了windows/amd64。这意味着Docker daemon运行在原生Windows内核上,并且只能运行Windows容器了。

同时也可以发现,Experimental这个属性的值为true。这表示当前运行的Docker版本是实验版本。本章前面提到,Docker for Windows有两个版本:稳定版和抢鲜版。在本书编写的过程中,Windows容器是抢鲜版中的一个实验特性。

读者可以通过运行dockercli -Version命令来查看当前的Docker版本。dockercli命令在C:\Program Files\Docker\Docker目录下。

PS C:\Program Files\Docker\Docker> .\dockercli -VersionDocker for WindowsVersion: 18.01.0-ce-win48 (15285)Channel: edgeSha1: ee2282129dec07b8c67890bd26865c8eccdea88eOS Name: Windows 10 ProWindows Edition: ProfessionalWindows Build Number: 16299

下面展示了一些常用的能够正常执行的Docker命令。

> docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE> docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES> docker system infoContainers: 1 Running: 0 Paused: 0 Stopped: 1Images: 6Server Version: 17.12.0-ceStorage Driver: windowsfilter<Snip>

Windows版Docker包括Docker引擎(客户端和daemon)、Docker Compose、Docker Machine以及Docker Notary命令行。通过下列命令确认各个模块已经成功安装。

C:\> docker --versionDocker version 18.01.0-ce, build 03596f5C:\> docker-compose --versiondocker-compose version 1.18.0, build 8dd22a96C:\> docker-machine --versiondocker-machine.exe version 0.13.0, build 9ba6da9C:\> notary versionnotary Version: 0.4.3 Git commit: 9211198
3.2 Mac版Docker(DfM)

Mac版Docker也是由Docker公司提供的一个产品。读者大可以放心使用Docker,而无须先成为一个内核工程师,也不必通过很极客的方法将Docker安装到Mac。DfM的安装方式特别简单。

Mac版Docker是由Docker公司基于社区版的Docker提供的一个产品。这意味着在笔记本上安装单引擎版本的Docker是非常简单的。但是同时,这也意味着Mac版Docker并不是为生产环境而设计的。如果读者听说过boot2docker,那么Mac版Docker就是一个流畅、简单并且稳定版的boot2docker。

对于Mac版Docker来说,提供基于Mac原生操作系统中Darwin内核的Docker引擎没有什么意义。所以在Mac版Docker当中,Docker daemon是运行在一个轻量级的Linux VM之上的。Mac版Docker通过对外提供daemon和API的方式与Mac环境实现无缝集成。这意味着读者可以在Mac上打开终端并直接使用Docker命令。

尽管在Mac上实现了无缝集成,还是要谨记Mac版Docker底层是基于Linux VM运行的,所以说Mac版Docker只能运行基于Linux的Docker容器。不过这样已经很好了,因为大部分容器实际上都是基于Linux的。

图3.3展示了Mac版Docker的抽象架构。

图3.3 Mac版Docker的抽象架构

注:

Mac版Docker采用HyperKit9实现了一个极其轻量级的Hypervisor。HyperKit是基于Xhyve Hypervisor的。Mac版Docker也利用了DataKit的某些特性,并运行了一个高度优化后的Linux发行版Moby(基于Alpine Linux)。

接下来开始安装Mac版Docker。

(1)打开浏览器,访问Docker的下载页面,然后单击Download for Mac按钮。

(2)页面会跳转到Docker商店,需要读者使用自己的Docker ID和密码进行登录。

(3)单击下载链接Get Docker CE。

Mac版Docker分为两个版本:稳定版(Stable)和抢鲜版(Edge)。抢鲜版包含一些新特性,但是并不保证稳定运行。

单击链接后,会下载Docker.dmg安装包。

(4)运行上一步中下载的Docker.dmg文件。将代表Docker的鲸鱼图标拖拽到应用文件夹(Application folder)中。

(5)打开应用文件夹(可能会自动打开)并且双击Docker应用图标来启动Docker。读者可能需要确认是否运行,因为这是从互联网下载的应用程序。

(6)输入Mac用户密码,这样安装程序可以获取到创建组件所需的权限。

(7)Docker daemon进程启动。

一个活动的鲸鱼图标会在屏幕上方状态栏中出现。一旦Docker成功运行,鲸鱼图标就静止了。读者可以单击鲸鱼图标来管理DfM。

DfM现在已经安装完成,读者可以打开一个终端,并运行一些常用的Docker指令。尝试运行下面的命令。

$ docker versionClient: Version: 17.05.0-ce API version: 1.29 Go version: go1.7.5 Git commit: 89658be Built: Thu May 4 21:43:09 2017 OS/Arch: darwin/amd64Server: Version: 17.05.0-ce API version: 1.29 (minimum version 1.12) Go version: go1.7.5 Git commit: 89658be Built: Thu May 4 21:43:09 2017 OS/Arch: linux/amd64 Experimental: true

注意,Server的OS/Arch属性中显示的值是linux/amd64。这是因为daemon是基于前文提到过的Linux VM运行的。

Client组件是原生的Mac应用,运行在Mac操作系统Darwin内核之上(OS/Arch: darwin/amd64)。

除此之外,还需要注意当前Docker版本是一个实验性质的版本(Experimental: true)。这是因为它是抢鲜版,抢鲜版中开启了一些实验特性。

运行其他Docker命令。

$ docker --versionDocker version 17.05.0-ce, build 89658be$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE$ docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

Mac版Docker安装了Docker引擎(客户端以及服务端守护程序)、Docker Compose、Docker machine以及Notary命令行。下面的3条命令向读者展示了如何确认这些组件是否成功安装,以及组件的版本信息。

$ docker --versionDocker version 17.05.0-ce, build 89658be$ docker-compose --versiondocker-compose version 1.13.0, build 1719ceb$ docker-machine --versiondocker-machine version 0.11.0, build 5b27455$ notary versionnotary Version: 0.4.3 Git commit: 9211198
3.3 在Linux上安装Docker

在Linux上安装Docker是常见的安装场景,并且安装过程非常简单。通常难点在于Linux不同发行版之间的轻微区别,比如Ubuntu和CentOS之间的差异。本书接下来的示例基于Ubuntu版本Linux,同样适用于更低或者更高的版本。理论上,下面的示例在CentOS的各种版本上也是可以执行的。至于读者的Linux操作系统是安装在自己的数据中心,还是第三方公有云,或是笔记本的虚拟机上,都没有任何的区别。唯一需求就是这台机器是Linux操作系统,并且能够访问。

首先读者需要选择安装的Docker版本。当前有两个版本可供选择:社区版(Community Edition,CE)和企业版(Enterprise Edition,EE)。

Docker CE是免费的,并且是接下来示例中将要使用的版本。Docker EE包含Docker CE中的全部功能,还包括了商业支持以及与其他Docker产品的集成,比如Docker可信镜像库和通用控制面板。

下面的例子使用wget命令来运行一个Shell脚本,完成Docker CE的安装。更多其他在Linux上安装Docker的方式,可以打开Docker主页面,单击页面中Get Started按钮来获取。

注:

在开始下面的步骤之前,要确认系统升级到最新的包,并且打了相应的安全补丁。

(1)在Linux机器上打开一个新的Shell。

(2)使用wget从获取并运行Docker安装脚本,然后采用Shell中管道(pipe)的方式来执行这个脚本。

$ wget -qO-  | shmodprobe: FATAL: Module aufs not found /lib/modules/4.4.0-36-generic+ sh -c 'sleep 3; yum -y -q install docker-engine'<Snip>If you would like to use Docker as a non-root user, you should now consider adding your user to the "docker" group with something like:sudo usermod -aG docker your-userRemember that you will have to log out and back in...

(3)最好通过非root用户来使用Docker。这时需要添加非root用户到本地Docker Unix组当中。下面的命令展示了如何把名为npoulton的用户添加到Docker组中,以及如何确认操作是否执行成功。请读者自行使用系统中的有效用户。

$ sudo usermod -aG docker npoulton$ cat /etc/group | grep dockerdocker:x:999:npoulton

如果读者当前登录用户就是要添加到Docker组中的用户的话,则需要重新登录,组权限设置才会生效。

恭喜!Docker已经在读者的Linux机器上安装成功。运行下面命令来确认安装结果。

$ docker --versionDocker version 18.01.0-ce, build 03596f5$ docker system infoContainers: 0 Running: 0 Paused: 0 Stopped: 0Images: 0Server Version: 18.01.0-ceStorage Driver: overlay2 Backing Filesystem: extfs<Snip>

如果上述步骤在读者自己的Linux发行版中无法成功执行,可以访问Docker Docs网站并单击与自己的版本相关的那个链接。接下来页面会跳转到Docker官方提供的适合当前版本的安装指南页面,这个安装指南通常会保持更新。但是需要注意,Docker网站上提供的指令使用了包管理器,相比本书前面的例子需要更多的步骤才能完成安装操作。实际上,如果读者使用浏览器打开网页,会发现这其实就是一个Shell脚本,脚本中已经帮读者定义好了安装相关的指令,包括设置Docker为系统开启自启动。

警告:

如果读者未从官方Docker仓库下载源码,则最终安装的可能是Docker的一个复制版本。过去一些Linux发行商选择复制了Docker的代码,并基于此开发了一些定制化的版本。读者需要注意类似的情况,因为运行一个与Docker官方版本不同的复制版,可能遇到异常退出的情况。如果读者本意就是采用该版本运行,那这不是问题。但是如果读者本意并非如此,复制版本中发行商提交的一些改动可能导致其版本无法与Docker官方版本相兼容。这样就无法从Docker公司或者Docker公司授权的合作伙伴那里获得商业支持。

3.4 在Windows Server 2016上安装Docker

本小节主要介绍在Windows Servre 2016上安装Docker的方法。主要包括以下步骤。

(1)安装Windows容器功能(Windows Container Feature)。

(2)安装Docker。

(3)确认安装成功。

在开始安装之前,读者需要确保操作系统已经更新了最新版本的包以及安全补丁。读者可以通过运行sconfig命令,并选择选项6来快速完成更新的安装。安装更新可能需要重启系统。

接下来本书会在没有安装容器功能(Container Feature)或者已经安装了老版本Docker的Windows Server 2016上进行演示。

确保容器特性已经安装并且启用。

(1)鼠标右击Windows开始按钮,选择“应用和功能”,接下来会打开“应用和功能”面板。

(2)单击“启用或关闭Windows功能”,接下来会打开“服务器管理器”。

(3)确认面板处于选中状态,然后选择“添加角色和功能”。

(4)根据向导提示执行,直到进入“功能”页面。

(5)确保“容器”功能已经勾选,然后单击向导的“完成”按钮。完成之后需要重启操作系统。

现在已经完成Windows容器功能的安装,接下来可以安装Docker了。本书中采用PowerShell完成安装。

(1)以管理员身份运行PowerShell。

(2)运行下面的命令来安装Docker包管理工具。

> Install-Module DockerProvider -Force

如果出现提示,单击允许(Accept)按钮完成NuGet provider的安装。

(3)安装Docker。

> Install-Package Docker -ProviderName DockerProvider -Force

一旦安装完成,读者可以看到下面的内容。

Name Version Source Summary---- ------- ------ -------Docker 17.06.2-ee-6 Docker Docker for Windows Server 2016

现在Docker已经完成安装,并且设置为开机自启动。

(4)读者可能希望重启系统来确认Docker的安装没有对系统启动造成任何影响。此外在重启之后,可以检查Docker是否自动启动。

Docker现在已经安装成功,读者可以开始部署容器了。下面的命令是确认Docker安装成功的方法。

> docker --versionDocker version 17.06.2-ee-6, build e75fdb8> docker system infoContainers: 0 Running: 0 Paused: 0 Stopped: 0Images: 0Server Version: 17.06.2-ee-6Storage Driver: windowsfilter<Snip>

Docker现在已经完成安装,读者可以开始运行Windows容器了。

3.5 Docker引擎(Engine)升级

升级Docker引擎(Engine)是一项重要的任务,尤其是生产环境。本节中会向读者介绍升级Docker引擎的关键步骤,以及一些相关的小建议和升级示例。

升级Docker引擎的关键步骤如下。

需要重视升级操作的每个前置条件,包括确保容器配置了正确的重启策略;在Swarm Mode模式下使用服务时,需要确保正确配置了draining node。当完成了上述前置条件的检查之后,可以通过如下步骤完成升级操作。

(1)停止Docker守护程序。

(2)移除旧版本Docker。

(3)安装新版本Docker。

(4)配置新版本的Docker为开机自启动。

(5)确保容器重启成功。

上面就是全部的关键步骤。下面本书通过具体例子来进行介绍。

不同版本的Linux在升级Docker的时候,命令可能略有区别。本书中以Ubuntu 16.04和Windows Server 2016作为例子进行介绍。

3.5.1 在Ubuntu 16.04上升级Docker CE

本书假设读者已经完成了全部的升级前置步骤并且Docker处于可以升级的状态,同时还可以用root用户身份运行升级命令。以root用户运行升级命令是不推荐的,但是可以简化本书中的示例。如果读者不采用root用户运行升级命令,那最好不过了!那么需要通过sudo来执行下列指令。

(1)更新APT包列表。

$ apt-get update

(2)卸载当前Docker。

$ apt-get remove docker docker-engine docker-ce docker.io -y

在之前的版本中,Docker引擎的包名可能有多个。这条命令能够确保已经安装的Docker包全部被删除。

(3)安装新版本Docker。

有不同版本的Docker可供选择,并且有多种方式可以安装Docker。无论是Docker CE还是Docker EE,都有不止一种安装方式。例如,Docker CE可以通过apt或者deb包管理方式进行安装,也可以使用Docker官网上的脚本。

接下来的命令会使用get.docker.com的脚本完成最新版本Docker CE的安装和配置。

$ wget -qO-  | sh

(4)将Docker配置为开机自启动。

$ systemctl enable dockerSynchronizing state of docker.service...Executing /lib/systemd/systemd-sysv-install enable docker$ systemctl is-enabled dockerenabled

此时读者可能想重启自己的节点。这样可以确保刚安装的Docker不会对系统开机有任何的影响。

(5)检查并确保每一个容器和服务都已经重启成功。

$ docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS97e599aca9f5 alpine "sleep 1d" 14 minutes ago Up 1 minute$ docker service lsID NAME MODE REPLICAS IMAGEibyotlt1ehjy prod-equus1 replicated 1/1 alpine:latest

请注意,更新Docker还有其他的方法。本书只是介绍了基于Ubuntu Linux 16.04 版本的方式。

3.5.2 在Windows Server 2016上升级Docker EE

在本节中,会向读者一步一步介绍如何在Windows上将Docker 1.12.2版本升级到最新版本的Docker EE。

假设读者已经完成了全部的准备工作,比如为容器配置了正确的重启策略,如果运行有Swarm服务,则需要将待升级Swarm节点设置为drain状态。

本例中全部命令都应当通过PowerShell终端执行。

(1)检查当前Docker版本。

> docker versionClient: Version: 1.12.2-cs2-ws-beta<Snip>Server: Version: 1.12.2-cs2-ws-beta

(2)卸载本机上可能存在的由微软公司提供的旧版本Docker,并从Docker官方获取最新版本进行安装。

> Uninstall-Module DockerMsftProvider -Force> Install-Module DockerProvider -Force

(3)更新Docker包。

下面的命令会强制更新(无须卸载操作)Docker,并设置为开机自启动。

> Install-Package -Name docker -ProviderName DockerProvider -Update -ForceName Version Source Summary---- ------- ------ -------Docker 17.06.2-ee-6 Docker Docker for Windows Server 2016

现在读者可能想重启自己的节点,以确保刚安装的Docker不会对系统开机有任何的影响。

(4)检查并确保每一个容器和服务都已经重启成功。

3.6 Docker存储驱动的选择

每个Docker容器都有一个本地存储空间,用于保存层叠的镜像层(Image Layer)以及挂载的容器文件系统。默认情况下,容器的所有读写操作都发生在其镜像层上或挂载的文件系统中,所以存储是每个容器的性能和稳定性不可或缺的一个环节。

以往,本地存储是通过存储驱动(Storage Driver)进行管理的,有时候也被称为Graph Driver或者 GraphDriver。虽然存储驱动在上层抽象设计中都采用了栈式镜像层存储和写时复制(Copy-on-Write)的设计思想,但是Docker在Linux底层支持几种不同的存储驱动的具体实现,每一种实现方式都采用不同方法实现了镜像层和写时复制。虽然底层实现的差异不影响用户与Docker之间的交互,但是对Docker的性能和稳定性至关重要。

在Linux上,Docker可选择的一些存储驱动包括AUFS(最原始也是最老的)、Overlay2(可能是未来的最佳选择)、Device Mapper、Btrfs和ZFS。

Docker在Windows操作系统上只支持一种存储驱动,即Windows Filter。

存储驱动的选择是节点级别的。这意味着每个Docker主机只能选择一种存储驱动,而不能为每个容器选择不同的存储驱动。在Linux上,读者可以通过修改/etc/docker/daemon.json文件来修改存储引擎配置,修改完成之后需要重启Docker才能够生效。下面的代码片段展示了如何将存储驱动设置为overlay2。

{ "storage-driver": "overlay2"}

注:

如果配置所在行不是文件的最后一行,则需要在行尾处增加逗号。

如果读者修改了正在运行Docker主机的存储引擎类型,则现有的镜像和容器在重启之后将不可用,这是因为每种存储驱动在主机上存储镜像层的位置是不同的(通常在/var/lib/docker/ <storage-driver>/...目录下)。修改了存储驱动的类型,Docker就无法找到原有的镜像和容器了。切换到原来的存储驱动,之前的镜像和容器就可以继续使用了。

如果读者希望在切换存储引擎之后还能够继续使用之前的镜像和容器,需要将镜像保存为Docker格式,上传到某个镜像仓库,修改本地Docker存储引擎并重启,之后从镜像仓库将镜像拉取到本地,最后重启容器。

通过下面的命令来检查Docker当前的存储驱动类型。

$ docker system info<Snip>Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true<Snip>

选择存储驱动并正确地配置在Docker环境中是一件重要的事情,特别是在生产环境中。下面的清单可以作为一个参考指南,帮助读者选择合适的存储驱动。但是,本书仍建议读者参阅Docker官网上由Linux发行商提供的最新文档来做出选择。

Red Hat Enterprise Linux:4.x版本内核或更高版本 + Docker 17.06版本或更高版本,建议使用Overlay2。Red Hat Enterprise Linux:低版本内核或低版本的Docker,建议使用Device Mapper。Ubuntu Linux:4.x版本内核或更高版本,建议使用Overlay2。Ubuntu Linux:更早的版本建议使用AUFS。SUSE Linux Enterprise Server:Btrfs。

再次强调,上面的清单内容只是一个参考建议。读者需要时刻关注Docker文档中关于存储驱动的最新支持和版本兼容列表。尤其当读者正在使用Docker企业版(EE),并且有售后支持合同的情况下,更有必要查阅最新文档。

3.6.1 Device Mapper配置

大部分Linux存储驱动不需要或需要很少的配置。但是,Device Mapper通常需要合理配置之后才能表现出良好的性能。

默认情况下,Device Mapper采用loopback mounted sparse file作为底层实现来为Docker提供存储支持。如果读者需要的是开箱即用并且对性能没什么要求,那么这种方式是可行的。但这并不适用于生产环境。实际上,默认方式的性能很差,并不支持生产环境。

为了达到Device Mapper在生产环境中的最佳性能,读者需要将底层实现修改为direct-lvm模式。这种模式下通过使用基于裸块设备(Raw Block Device)的LVM精简池(LVM thin pool)来获取更好的性能。

在Docker 17.06以及更高的版本中可以配置direct-lvm作为存储驱动。但是在本书撰写时,该方式存在某种限制。其中最主要的一点是,这种方式只能配置一个块设备,并且只有在第一次安装后才能设置生效。未来可能会有改进,但就目前情况来看配置单一块设备这种方式在性能和可靠性上都有一定的风险。

3.6.2 让Docker自动设置direct-lvm

下面的步骤会将Docker配置存储驱动为Device Mapper,并使用direct-lvm模式。

(1)将下面的存储驱动配置添加到/etc/docker/daemon.json当中。

{"storage-driver": "devicemapper","storage-opts": [ "dm.directlvm_device=/dev/xdf", "dm.thinp_percent=95", "dm.thinp_metapercent=1", "dm.thinp_autoextend_threshold=80", "dm.thinp_autoextend_percent=20", "dm.directlvm_device_force=false"]}

Device Mapper和LVM是很复杂的知识点,并不在本书的讨论范围之内。下面简单介绍一下各配置项的含义。

dm.directlvm_device:设置了块设备的位置。为了存储的最佳性能以及可用性,块设备应当位于高性能存储设备(如本地SSD)或者外部RAID存储阵列之上。dm.thinp_percent=95:设置了镜像和容器允许使用的最大存储空间占比,默认是95%。dm.thinp_metapercent:设置了元数据存储(MetaData Storage)允许使用的存储空间大小。默认是1%。dm.thinp_autoextend_threshold:设置了LVM自动扩展精简池的阈值,默认是80%。dm.thinp_autoextend_percent:表示当触发精简池(thin pool)自动扩容机制的时候,扩容的大小应当占现有空间的比例。dm.directlvm_device_force:允许用户决定是否将块设备格式化为新的文件系统。

(2)重启Docker。

(3)确认Docker已成功运行,并且块设备配置已被成功加载。

$ docker versionClient:Version: 18.01.0-ce<Snip>Server:Version: 18.01.0-ce<Snip>$ docker system info<Snipped output only showing relevant data>Storage Driver: devicemapperPool Name: docker-thinpoolPool Blocksize: 524.3 kBBase Device Size: 25 GBBacking Filesystem: xfsData file: << Would show a loop file if in loopback modeMetadata file: << Would show a loop file if in loopback modeData Space Used: 1.9 GBData Space Total: 23.75 GBData Space Available: 21.5 GBMetadata Space Used: 180.5 kBMetadata Space Total: 250 MBMetadata Space Available: 250 MB

即使Docker在direct-lvm模式下只能设置单一块设备,其性能也会显著优于loopback模式。

3.6.3 手动配置Device Mapper的direct-lvm

完整介绍如何进行Device Mapper direct-lvm的手动配置已经超越了本书的范畴,并且不同操作系统版本之下配置方式也不尽相同。但是,下面列出的内容是读者需要了解并在配置的时候仔细斟酌的。

块设备(Block Device):在使用direct-lvm模式的时候,读者需要有可用的块设备。这些块设备应该位于高性能的存储设备之上,比如本地SSD或者外部高性能LUN存储。如果Docker环境部署在企业私有云(On-Premise)之上,那么外部LUN存储可以使用FC、iSCSI,或者其他支持块设备协议的存储阵列。如果Docker环境部署在公有云之上,那么可以采用公有云厂商提供的任何高性能的块设备(通常基于SSD)。LVM配置:Docker的Device Mapper存储驱动底层利用LVM(Logical Volume Manager)来实现,因此需要配置LVM所需的物理设备、卷组、逻辑卷和精简池。读者应当使用专用的物理卷并将其配置在相同的卷组当中。这个卷组不应当被Docker之外的工作负载所使用。此外还需要配置额外两个逻辑卷,分别用于存储数据和源数据信息。另外,要创建LVM配置文件、指定LVM自动扩容的触发阈值,以及自动扩容的大小,并且为自动扩容配置相应的监控,保证自动扩容会被触发。Docker配置:修改Docker配置文件之前要先保存原始文件(etc/docker/daemon.json),然后再进行修改。读者环境中的dm.thinpooldev配置项对应值可能跟下面的示例内容有所不同,需要修改为合适的配置。

{ "storage-driver": "devicemapper", "storage-opts": [ "dm.thinpooldev=/dev/mapper/docker-thinpool", "dm.use_deferred_removal=true", "dm.use_deferred_deletion=true" ]}

修改并保存配置后,读者可以重启Docker daemon。

如果想获取更多细节信息,可以参考Docker文档,或者咨询Docker技术账户管理员。

3.7 本章小结

Docker在Linux和Windows中都是可用的,并且分为社区版(CE)和企业版(EE)。在本章中,主要向读者介绍了在Windows10、Mac OS X、Linux以及Windows Server 2016下的几种安装Docker的方式。

本章还介绍了如何在Ubuntu 16.04和Windows Server 2016环境中升级Docker引擎,这也是两种常见的配置场景。

本章中读者还可以了解到选择正确的存储驱动对于在Linux生产环境中使用Docker非常重要。

本文摘自美亚操作系统排名第一的畅销书《深入浅出docker》

标签: #联想e75装win7鼠标不动