第3章 Docker安装

本文章来源为《深入浅出Docker》(异步图书),为读书笔记。 读文本章大概需要20分钟,主要是docker的环境配置和安装教程,官网上也有详细的教程,大家对照自己的操作系统看对应的章节,3.4节一般不太会使用到,感兴趣的朋友可以看看。

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

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

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

  • 桌面安装。
    • Windows版Docker(Docker for Windows)。
    • Mac版Docker(Docker for Mac)。
  • 服务器安装。
    • Linux。
    • Windows Server 2016。
  • 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和容器特性

图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:  swarm

Server:
 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容器”。使用下面的命令也可以完成切换(进入\ProgramFiles\Docker\Docker目录下执行)。

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

C:\> docker version
Client:
 <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

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的抽象架构。

image.png

接下来开始安装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 version
Client:
 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/amd64

Server:
 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 --version
Docker version 17.05.0-ce, build 89658be

$ docker image ls
REPOSITORY    TAG      IMAGE ID      CREATED      SIZE

$ docker container ls
CONTAINER ID   IMAGE   COMMAND   CREATED    STATUS    PORTS    NAMES

3.3 在Linux上安装Docker

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

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

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

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

$ wget -qO- https://get.docker.com/ | sh

modprobe: 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-user

Remember 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 docker
docker:x:999:npoulton

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

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

$ docker --version
Docker version 18.01.0-ce, build 03596f5

$ docker system info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.01.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
<Snip>

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

3.4 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。

3.4.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.4.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 version
Client:
Version:      18.01.0-ce
<Snip>
Server:
Version:      18.01.0-ce
<Snip>

$ docker system info
<Snipped output only showing relevant data>
Storage Driver: devicemapper
Pool Name: docker-thinpool
Pool Blocksize: 524.3 kB
Base Device Size: 25 GB
Backing Filesystem: xfs
Data file:       << Would show a loop file if in loopback mode
Metadata file:   << Would show a loop file if in loopback mode
Data Space Used: 1.9 GB
Data Space Total: 23.75 GB
Data Space Available: 21.5 GB
Metadata Space Used: 180.5 kB
Metadata Space Total: 250 MB
Metadata Space Available: 250 MB

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

3.4.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.5 本章小结

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

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

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

摘录来自 深入浅出Docker(异步图书) Nigel Poulton(奈吉尔·波尔顿)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容