作者:Michael Greene 17 Jul 2014 6:00 AM
译者:Stone Feng
译文链接:http://blog.csdn.net/stonefeng/article/details/38356259
译文在Docker中文社区的链接:https://www.dockboard.org/configuring-docker-on-azure-with-powershell-dsc-aspx/
【转载必须在正文中标注并保留原文链接、译文链接、作者、译者信息、以及本条要求。】
这篇博文的作者Andrew Weiss,是一位才华横溢的顾问,来自微软咨询服务部门。Andrew曾一直致力于用PowerShell DSC来提供管理Docker容器能力。感谢Andrew在Building Clouds分享他的文章!
Windows PowerShell Desired State Configuration for Linux (https://github.com/MSFTOSSMgmt/WPSDSCLinux)首个预览构建的发布,带来了丰富的、跨平台的配置管理可能性。
本文提供了将PowerShell DSC和轻量、基于容器的平台Docker整合的、在微软云里创建可重用的dev/test环境的指南。更具体地说,你将使用PlatypusTS Docker化一个样板web应用,这里PlatypusTS是一个在TypeScript上构建的web和移动框架。
用代码管理构架(原文为"Infrastructure-as-Code"——译者注)
在云里构建应用时,重要的是为开发者和系统管理员均提供一组常见的工具和框架。DevOps介绍了叫做“infrastructure-as-code”(用代码管理构架——译者注)的概念,IT专业人员可以与开发者们使用同样的技术和语言管理底层构架。
什么是Docker?
Docker 是一个构建在LXC之上的开源平台,是Linux容器,可以用来开发和部署应用。使用镜像(Image,下同——译者注)和容器,开发者和IT专业人员可以容易地在内部和云端部署标准化的开发环境。Docker与传统的虚拟机的区别是:Docker容器不依赖于肿胀的虚拟操作系统,可以显著地减少碳足迹。
如果你想了解更多内容,Docker团队提供了很棒的交互式演练:http://www.docker.com/tryit/.
DSC for Linux入门
在Linux主机上安装和配置DSC的指南可以在由Kristopher Bash较早发布的文章里找到,正值五月份PowerShell DSC for Linux被披露和发布的时候。
使用该文章中步进式的指导,确保你的Linux主机是为DSC配制好的,然后再跟随本文的其余指导部分。我将使用一个部署在微软云上的Ubuntu 14.04 LTS虚拟机来完成演练。
前提条件
- 通过SSH and TCP ports 80, 5985, and 5986的Linux主机连接
- 运行PowerShell v4.0 或更高版本的Windows主机
- Git (http://git-scm.com/)
- SSH客户端 (PuTTy)
配置管理工作站
一开始使用Windows PowerShell控制台,我会进入我的工作站上一个合适的目录并拷贝我需要的Docker DSC配置文件。执行下面的代码来创建一个叫做DockerClientDSC 的、带有我的配置源码的文件夹:
git clone https://github.com/anweiss/DockerClientDSC
在DockerClientDSC文件夹里有个脚本DockerClient.ps1,脚本里包含了一个叫做DockerClient的DSC配置。我将用它来确保我云端的目标虚拟机是按照Docker主机配置并且包含了我将使用dev/test的Docker镜像。在继续之前,我还将DockerClientDSC文件夹设置为我的工作目录。
用DSC安装Docker
使用DockerClient之前,我会创建一个变量来存储Linux虚拟机的主机名:
$hostname = "platypus-dev01.contoso.com"
然后我将配置装入当前会话:
. .\DockerClient.ps1
我现在可以带主机名参数执行DockerClient配置,创建一个新的DockerClient子目录,里面包含了与目标节点对应的 .mof文件:
DockerClient -Hostname $hostname
为了使产生的配置生效,我需要取得目标主机的凭据(注意在写这篇文章的时候,DSC for Linux仅支持通过“root”用户连接):
$cred = Get-Credential -UserName "root"
还要配置一组选项,我才能成功建立一个连到目标的远程PowerShell会话:
$options = New-CimSession -UseSsl -SkipCACheck -SkipCNCheck -SkipRevocationCheck
我可以使用这些选项来初始化一个到Linux虚拟机的CIM会话:
$session = New-CimSession -Credential $cred -ComputerName $hostname -Port 5986 -Authentication basic -SessionOption $options -OperationTimeoutSec 600
最后,应用我的配置:
Start-DscConfiguration -CimSession $session -Path .\DockerClient -Verbose -Wait -Force
在命令正常结束之后,我在Linux虚拟机上安装并配置好了Docker。现在让我们用DockerClient配置脚本来下载一些Docker镜像。
用DSC下载Docker镜像
我们接下来更新配置来使Docker主机包含一对Docker镜像。我们将下载MongoDB镜像和伴随它的、包含一个预先打包的、基于PlatypusTS框架的样板web应用。可以通过下面所示的镜像参数做到:
DockerClient -Hostname $hostname -Image @("mongo:latest", "anweiss/docker-platynem:latest")
建立CIM会话建立之后,我们可以简单地重新运行Start-DscConfiguration命令代码:
Start-DscConfiguration -CimSession $session -Path .\DockerClient -Verbose -Wait -Force
现在我在主机上下载并安装好了MongoDB镜像。
用DSC运行链接容器
我们还可以用DockerClient DSC配置创建新的带有一个MongoDB实例和样板web应用的链接容器。既然我们的web应用依赖于一个MongoDB实例,我就先创建一个MongoDB容器。我将建一个散列表来存储容器使用的参数。
$dbContainer = @{Name="db"; Image="mongo:latest"}
然后我将用这个散列表来创建一个新配置。
DockerClient -Hostname $hostname -Container $dbContainer
向我们此前做的那样,重新运行Start-DscConfiguration命令代码:
Start-DscConfiguration -CimSession $session -Path .\DockerClient -Verbose -Wait -Force
太棒了!现在我们应该有了一个运行中容器里的MongoDB实例。我们用PuTTy SSH进入虚拟机并取得容器的IP地址。我们在SSH会话里执行下面的Docker命令:
sudo docker inspect --format="{{ .NetworkSettings.IPAddress }}" db
我将拷贝显示出的IP地址(你的可能会有所不同)。
现在回到PowerShell控制台,我们将创建一个变量来存放MongoDB容器的IP地址,并且放在web容器的环境变量里。我们还将建另一个散列表来存放web容器的设置。
$mongoIP = "172.17.0.28"
$envVars = @("MONGOHQ_URL=mongodb://$mongoIP/platynem-dev","PORT=80")
$webContainer = @{Name="web";Image="anweiss/docker-platynem:latest";Port="80:80";Env=$envVars;Link="db"}
再一次,我们用这个散列表创建一个新的配置。
DockerClient -Hostname $hostname -Container $webContainer
让我们应用这个配置。
Start-DscConfiguration -CimSession $session -Path .\DockerClient -Verbose -Wait -Force
我们的web应用现在应该正运行在80端口。当我启动浏览器,并访问虚拟机的URL,应该能看到样板web应用在web容器中运行,并链接到正运行MongoDB的容器——一切都是用PowerShell DSC配置的。
注意:同样的技术可以很好地应用在开发环境的Docker容器上,不需要修改任何步骤。
非常感谢Andrew这么棒的文章。感谢Stay tuned构建的云!
喜欢此文?不喜欢此文?敬请留言,欢迎转发,多多交流。——译者