文档章节

dubbo-admin 容器化构建

xmeng
 xmeng
发布于 2018/06/30 05:07
字数 1426
阅读 771
收藏 0

摘要:最近研究开源项目 zheng,其中用到了dubbo的服务,在使用 Docker 搭建环境的时候发现 dubbo-admin 没有官方的 Docker 镜像,于是自己动手根据官方源码制作一个镜像,学习一下 Spring Boot 应用的容器化过程。

<!--more-->

背景介绍

目前 dubbo-admin 被阿里弃用之后并不活跃,但是仍然是一个值得学习的优秀项目。目前官方没有提供Docker 镜像,通过搜索最近只有一个相对较新的镜像:这个镜像是通过获取源码编译获得,但是并没有追踪源码的版本控制,由于dubbo-admin 近期迁移到 Spring Boot,使用jar而不是war,所以这个镜像的DockerFile 已经无法成功构建了,所以决定自己根据源码,然后利用 Maven 插件对项目进行构建并推送镜像到 Docker Hub,完全依照持续集成的思路实现。

参考文章

网上已经有很多关于 Spring Boot 的容器化教程,下面是几篇较为详细的参考:

  1. Dockerize a Spring Boot application
  2. Dockerizing a Spring Boot Application

自动构建配置

整个过程分为三步

  1. 配置 Dockerfile 构建应用镜像
  2. 配置 dockerfile-maven-plugin 使用maven自动构建镜像
  3. 配置 docker-compose 测试镜像

Dockerfile 配置

这里不会详细介绍 Dockerfile 的语法说明,只会对用到的语法进行说明。 Dockfile 的 Github 源码地址

# Start with a base image containing Java runtime
FROM openjdk:8-jdk-alpine

# Add Maintainer Info
LABEL maintainer="x.meng@outlook.com"

# Add a volume pointing to /tmp
VOLUME /tmp

# Make port 8080 available to the world outside this container
EXPOSE 7001

# The application's jar file
ARG JAR_FILE=target/dubbo-admin-2.0.0.jar

# Add the application's jar to the container
ADD ${JAR_FILE} dubbo-admin.jar

# timezone
ARG TIME_ZONE=Asia/Shanghai

RUN apk add -U tzdata \
    && cp  /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime

ENV ZOOKEEPER="127.0.0.1:2181"
ENV ROOT_PASS="root"
ENV GUEST_PASS="guest"

# Run the jar file
#ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "$ZOOKEEPER", "$ROOT_PASS", "$GUEST_PASS","-jar","/dubbo-admin.jar"]
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Ddubbo.registry.address=zookeeper://$ZOOKEEPER  -Ddubbo.admin.root.password=$ROOT_PASS -Ddubbo.admin.guest.password=$GUEST_PASS -jar /dubbo-admin.jar

基本配置

对于该镜像的主要思路就是使用 JDK 基础镜像加载项目构建的额 JAR 文件。同时支持启动的选项配置。

基础镜像:

FROM openjdk:8-jdk-alpine

暴露端口

EXPOSE 7001

拷贝构建好的项目的JAR

# The application's jar file
ARG JAR_FILE=target/dubbo-admin-2.0.0.jar

# Add the application's jar to the container
ADD ${JAR_FILE} dubbo-admin.jar

这里配置了一个 ARG,因为随着项目版本的迭代,这个项目的JAR文件名会根据项目版本变化,所以这个作为一个变量存放,后面在 Maven 插件的配置中将会用到该变量。

执行 JAR 文件, 中间的 -Dxxx 都是 Option

ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Ddubbo.registry.address=zookeeper://$ZOOKEEPER  -Ddubbo.admin.root.password=$ROOT_PASS -Ddubbo.admin.guest.password=$GUEST_PASS -jar /dubbo-admin.jar

环境参数

大部分 Docker 镜像都需用户进行简单配置,我们这里提供了三种配置:

  1. ZOOKEEPER的地址
  2. ROOT密码
  3. GUEST密码
ENV ZOOKEEPER="127.0.0.1:2181"
ENV ROOT_PASS="root"
ENV GUEST_PASS="guest"

# Run the jar file
ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -Ddubbo.registry.address=zookeeper://$ZOOKEEPER  -Ddubbo.admin.root.password=$ROOT_PASS -Ddubbo.admin.guest.password=$GUEST_PASS -jar /dubbo-admin.jar

三个参数都有默认值,如果在启动镜像容器时指定了参数,那么将会使用指定的参数。

dockerfile-maven-plugin 配置

首先看一下整体配置,源码参考见 GitHub

目前这个插件主要做两件事情

  1. 根据当前构建 Jar 包,以及指定的标签,构建 Docker 镜像
  2. 推动镜像到 Docker Hub 仓库

该标签 <repository>xinmeng/dubbo-admin</repository> 指定了远程镜像地址,这个在 Docker Hub 中是唯一的。

<buildArgs>
	<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>

这段配置就是指定构建的 Jar 包,标签的名字和我们前面提到的 Dockerfile 里面配置的参数是一致的。

如何快速构建 latest 和带有标签的版本

参考该 issue, 通过配置多个 execution 来完成不同的工作。

比如我们想构建带有项目版本的标签的镜像,那么在 configuration 中加入 <tag>${project.version}</tag>. 如果构建latest 版本,那么 tag 就是 <tag>latest</tag>,在 build 时这个默认值。

<!--
	mvn dockerfile:build
	mvn dockerfile:tag@tag-version
	mvn dockerfile:push@push-latest
	mvn dockerfile:push@push-version
-->
<plugin>
	<groupId>com.spotify</groupId>
	<artifactId>dockerfile-maven-plugin</artifactId>
	<version>1.4.3</version>
	<configuration>
		<repository>xinmeng/dubbo-admin</repository>
		<buildArgs>
			<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
		</buildArgs>
	</configuration>
	<executions>
		<execution>
			<id>build-and-tag-latest</id>
			<phase>none</phase>
			<goals>
				<goal>build</goal>
			</goals>
		</execution>
		<execution>
			<id>tag-version</id>
			<phase>none</phase>
			<goals>
				<goal>tag</goal>
			</goals>
			<configuration>
				<tag>${project.version}</tag>
			</configuration>
		</execution>
		<execution>
			<id>push-latest</id>
			<phase>none</phase>
			<goals>
				<goal>push</goal>
			</goals>
			<configuration>
				<tag>latest</tag>
			</configuration>
		</execution>
		<execution>
			<id>push-version</id>
			<phase>none</phase>
			<goals>
				<goal>push</goal>
			</goals>
			<configuration>
				<tag>${project.version}</tag>
			</configuration>
		</execution>
	</executions>
</plugin>

有这个配置,我们只需要执行以下命令就可以完成对应的工作,如果需要推送,首先需要 Docker 登陆到对应权限的账号才能成功推送。

// 构建最新版本
mvn dockerfile:build
// 构建当前项目版本
mvn dockerfile:tag@tag-version
// 推送最新版本
mvn dockerfile:push@push-latest
// 推送当前项目版本
mvn dockerfile:push@push-version

Docker Compose 测试

由于dubbo依赖 zookeeper,所以这里使用docker-compose 创建一个 zookeeper 的服务,并且定一个网络别名,然后使用我们构建的镜像运行 dubbo-admin 服务。 只需要以下命令就可以完成服务启动。

docker-compose -f docker/dubbo.yml up -d

关闭服务:

docker-compose -f docker/dubbo.yml down

附配置文件源码

zookeeper.yml

version: '2'
services:
    dubbo-zookeeper:
        image: zookeeper:3.5
        ports:
            - 2181:2181

dubbo.yml

version: '2'
services:
  dubbo-zookeeper:
    extends:
      file: zookeeper.yml
      service: dubbo-zookeeper
    networks:
      dubbo-net:
        aliases:
          - zookeeper
  dubbo-admin:
    image: xinmeng/dubbo-admin:2.0.0
    environment:
      - ZOOKEEPER=zookeeper:2181
      - ROOT_PASS=root
      - GUEST_PASS=guest
    ports:
      - 8090:7001
    networks:
      dubbo-net:
        aliases:
          - dubbo
networks:
    dubbo-net:

总结

该镜像已经应用于 Zheng 的环境部署,参考该文章

© 著作权归作者所有

下一篇: Hello OsChina
xmeng
粉丝 1
博文 5
码字总数 9057
作品 0
南京
私信 提问
加载中

评论(0)

0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)

本文你将学到什么? 本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统。 项目完整源码下载 https://github.com/bz51/Spri...

孤狼悲月
2019/05/23
25
0
如何零基础搭建一套微服务框架(Spring Boot + Dubbo + Docker + Jenkins)

本文你将学到什么? 本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统。 这套微服务框架能干啥? 这套系统搭建完之后,那可...

Java微服务
2019/01/07
0
0
Dubbo学习之旅一-初识Dubbo

1.Dubbo是什么 Dubbo是一个分布式服务框架, 是SOA面向服务的架构的一种很好的实现,致力于提高性能和透明化的RPC(Remote Procedure Call Protocol)远程服务调用方案, dubbo就是一个服务框架,...

陈小扁
2016/04/27
693
0
dubbo框架Demo之dubbo-admin管理平台和zookeeper注册中心搭建

dubbo框架Demo之dubbo-admin管理平台和zookeeper注册中心搭建 一、安装环境 系统软件环境 单机 系统Centos7.3 java: jdk1.8.0_181 maven: apache-maven-3.5.4 tomcat: apache-tomcat-8.5.30...

bestlope
2018/09/07
0
0
跟我学习dubbo-Dubbo管理控制台的安装(3)

Dubbo管理控制台的安装 1、Dubbo管理控制台的主要作用:服务治理 2、管理控制台主要包含: 路由规则 动态配置 服务降级 访问控制 权重调整 负载均衡等管理功能 3、管理控制台版本: 当前稳定...

HI曲奇饼干
2016/01/05
1.8K
3

没有更多内容

加载失败,请刷新页面

加载更多

郑州开正规费发票

郑州开正规费发票【132 * 50 52 * 90 89】罗生,诚、信、合、作,保、真、售、后、保、障、长、期、有、效。adb的全称为Android Debug Bridg...

zhangyongli
7分钟前
27
0
OSChina 周四乱弹 —— 失业后的阳光太刺眼了

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @大又 :分享Jack Stauber的单曲《Fighter》 《Fighter》- Jack Stauber 手机党少年们想听歌,请使劲儿戳(这里) @theLovelyBugfly :笑死我...

小小编辑
今天
66
0
手把手教你搭建 ELK 实时日志分析平台

本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。 Elasticsearch ...

武培轩
今天
86
0
直播报名 | Service Mesh技术实践分享

近年来,云原生(Cloud Native)逐渐成为一个技术领域内的流行语,热度居高不下。企业正在加速拥抱云原生架构,以此缩短产品发布周期、敏捷响应市场需求,继而从云计算服务中提炼新的价值和技...

百度开发者中心
今天
97
0
Qt 实现QTableView单元格多按钮效果

实现效果预览: 思路: 使用Qt的委托类独自渲染表格的某一列,如上图字段2的那一列。该一个单元格放入多个按钮,重写 QStyledItemDelegate 委托类 paint 方法即可实现上图效果。 代码: 委托...

剑是SR剑
今天
99
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部