应用程序 docker_使轻松交付Docker应用程序变得容易
Docker和Docker应用程序
Docker来自于2013年成立的一个开源项目。在过去的两年中,用户下载了超过3亿个Docker映像。
作为最流行的云计算技术的一种,泊坞窗使用的软件船舶 集装箱思考。 作为用代码编写的国际容器,Docker可以将任何应用程序和相关的依赖项打包到一个轻巧,可移植,自包含的容器中。 技术人员对Docker和类似容器技术的预期应用感到兴奋。 许多人认为,容器技术正在从根本上改变人们构建,部署和交付软件的方式。
什么是Docker?
Docker是开发人员和系统管理员用来构建,交付和运行分布式应用程序的开放平台。 它使应用程序可以从组件中快速组装,并消除了开发,质量保证和生产环境之间的摩擦。 结果,IT可以在笔记本电脑,数据中心VM和任何云上更快地交付并运行相同的应用程序,而无需更改。
Docker如此受欢迎的三个特点是:
- 开发效率
使用Docker,开发人员可以使用任何工具链以任何语言构建任何应用程序。 它完全支持从开发人员笔记本到自动化测试的连续集成和持续交付,直至生产环境。 该应用程序不需要任何修改即可启用缩放。 - 灵活便携
Docker支持跨多个云移动同一应用程序。 Docker消除了一个特定云的“锁定”,并成为了混合云架构的云代理。 Docker帮助IT工程师快速,可靠地在任何基础架构上部署和运行任何应用程序。 - 部署效率
容器技术带来了更高密度的计算资源,包括CPU,内存和存储。 Docker Engine的轻量级运行时可根据需求的变化快速放大和缩小。
获取并访问Dockerized Java EE应用程序
这里以一个名为JKE Banking(JKE)的典型Java平台企业版(Java EE)应用程序为例,以说明如何连续交付Dockerized应用程序。 该应用程序包含两个基本的可部署组件,即Web /业务组件( jke-web )和数据组件( jke-db ),它们在Jetty应用程序服务器和MySQL数据库上运行。
第一步是将两个JKE组件的源代码打包到两个Docker映像中。 然后,将这两个Docker映像与二进制文件一起使用以部署JKE应用程序环境。 在此过程中,使用了来自Docker Hub的两个公共Docker映像java和mysql 。 对于Web组件jke-web,带有码头服务器的应用程序二进制文件打包到压缩文件中。 清单1中显示了jke-web组件的Dockerfile。
清单1. jke-web Dockerfile
FROM java:7
# Install jke.zip
COPY jke.zip /opt/jke/
RUN unzip /opt/jke/jke*.zip
RUN Chmod u+x *.sh
CMD./jke.server.linux.sh restart -F and tail /var/log/faillog
使用清单2中的命令生成jke-web图像。
清单2.生成新的jke-web图像的命令
sudo docker build -t jke-web .
对于jke-db数据组件,数据库初始化脚本打包到基于MySQL的映像中。 清单3中的Dockerfile和清单4中的命令用于构建jke-db映像。
清单3. jke-db Dockerfile
FROM MySQL
# Run SQL
COPY / init.sql
CMD MySQL - hmysql-server -uroot - ppassword init.sql
清单4.生成新的jke-db映像的命令
sudo docker build -t jke-db .
清单5包含用于运行JKE应用程序的一系列命令:
- 第一个容器运行一个MySQL服务器
- 第二个容器连接到MySql服务器并运行数据库初始化脚本
- 第三个运行JKE应用程序作为守护程序,并连接到MySql服务器。
注意事项 :
在jke-web组件的数据库配置文件JKEDB.properties中 ,主机名是mysql-server 。
清单5.启动容器的命令
sudo docker run --name MySQL -e MYSQL_ROOT_PASSWORD=password -d MySQL
sudo docker run --link mysql:mysql-server - D jke-db
sudo docker run --link mysql:mysql-server - P 8080:8080 -d jke-web
现在,您可以在http:// <docker-hostserver>:8080访问JKE应用程序,如图1所示。
图1.在Docker容器中运行的JKE应用程序
设置私有Docker注册表
要将不同版本的应用程序组件与Docker映像存储在一起,您需要设置一个私有Docker注册表。 使用此注册表,开发人员和测试人员可以上载和下载应用程序组件映像,将应用程序快速部署到测试环境中,并用标签标记这些映像。
在Docker V1.6及更高版本中,使用单行命令设置私有注册表很简单,如清单6所示。
清单6.设置一个私有注册表命令
sudo docker run -d -p 5000:5000 registry
清单7中提供的命令用于标记具有版本号的jke组件映像并将其上载到专用注册表中。
清单7.标记和推送图像的命令
sudo docker tag jke-web:1.1 192.168.27.100:5000/jke-web:1.1
sudo docker push 192.168.27.100:5000/jke-web:1.1
sudo docker tag jke-db:1.1 192.168.27.100:5000/jke-db:1.1
sudo docker push 192.168.27.100:5000/jke-db:1.1
之后,您可以从互联网访问和下载图像。 例如,您可以直接访问清单8中的URL以查看图像和版本信息。
注意事项 :
您的专用Docker注册表服务器IP地址可能不同于192.168.27.100。
清单8.用于查看注册表中图像的URL
http://192.168.27.100:5000/v1/search
http://192.168.27.100:5000/v1/repositories/jke-web/tags
设置Dockerized应用程序的DevOps管道
是时候使用应用程序部署工具IBM®UrbanCode Deploy为示例应用程序设置DevOps交付管道了。 该管道包含多组环境。 UrbanCode Deploy提供了一个自动化框架,使开发人员和IT工程师可以在整个应用程序交付生命周期中使用同一自动化。 它提供了集中式的部署基础结构来管理开发,测试和生产环境。 它还包括一个Docker插件,可针对不同的环境定期提取最新版本的Docker映像,运行Docker映像,然后运行所需的测试套件。
Dockerized应用程序的DevOps管道
在持续交付传统应用程序中,您将重点放在应用程序部署包的生命周期上。 其中包括跨不同环境的软件包生成和软件包升级,然后最终到生产环境。 在持续交付Dockerized应用程序中,您可以使用应用程序二进制代码管理Docker映像的生命周期,从映像生成到映像在各种环境之间的运输/运行。 传统应用程序交付和Dockerized应用程序交付之间的区别在于应用程序更改的载体和新方式。 通用的工作流程是相同的,具有对应用程序更改和多个环境的连续管理以及对应用程序的连续交付的控制。
对于Dockerized应用程序,连续交付过程大致分为两个阶段。
- 建立
- 运送并运行
设置完成后,将使用Dockerized应用程序构建工具的DevOps管道和UrbanCode Deploy来完成工作的两个阶段,如图2所示。
- 构建阶段:开发人员使用构建工具来构建Docker映像。 他们可以使用UrbanCode Build或Jenkins标准化Docker映像的自动构建过程。 提交代码后,将自动触发生成过程,这会将映像版本添加到私有注册表中。
- 交付和运行阶段:生成Docker映像后,测试人员和IT工程师可以开始部署应用程序的过程。 UrbanCode Deploy管理拉动不同版本的Docker映像并运行关联的Docker容器来部署应用程序。 它还管理在多个环境中测试应用程序,并将图像发布到公共注册表中。 UrbanCode Deploy不仅可以管理具有多个环境的复杂应用程序部署,而且还可以出于质量控制目的为关键环境(例如生产环境)设置环境门。 它还支持手动批准流程,以确保对关键操作或关键环境进行适当的监督和管理。
图2. Dockerized应用程序的DevOps管道
构建Docker映像
无论使用Jenkins还是UrbanCode Build,两个Docker映像的构建过程始终包含三个步骤。
- 第一步是从GitHub获取构建源,包括Dockerfile。
- 第二步是使用来自应用程序源的脚本或命令生成文件jke.zip和init.sql。 然后,您将文件复制到工作目录。
注意事项 :
GitHub存储库已经包含jke-web的默认压缩文件和jke-dbSQL脚本。 - 第三步,运行Docker build命令生成镜像并将其上传到私有注册表。
第1步 :从GitHub获取构建源,Git克隆https://github.com/wanyuxiang/jke-docker-sample 。
步骤2 :使用从GitHub下载的默认二进制文件。 或者,您可以从应用程序源构建新的二进制文件。
步骤3 :生成映像并将其上传到私有注册表。 代码如清单9所示。
清单9.生成图像并将其上传到私有注册表
sudo docker build -t jke-db.
sudo docker tag jke-db:1.1 192.168.27.100:5000/jke-db:1.1
sudo docker push 192.168.27.100:5000/jke-db:1.1
sudo docker build -t jke-web.
sudo docker tag jke-web:1.1 192.168.27.100:5000/jke-web:1.1
sudo docker push 192.168.27.100:5000/jke-web:1.1
成功构建后,可以在私有Docker注册表中找到新的jke-db和jke-web映像版本(对于此示例,IP地址为192.168.27.100)。
现在是时候引入UrbanCode Deploy来自动化应用程序部署了
UrbanCode Deploy是用于应用程序部署自动化的企业工具。 它提供以下功能。
- 对已部署工件和已部署配置的版本控制
- 通过多个环境管理部署
- 复杂应用程序部署过程的图形设计
- 支持使用基于角色的合作操作,例如批准
UrbanCode Deploy还提供了100多个插件,使它们可以与来自不同供应商的不同类型的第三方工具集成。 特别是,UrbanCode Deploy提供了一个Docker插件,用于将Docker映像映射到应用程序组件中。 以下各节显示如何使用UrbanCode Deploy连续交付示例JKE应用程序。
在UrbanCode Deploy中管理多个环境和DevOps管道
首先,创建一个应用程序,并在JKE Banking应用程序的UrbanCode Deploy中将其命名为Dockerized JKE
。 根据管道图表,此DevOps管道中的JKE版本涉及四个环境:
- 开发环境
- 功能验证测试(FVT)
- 系统验证测试(SVT)
- 内部生产
开发环境在构建阶段中用于生成图像。 在运输和运行阶段,UrbanCode Deploy处理其他三个部署环境:FVT,SVT和内部生产。 除了UrbanCode Deploy中的这三个环境之外,还创建了另一个环境公共注册表来发布Docker映像。
实际上,用户也可以使用UrbanCode Deploy代替构建工具来管理开发环境。 您还可以使用相同的过程在开发环境上运行或推送Docker映像。 在UrbanCode Deploy中需要配置的一项设置是Docker映像源配置。 对于开发环境,它可以是另一个Docker私有注册表,也可以将其保留为空白,以直接从开发环境中获取映像。
图3是显示Dockerized JKE应用程序的所有环境的快速概览。 该视图显示了JKE DevOps管道中包括的所有环境,当前版本以及每个环境的合规性状态。
图3. UrbanCode Deploy中的环境视图
图4显示了为不同环境设置的不同环境门,以定义在将组件版本部署到环境之前必须满足的要求。 例如,组件版本需要通过BVT(通过BVT)才能进入功能测试环境。 要部署到内部生产环境,组件版本需要三种状态:
- BVT通过
- FVT通过
- SVT通过
图4. UrbanCode Deploy中的环境门
在UrbanCode Deploy中管理Docker映像版本
JKE应用程序需要一个外部DB Server,并且由两个用于部署的组件组成。 要映射生成的两个Docker映像,请在UrbanCode Deploy中创建三个应用程序组件:
- 网络
- jke数据库
- MySQL的
创建和配置三个Dockerized应用程序组件很简单。 首先从UrbanCode Deploy网站下载并安装Docker插件 。 UrbanCode Deploy在安装后会自动生成Docker组件模板。 该模板包含可重用的部署过程,如图5所示。
图5. Docker自动生成的组件模板
要为Docker创建组件,请选择Docker模板,完成注册表信息并运行选项。 如果“ Docker注册表”字段留为空白,则UrbanCode Deploy会从公共Docker Hub注册表中搜索并提取映像。
mysql组件配置为从公共Docker Hub提取映像,如图6所示。
图6. mysql组件的设置
对于组件jke-web和jke-db,在Docker Registry字段中输入私有Docker注册表的URL。 输入URL将把应用程序组件从私有注册表中拉出,如图7所示。
图7. jke-web组件的设置
如果选中了“ 自动导入版本”选项,UrbanCode Deploy会定期监视Docker注册表以导入新版本。 组件版本选项卡在注册表中显示了组件映像的所有导入的版本。 对于一个特定的版本,您可以分配不同的状态以跟踪版本状态。 UrbanCode Deploy流程可以手动或自动添加版本状态。 例如,在SVT环境上成功完成测试过程之后,UrbanCode Deploy将状态SVT Passed添加到当前版本。
当图像版本被导入到UrbanCode部署中存在的默认状态是自动添加,如图8。
图8. mysql组件的图像管理
在UrbanCode Deploy中设计部署过程
在UrbanCode Deploy中,部署过程有两个主要级别: 应用程序过程和组件过程 。 组件过程由描述具体部署或配置操作顺序的插件步骤组成。 应用程序过程由几个组件过程组成,并定义了组件之间的依赖关系。 对于本文,需要两个JKE应用程序的应用程序过程。
- 部署和测试
部署JKE应用程序并运行自动化套件 - 标记并推送
标记Docker映像版本并推送到Docker注册表
首先,设计部署和测试应用程序流程以及相关的组件流程。
Docker插件包括带有拉动和运行过程的组件模板。 拉并运行过程允许您将特定的映像版本拉入新环境,然后使用指定的选项运行它。
将组件映像部署到测试环境后,您需要运行自动化测试以验证部署。 UrbanCode Deploy包括多个测试插件,这些插件允许不同的测试工具与UrbanCode Deploy集成。 在图9中,简单的Web测试插件用于设计jke-web组件的测试过程。 该插件提供了一种通过HTTP快速检查Web应用程序可用性的方法。 有两个步骤。
- 将此插件步骤拖到设计界面
- 完成网页URL和字符串以在页面上进行验证
图9. jke-web组件的测试过程
测试之后,组件版本的状态需要更新。 Docker组件模板中存在一个新的可重用的将状态设置为版本的过程,如图10所示,以标记所选版本的状态。
图10. Docker组件模板的设置状态过程
部署和测试应用程序过程如图11所示。该过程旨在指定组件的部署方式,并在部署和测试后设置组件版本状态。
图11.部署和测试的应用程序过程
对于Docker组件模板,创建了另一个可重用的过程,即标记和推送 。 拖放插件步骤并完成相应的参数。 第二个应用程序过程的设计如图12所示。
图12. Docker组件模板的标记和推送过程
图13显示了如何创建应用程序过程Tag和Push以及发布应用程序组件图像。 您可以并行运行两个组件推送过程。
图13.标签和推送的应用过程
您需要获得管理层的批准,然后才能将应用程序Docker映像推送到公共Docker注册表中。 首先,在UrbanCode Deploy中的相应环境上选中“ 需要批准”选项框。 批准过程旨在为环境或应用程序批准分配适当的角色。
图14.设置特定环境的批准
选中“ 需要批准 ”选项后,将打开一个新标签“ 批准流程” 。 在此选项卡上,通过在图形界面中拖放来设计批准过程,如图15所示。
图15.应用程序环境的批准过程
在UrbanCode Deploy中为Dockerized应用程序运行DevOps交付流程
在使用任何构建工具将新的应用程序映像版本上传到私有Docker注册表后,测试人员和IT工程师可以使用UrbanCode Deploy快速部署和测试应用程序。
例如,系统集成测试环境用于显示如何在UrbanCode Deploy中进行快速的应用程序部署和测试。 操作很简单。 单击环境上的>按钮,选择Deploy and Test process ,以及要部署的组件版本(或快照)。 在图16中,SN1的快照包含三个JKE组件的最新版本。
图16.启动应用程序的部署和测试过程
部署和测试过程需要几分钟才能完成。 在运行时或执行后,您可以在UrbanCode Deploy控制台中检查日志以监视过程或确定任何错误。 该过程成功完成后,这三个组件的最新版本被标记为SVT Passed 。
图17.申请流程的执行结果
在某个时候,将应用程序映像推送到公共注册表中。 选择“ 标记并推送”作为申请过程。 选择了具有所需状态的相同快照SN1,如图18所示。
图18.启动应用程序的标记和推送过程
批准的电子邮件通知将发送给所有批准者。 当批准者登录UrbanCode Deploy时,他们可以看到Tag and Push进程正在等待批准的响应。 必须先批准该过程,然后才能开始实际执行推送应用程序过程,如图19所示。
图19.申请流程的批准进度
该过程完成后,您可以使用清单10中的Docker命令来查看Docker映像是否已成功推送到Docker Hub注册表中。
清单10.检查推送图像的命令
$ sudo docker search wanyux
[sudo] password for rational:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
wanyux/jke-web 1
wanyux/jke-db 1
结论
开发效率,灵活性,可移植性和部署效率使更多的人关注并采用Docker技术。 Docker提供了一种将应用程序和中间件部署到云中的新方法。 DevOps管道的下游用户可以轻松找到最新的良好版本。 私有注册表的使用提供了共享应用程序多个版本以及使用标记的更简单方法。
UrbanCode Deploy为Dockerized应用程序提供了自动化框架,以在部署生命周期管理设置中使用相同的自动化。 它还提供了生产环境中的部署工件版本控制和批准。 它使应用程序更改的部署变得快速便捷,并支持连续的应用程序交付。
Docker和UrbanCode Deploy是DevOps中最受欢迎的技术。 当您将它们组合在一起时,期望为应用程序提供一种新的更有效的方法,以实现连续交付的好处。 我们也期待它为混合云环境中的应用程序部署带来更好的解决方案。