最近微软发布了Windows Server 2016,其中最让广大开发者和运维同学期待的就是Docker对Windows容器的支持。
Windows支持两种不同类型的容器,即 Windows Server 容器和 Hyper V 容器。 这两种类型的容器的使用方式相同,也支持相同的容器映像。 但是它们的实现机制不同,提供了不同的安全隔离级别
- Windows Server 容器 - 非常类似与Linux中的容器,使用通过命名空间、资源控制实现进程隔离。每个Windows Server容器都与宿主机共享同一个内核。
- Hyper V 容器 - 每个容器都运行在一个高度优化的Hyper V虚拟机中,所以容器拥有独立的内核。这样容器的隔离性会更好,但是启动速度会慢一些,其资源占用也会增加。
如果你手边没有Windows Server 2016的环境,我们也可以在Windows 10 操作系统上,使用Docker for Windows来开始实验。
前提条件
与基于Virtualbox的Docker Toolbox/Machine版不同,Docker for Windows 依赖于微软的虚拟化技术Hyper V。64位的Windows 10在专业版、企业版和教育版中,提供了Hyper V支持,但如果您使用的是家庭版,请升级后再做实验。
您可以通过控制面板的“程序“ > “启用或关闭Windows功能”来检查Hyper-V状态,中选中并开启Hyper V。Docker for Windows也会在安装过程中自动开启相应设置。
另外你需要为Windows 10安装2016年度更新,来确保在Window内核已提供原生的Windows容器支持。
注:Windows 10目前只支持Hyper V类型的Windows容器。
安装Docker for Windows Beta
与之前Docker Engine不同,最新的Docker for Windows提供了对Linux容器和Windows容器的支持。但值得注意的是:这两种容器模式不能被Docker Engine同时启用,但可以手工切换。
目前Docker for Windows对Windows容器的支持只在Beta版本中存在,你需要在下载链接中点击Get Docker for Windows (Beta) 来进行安装
设置Docker for Windows
在安装之后,我们启动PowerShell就可以通过Docker命令来管理容器。我们首先执行docker version
命令来检查Docker的版本和系统信息,这时我们可以发现Docker Engine运行在Linux容器模式。
PS C:\Users\denve> docker version Client: Version: 1.12.2 API version: 1.24 Go version: go1.6.3 Git commit: bb80604 Built: Tue Oct 11 05:27:08 2016 OS/Arch: windows/amd64 Experimental: true Server: Version: 1.12.2 API version: 1.24 Go version: go1.6.3 Git commit: bb80604 Built: Tue Oct 11 05:27:08 2016 OS/Arch: linux/amd64 Experimental: true
为了切换到Windows容器模式,我们先点击桌面托盘,再从Docker图标的右键菜单中选中 “Switch to Windows containers ...” 片刻之后,Windows 容器环境会就绪。
再次执行docker version
命令,这时Server的“OS/Arch”已经从“linux/amd64”切换为“windows/amd64”,Docker Engine已经运行在Windows容器模式
PS C:\Users\denve> docker version Client: Version: 1.12.2 API version: 1.24 Go version: go1.6.3 Git commit: bb80604 Built: Tue Oct 11 05:27:08 2016 OS/Arch: windows/amd64 Experimental: true Server: Version: 1.12.2-cs2-ws-beta API version: 1.25 Go version: go1.7.1 Git commit: 050b611 Built: Tue Oct 11 02:35:40 2016 OS/Arch: windows/amd64
注:在Linux容器模式下,我们可以在Docker图标的右键菜单中选中“Settings...” 对Docker Engine进行更多设置,比如可以在“Docker Daemon”中设置Docker Hub的镜像地址,这样可以利用阿里云容器镜像服务提供的加速器来加快从镜像下载速度。但是这些设置对于Windows容器模式目前无效
注: 如果开启了Windows安全防护软件,在拉取镜像时有可能会报如下错误,请关闭掉安全软件再试。
failed to register layer: re-exec error: exit status 1: output: Failed to OpenForBackup failed in Win32:
开启Windows容器之旅
下面我们来做最简单的Docker操作,启动一个示例容器
PS C:\Users\denve> docker run microsoft/sample-dotnet Welcome to .NET Core! __________________ \ \ .... ....' .... .......... .............'..'.. ................'..'..... .......'..........'..'..'.... ........'..........'..'..'..... .'....'..'..........'..'.......'. .'..................'... ...... . ......'......... ..... . ...... .. . .. ...... .... . ....... ...... ....... ............ ................ ...................... ........................'................ ......................'..'...... ....... .........................'..'..... ....... ........ ..'.............'..'.... .......... ..'..'... ...............'....... .......... ...'...... ...... .......... ...... ....... ........... ....... ........ ...... ....... '...'.'. '.'.'.' .... ....... .....'.. ..'..... .. .......... ..'........ ............ .............. ............. '.............. ...........'.. .'.'............ ............... .'.'............. .............'.. ..'..'........... ............... .'.............. ......... .............. .....
构建一个测试Docker镜像,其Dockerfile文件如下
FROM microsoft/nanoserver CMD echo Hello World!
构建镜像并执行的结果如下
PS C:\Users\denve\test> docker build -t test . Sending build context to Docker daemon 2.048 kB Step 1/2 : FROM microsoft/nanoserver ---> e14bc0ecea12 Step 2/2 : CMD echo Hello World! ---> Running in 0b0831046879 ---> 3e506bc77617 Removing intermediate container 0b0831046879 Successfully built 3e506bc77617 PS C:\Users\denve\test> docker run test Hello World!
感觉是不是还不错,Docker为Windows容器和Linux容器提供了一致的用户体验。
测试Docker Compose
微软提供了一些官方的Windows容器示例,可以从下列项目获得 https://github.com/Microsoft/Virtualization-Documentation/tree/live/windows-container-samples/
我们可以利用docker-compose
创建一个由asp.net博客应用和MS SQLServer构成的多容器应用
首先,下载示例代码
git clone https://github.com/Microsoft/Virtualization-Documentation cd .\Virtualization-Documentation\windows-container-samples/ASP-NET-Blog-Application
在“web/Dockerfile” 中添加如下一行