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

简介: 本文介绍了如何将java的web应用与docker镜像整合在一起,并最终发布到阿里云容器服务的详细步骤,后后续介绍compose技术和基于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/master
Username for 'https://code.aliyun.com': zju_lb
Password for 'https://zju_lb@code.aliyun.com':


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

> ```bash
$ 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代码就有了一切

> ```bash
FROM registry.aliyuncs.com/zju_lb/tomcat:latest
COPY sources.list /etc/apt/sources.list
RUN apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 40976EAF437D05B5
RUN 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目录下并启动tomcat
COPY ./target/boot-api.war /usr/local/tomcat/webapps
CMD ["catalina.sh","run"]
  • 根据新完成的Dockerfile,本地进镜像编译:

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


- 编译完成后,启动镜像:

> ```bash
$ docker run –p dockerMachineIP:9999:8080 –it java-with-docker
  • 容器启动后就可以访问dockerMachineIP:9999/boot-api,看到我们java web服务的简单页面:
    _2016_03_28_11_34_07
  • 一切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路由规则”中添加端口转发规则:
![_2016_03_28_10_00_08](https://oss.aliyuncs.com/yqfiles/386177b2905f3c7240b38fbebbf8e9d9a4fb69b2.png)

- 应用创建成功后,就可以通过页面给出的“访问端点”的地址进行访问了:
![_2016_03_28_11_39_33](https://oss.aliyuncs.com/yqfiles/644a6e933e3bfbba3ec4a38d2803a968f545f52c.png)
![_2016_03_28_11_39_24](https://oss.aliyuncs.com/yqfiles/7882c630f81f0994c94ed0fedff87c8a2301f5b7.png)

--------
###结语###
相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
NoSQL API 数据库
YAPI介绍及Docker Compose部署指南
YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。可以帮助开发者轻松创建、发布、维护 API,YApi 还为用户提供了优秀的交互体验,开发人员只需利用平台提供的接口数据写入工具以及简单的点击操作就可以实现接口的管理。
515 0
 YAPI介绍及Docker Compose部署指南
|
消息中间件 关系型数据库 MySQL
从零玩转Docker之docker-compose快捷部署中间件2
从零玩转Docker之docker-compose快捷部署中间件
1135 0
|
关系型数据库 MySQL 数据安全/隐私保护
Docker Compose部署案例
本实验介绍了如何在DockerCompose中部署WordPress
|
NoSQL 中间件 Nacos
从零玩转Docker之docker-compose快捷部署中间件1
从零玩转Docker之docker-compose快捷部署中间件
239 0
|
消息中间件 Linux Kafka
Docker | Docker技术基础梳理(九) - Docker Compose 浅析与 部署实例
Docker | Docker技术基础梳理(九) - Docker Compose 浅析与 部署实例
121 0
|
存储 Ubuntu 网络安全
如何使用 Docker 部署 GitLab
如何使用 Docker 部署 GitLab
如何使用 Docker 部署 GitLab
|
Linux 开发工具 Docker
docker0基础部署
学习实践
192 0
|
弹性计算 Docker Python
使用Docker进行开发
Docker、Django框架
|
Ubuntu Linux 测试技术
Docker在开发方面的应用
Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
236 0
Docker在开发方面的应用
|
消息中间件 Ubuntu NoSQL
都在聊云开发了,你还没听过Docker?
Docker 的概念想必大家已经了解了,最直观的好处就是可以不安装虚拟机,不需要安装软件,不需要配置环境的情况下,就将我们想用的软件跑起来。
都在聊云开发了,你还没听过Docker?