
系列文章
第一篇 docker的windows容器初体验 - 本文
最近微软发布了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 engine不同,最新的docker for windows提供了对linux容器和windows容器的支持。但值得注意的是:这两种容器模式不能被docker engine同时启用,但可以手工切换。
在安装之后,我们启动powershell就可以通过docker命令来管理容器。我们首先执行<code>docker version</code> 命令来检查docker的版本和系统信息,这时我们可以发现docker engine运行在linux容器模式。
为了切换到windows容器模式,我们先点击桌面托盘,再从docker图标的右键菜单中选中 “switch to windows containers ...” 片刻之后,windows 容器环境会就绪。
再次执行<code>docker version</code> 命令,这时server的“os/arch”已经从“linux/amd64”切换为“windows/amd64”,docker engine已经运行在windows容器模式
注:在linux容器模式下,我们可以在docker图标的右键菜单中选中“settings...” 对docker engine进行更多设置,比如可以在“docker daemon”中设置docker hub的镜像地址,这样可以利用阿里云容器镜像服务提供的加速器来加快从镜像下载速度。但是这些设置对于windows容器模式目前无效
注: 如果开启了windows安全防护软件,在拉取镜像时有可能会报如下错误,请关闭掉安全软件再试。
下面我们来做最简单的docker操作,启动一个示例容器
构建一个测试docker镜像,其dockerfile文件如下
构建镜像并执行的结果如下
感觉是不是还不错,docker为windows容器和linux容器提供了一致的用户体验。
我们可以利用<code>docker-compose</code>创建一个由asp.net博客应用和ms sqlserver构成的多容器应用
首先,下载示例代码
在“web/dockerfile” 中添加如下一行
注:如果你使用docker 1.13以上版本,需要将<code>docker-compose.yml</code>中的<code>version: '2'</code>修改为<code>version: '2.1'</code>,否则会提示如下错误
然后我们构建docker应用镜像,并利用docker compose模板启动整个应用
执行完毕,我们可以通过<code>docker compose ps</code>命令查看容器状态
使用下列命令,我们可以获得web服务容器的ip地址
这时我们就可以通过 <code>http://<container-ip>/blogengine</code> 来访问blog应用了!
windows容器的出现大大简化了windows应用交付和运维的复杂性,对于微软的技术生态有着及其重要的意义。docker在简化用户体验上做足了文章,现有工具链可以对windows和linux容器环境提供接近一致的能力。
同时windows和linux容器底层的实现机制还有很多不同,比如容器网络,基础镜像选择都有特别之处。未来我们会逐渐介绍。阿里云容器服务也会在未来的版本中提供对windows容器的支持