基于docker的持续交付系列(一):如何将app与docker整合并部署

简介: 基于docker的持续交付系列(一)

初衷

最近docker可以说火得不要不要的,主要是源于docker对环境一致性的完美解决,极大提升了开发和运维的效率,很好地诠释了dev-ops的含义。通过以下几个链接,你可以对docker有更深入的理解:


用到的工具
本着追随潮流的心态,让我们也尝试着去折腾一把!
本篇主要介绍如何将app代码与docker进行整合并build为镜像,最终完成部署、提供服务。


  • 使用的的代码托管工具为阿里云code(code.aliyun.com);
  • 使用的容器hub为阿里云开发者平台(dev.aliyun.com);

最终的产品镜像将部署到阿里云容器服务的ecs上(https://cs.console.aliyun.com/#/overview/all)

操作步骤
app代码编译
首先,我们本地clone项目代码库(此处需要您的阿里云code用户名和密码)

$ git clone https://code.aliyun.com/zju_lb/java-with-docker/tree/masterUsername for 'https://code.aliyun.com': zju_lbPassword for 'https://zju_lb@code.aliyun.com':

对于java工程,首先我们进行编译:

$ mvn clean package -D maven.test.skip=ture

编译过后,进行简单的测试工作:

$ mvn test

一切顺利,java的产出物boot-api.war已经存在于target目录下面了,现在缺少的是一个tomcat容器。

编译并push镜像
有人可能会说,dockerhub(https://hub.docker.com/) 上经过官方认证的tomcat容器版本不要太多(各个版本),但因为“墙”这个东西,使用dockerhub来存储镜像,就像用github存储代码一样,速度是硬伤。还好有阿里云的开发者平台(dev.aliyun.com)提供了具有加速功能的容器hub服务(加速的具体用法自己去研究吧)。
接下来要做的就是:

  • 在开发者平台上创建一个镜像仓库(名为java-with-docker),代码源选择“本地仓库”(github和bitbucket速度实在令人心慌,不过据说阿里云code即将接入开发者平台了);
  • 然后通过加速将官方的tomcat镜像拉到本地;
  • 基于这个镜像新写一个Dockerfile,在Dockerfile中自定义一些配置,并把maven编译的产出物war包打进镜像。在这里,我把Dockerfile一并提交到了代码仓库(这也是业界的一般玩法),一方面为了更好的实现app与镜像统一的版本化控制,另一方面也方便最终部署的实现,只要checkout代码就有了一切

FROM registry.aliyuncs.com/zju_lb/tomcat:latestCOPY sources.list /etc/apt/sources.listRUN apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 40976EAF437D05B5RUN apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 3B4FE6ACC0B21F32# 通用工具RUN apt-get update && apt-get -y install curl gcc automake autoconf make git wget xz-utils# 设置时区ENV TZ "PRC"RUN echo "Asia/Shanghai" | tee /etc/timezone \
&& dpkg-reconfigure --frontend noninteractive tzdata# 复制产出物到webapps目录下并启动tomcatCOPY ./target/boot-api.war /usr/local/tomcat/webappsCMD ["catalina.sh","run"]
根据新完成的Dockerfile,本地进镜像编译:

$ docker run –p dockerMachineIP:9999:8080 –it java-with-docker

编译完成后,启动镜像:

$ docker run –p dockerMachineIP:9999:8080 –it java-with-docker
  • 容器启动后就可以访问dockerMachineIP:9999/boot-api,看到我们java web服务的简单页面:

image.png

  • 一切OK,我们将该镜像push到镜像仓库中:
$ sudo docker login --username=alibay@aliyun-inner.com registry.aliyuncs.com $ sudo docker tag java-with-docker registry.aliyuncs.com/crp/java-with-docker
$ sudo docker push registry.aliyuncs.com/crp/java-with-docker```
(整个过程大概也就3分钟不到吧,当然这取决于你的网速)

启动容器服务
    虽然本地已经可以把容器run起来了,但如果想真正做到对外服务,还需要配置公网域名、proxy转发等一系列准备工作,我们可以使用阿里云提供的容器服务来简单实现这些繁琐的过程:

- 登陆阿里云官网(aliyun.com),开通容器服务;

- 可以看到,容器服务已经为你创建了一些用于log和route的系统应用;

- 点击“创建应用”,选择“使用镜像创建”,在选择镜像中选择刚刚push的镜像(java-with-docker),需要注意在“Web路由规则”中添加端口转发规则:

![image.png](https://ucc.alicdn.com/pic/developer-ecology/03723fabc8474fadabbbac79d1094651.png)

- 应用创建成功后,就可以通过页面给出的“访问端点”的地址进行访问了:

![image.png](https://ucc.alicdn.com/pic/developer-ecology/dcbf296320b84d439592c72e395b8802.png)






----

###结语
 本篇到此暂告一段落,只是给出了一个简单的demo应用并将其镜像化,如何使用compose编排(多镜像整合)技术,如何实现基于docker的持续交付,预知详情,且听下回分解。
相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
16天前
|
人工智能 API 数据安全/隐私保护
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
NextChat 是一个可以在 GitHub 上一键免费部署的私人 ChatGPT 网页应用,支持 GPT3、GPT4 和 Gemini Pro 模型。该项目在 GitHub 上获得了 63.8k 的 star 数。部署简单,只需拉取 Docker 镜像并运行容器,设置 API Key 后即可使用。此外,NextChat 还提供了预设角色的面具功能,方便用户快速创建对话。
85 22
使用 Docker 一键免费部署 63.8k 的私人 ChatGPT 网页应用
|
27天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
92 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
19天前
|
JavaScript C++ 容器
【Azure Bot Service】部署NodeJS ChatBot代码到App Service中无法自动启动
2024-11-12T12:22:40.366223350Z Error: Cannot find module 'dotenv' 2024-11-12T12:40:12.538120729Z Error: Cannot find module 'restify' 2024-11-12T12:48:13.348529900Z Error: Cannot find module 'lodash'
38 11
|
17天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
18天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
18天前
|
Docker 微服务 容器
使用Docker Compose实现微服务架构的快速部署
使用Docker Compose实现微服务架构的快速部署
38 1
|
26天前
|
C#
【Azure App Service】使用Microsoft.Office.Interop.Word来操作Word文档,部署到App Service后报错COMException
System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 80040154 Class not registered (0x80040154 (REGDB_E_CLASSNOTREG)).
|
1月前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
57 2
|
1月前
|
消息中间件 Linux RocketMQ
在Red Hat Enterprise Linux 9上使用Docker快速安装并部署
通过以上步骤,你可以在Red Hat Enterprise Linux 9上使用Docker快速安装并部署RocketMQ。这种方法不仅简化了安装过程,还提供了一个灵活的环境来管理和扩展消息队列系统。RocketMQ作为一款高性能的分布式消息系统,通过Docker可以实现快速部署和高效管理。
36 3
|
2月前
|
关系型数据库 MySQL Linux
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
基于阿里云服务器Linux系统安装Docker完整图文教程(附部署开源项目)
279 3