在Windows Server2016上使用Docker容器

Docker daemon简介

这其中也有许多令人困惑的地方,比如在Windows Server上运行Docker意味着什么。这里有一些要点需要澄清:

Windows Server端口之上的DockerEngine并不是一个头文件,也不是一个不同的项目,它同样为Linux和Windows构建的开源代码库。

Windows Server 之上的Docker技术预览版功能尚未完善,大部分的Docker命令你已经知道将在Windows Server正常工作。例如,你可以像在Linux上一样编写一个Dockerfile 和docker build。

Windows Server 之上的Docker daemon没有运行Linux image。不涉及虚拟化。Windows Server Containers重用(reuse)主机内核并为进程创建一个沙箱环境,就像在Linux之上一样。

这意味着Docker正在成为运行进程时一个平台不可知论的接口。例如,有一个一致的API允许跨Linux和Windows Server混合集群主机分发工作负载,这个混合集群是通过Docker Swarm使用单一的DockerCLI和相同的Docker指令编排的。没有任何新命令学习,相同的开发人员构建软件时现在有了更多的选择。

教程

Packer + Vagrant = Automation

本文所使用的Packer模板可以用来创建含有Docker Engine的Windows 2016 TP5 虚拟机。这个模板已经用VirtualBox 5.0.20 和 VMware Fusion 8.1测试过。如果你用的是Windows系统,模板应该也可以在 VMware Workstation上使用。

运行 Packer

使用Packer 0.10.0创建Vagrant基本虚拟机,只需要克隆下面的GitHub repo。

git clone https://github.com/StefanScherer/packer-windows  
cd packer-windows

然后为VMware创建Vagrant基本虚拟机:

packer build --only=vmware-iso windows_2016_docker.json

在为VirtualBox创建Vagrant基本虚拟机:

packer build --only=virtualbox-iso windows_2016_docker.json

这个过程大概要花上一个小时。

packer-build.png

上述步骤完成之后,当前路径中应该就会有一个box文件。将该文件添加到Vagrant:

vagrant box add windows_2016_tp5_docker windows_2016_docker_vmware.box

如果你既有VirtualBox环境,也有VMware环境,你也可以为这两种环境分别创建和添加基本虚拟机。你可以列出所有的base box:

$ vagrant box list
windows_2016_tp5_docker (virtualbox, 0)  
windows_2016_tp5_docker (vmware_desktop, 0)

 

运行 Vagrant

现在你可以使用新的基本虚拟机来执行一些测试工作了。这里,我们需要访问另一个GitHub repo。第一步是克隆代码:

git clone https://github.com/StefanScherer/docker-windows-box  
cd docker-windows-box

使用Vagrant 1.8.1,可以很容易地启动虚拟机,并让Docker在Windows 2016 TP5上运行:

vagrant up

Vagrant启动VM,安装其它的Docker工具(如Machine和Compose)。同时也安装Git以便访问一些在Github上的Windows Dockerfile。

vagrant-up-1.png

打开PowerShell来执行一些命令,例如:

docker version  
docker images

 

docker-version.png

恭喜你!现在可以用Windows 2016 TP5上的全新Docker引擎开始工作!

Packer能做什么

如果你想了解Packer在自动创建虚拟机的过程中做了什么,下面列出了Packer所运行的一些部署脚本。

安装功能组件

在脚本文件enable-winrm.ps1中,打开WinRM端口让Packer登录和进行进一步准备之前,将启用一些Windows配置,如Container支持和Hyper-V(仅针对VMware)支持。

安装Docker

下一个脚本install-docker.ps1,用来安装Docker服务、Docker客户端和名为windowsservercore的Docker基础镜像。如果Hyper-V已启用,也会安装名为nanoserver的Docker基础镜像 。

修补windowsservercore镜像

因为TP5和相关的文件以及镜像很新,并且还是预发布版本,保不定哪儿还有点问题。

目前我们需要这个脚本来为windowsservercore Docker镜像提速。脚本patch-boot-time-for-containers.ps1就是用来处理这个问题的。

启用不安全的Docker端口2375

在本地的测试环境,我们用脚本enable-docker-insecure.ps1打开不安全的Docker端口2375。

你可以从运行该虚拟机的主机上远程控制Windows Docker引擎。平时使用Linux或者Mac的人更该尝试一下。

一旦将来有了本地Windows VM的Docker Machine驱动程序,我更倾向于使用它来建立安全的TLS连接。

添加Docker群组

新的Windows Docker引擎会在一个Windows命名管道上监听消息,这与在Linux系统上监听 Unix套接字很相似。

普通用户不能访问这一命名管道,所以需要使用管理员Shell来操控Docker引擎。

脚本add-docker-group.ps1将选项-G docker添加到Docker引擎的启动命令,这样Windows用户组docker里的所有成员就都具有了访问命名管道的权限。

该脚本还在用户vagrant添加到这个docker用户组。所以,在Vagrant虚拟机中你就可以打开一个普通的PowerShell窗口来操控Docker引擎了。

删除 key.json

最后一个脚本remove-docker-key-json.ps1负责删除初始安装的key.json文件。在第一次启动运行Docker引擎时,每个Vagrant虚拟机中都会创建这个文件,并且根据不同Docker引擎创建不同的ID。

如果你想要构建一个Windows Docker Swarm集群,记得每个Docker引擎都需要一个不同的ID。

结论

由于Docker基础镜像和Docker引擎会持续更新,用Packer和Vagrant自动重建基本虚拟机就简单多了,不再需要执行那些手工操作的步骤。

分享到:更多 ()