文档章节

dubbo-admin 容器化构建

xmeng
 xmeng
发布于 2018/06/30 05:07
字数 1426
阅读 72
收藏 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
博文 4
码字总数 7033
作品 0
南京
私信 提问
如何零基础搭建一套微服务框架(Spring Boot + Dubbo + Docker + Jenkins)

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

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

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

陈小扁
2016/04/27
618
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
EOSPlatform+Dubbo+Zookeeper最佳实践

摘要:随着分布式服务框架的流行,许多公司都引入了业界流行的分布式服务框架,本文介绍如何使用EOSPlatform+Dubbo+Zookeeper实现分布式服务的开发与运行。 1 环境准备 1.1 环境选择 EOSPla...

如何让他和
2016/08/13
52
1
跟我学习dubbo-Dubbo管理控制台的安装(3)

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

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

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
12
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
3
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部