Docker的Windows容器初体验

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 最近微软发布了Windows Server 2016,其中最让广大开发者和运维同学期待的就是Docker对Windows容器的支持。如果你手边没有Windows Server 2016的环境,我们也可以在Windows 10 操作系统上,使用Docker for Windows来开始实验。

docker_windows_logo

系列文章

最近微软发布了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也会在安装过程中自动开启相应设置。

hyper_v

另外你需要为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 容器环境会就绪。

switch

再次执行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容器模式目前无效

settings

注: 如果开启了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” 中添加如下一行

RUN powershell -Command Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters' -Name ServerPriorityTimeLimit -Value 0 -Type DWord

这时因为目前Windows容器的DNS解析还存在问题,有时不能从web容器中正确解析到“db“”服务的容器,导致应用无法正常启动。社区中已有讨论 https://github.com/docker/docker/issues/27499 ,这里我们采用了文中提到的临时解决方案。

注:如果你使用Docker 1.13以上版本,需要将docker-compose.yml中的version: '2'修改为version: '2.1',否则会提示如下错误

ERROR: client version 1.22 is too old. Minimum supported API version is 1.24, please upgrade your client to a newer version

然后我们构建Docker应用镜像,并利用Docker Compose模板启动整个应用

docker-compose build
docker-compose up

执行完毕,我们可以通过docker compose ps命令查看容器状态

           Name                          Command               State         Ports
-----------------------------------------------------------------------------------------
aspnetblogapplication_db_1    cmd /S /C powershell ./sta ...   Up      1433/tcp
aspnetblogapplication_web_1   c:\windows\system32\cmd.exe      Up      0.0.0.0:80->80/tcp

使用下列命令,我们可以获得web服务容器的IP地址

docker inspect aspnetblogapplication_web_1

这时我们就可以通过 http://<container-ip>/BlogEngine 来访问Blog应用了!

blog

总结

Windows容器的出现大大简化了Windows应用交付和运维的复杂性,对于微软的技术生态有着及其重要的意义。Docker在简化用户体验上做足了文章,现有工具链可以对Windows和Linux容器环境提供接近一致的能力。

同时Windows和Linux容器底层的实现机制还有很多不同,比如容器网络,基础镜像选择都有特别之处。未来我们会逐渐介绍。阿里云容器服务也会在未来的版本中提供对Windows容器的支持

想了解更多容器服务内容,请访问 https://www.aliyun.com/product/containerservice

目录
相关文章
|
2天前
|
编解码 Linux Docker
如何在Windows上使用Docker,搭建一款实用的个人IT工具箱It- Tools
如何在Windows上使用Docker,搭建一款实用的个人IT工具箱It- Tools
7 0
|
4天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
4天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
23小时前
|
存储 安全 开发者
如何删除 Docker 镜像、容器和卷?
【5月更文挑战第11天】
8 2
如何删除 Docker 镜像、容器和卷?
|
2天前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
13 0
|
4天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化
|
4天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
4天前
|
机器学习/深度学习 监控 Kubernetes
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
【5月更文挑战第9天】本文探讨了Docker容器服务的自动扩展与缩容原理及实践,强调其在动态业务环境中的重要性。通过选择监控指标(如CPU使用率)、设定触发条件和制定扩展策略,实现资源的动态调整。方法包括云平台集成和使用Kubernetes等框架。实践中,电商平台和实时数据处理系统受益于此技术。注意点涉及监控数据准确性、扩展速度和资源分配。未来,智能算法将提升扩展缩容的效率和准确性,成为关键技术支持。
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
|
4天前
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
【Docker 专栏】Docker 容器内环境变量的管理与使用
|
4天前
|
运维 安全 Linux
深入理解Docker自定义网络:构建高效的容器网络环境
深入理解Docker自定义网络:构建高效的容器网络环境