基于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的持续交付,预知详情,且听下回分解。
相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
kde
|
8天前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
kde
257 4
|
2月前
|
JavaScript 算法 前端开发
【Docker项目实战】使用Docker部署paopao-ce微社区
【Docker项目实战】使用Docker部署paopao-ce微社区
302 84
【Docker项目实战】使用Docker部署paopao-ce微社区
|
6天前
|
Java 应用服务中间件 API
【App Service】部署War包到Azure云上遇404错误
Java应用部署至Azure App Service for Windows后报404,本地运行正常。经排查,日志提示类文件版本不兼容:应用由Java 17(class file version 61.0)编译,但环境仅支持到Java 11(55.0)。错误根源为Java版本不匹配。调整App Service的Java版本至17后问题解决,成功访问接口。
|
7天前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
41 5
|
2月前
|
存储 Docker Python
docker 部署 sftp
本文介绍SFTP服务的部署与配置,包括users.conf用户配置规则、Docker容器运行命令及上传目录权限说明,重点解析atmoz/sftp镜像的chroot机制与子目录映射,确保用户登录后正确访问/upload目录,并提供Python脚本实现文件上传示例。
106 12
docker 部署 sftp
|
2月前
|
运维 Linux 数据库
基于 Docker 部署 n8n 指南,新手一看就会
本教程详解如何通过 Docker 快速部署开源自动化工具 n8n,适合新手快速上手。内容涵盖官方部署步骤、常见难点及第三方一键部署方案,助你高效搭建自动化工作流平台。
660 6
kde
|
24天前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
kde
446 7
kde
|
28天前
|
存储 搜索推荐 数据库
🚀 RAGFlow Docker 部署全流程教程
RAGFlow是开源的下一代RAG系统,融合向量数据库与大模型,支持全文检索、插件化引擎切换,适用于企业知识库、智能客服等场景。支持Docker一键部署,提供轻量与完整版本,助力高效搭建私有化AI问答平台。
kde
1031 8
kde
|
27天前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
kde
240 4
下一篇
开通oss服务