摘要:最近研究开源项目 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/ShanghaiRUN apk add -U tzdata \&& cp  /usr/share/zoneinfo/${TIME_ZONE} /etc/localtimeENV 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:buildmvn dockerfile:tag@tag-versionmvn dockerfile:push@push-latestmvn 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.5ports:- 2181:2181

dubbo.yml

version: '2'
services:dubbo-zookeeper:extends:file: zookeeper.ymlservice: dubbo-zookeepernetworks:dubbo-net:aliases:- zookeeperdubbo-admin:image: xinmeng/dubbo-admin:2.0.0environment:- ZOOKEEPER=zookeeper:2181- ROOT_PASS=root- GUEST_PASS=guestports:- 8090:7001networks:dubbo-net:aliases:- dubbo
networks:dubbo-net:

总结

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

转载于:https://my.oschina.net/mengxin/blog/1838018

dubbo-admin 容器化构建相关推荐

  1. 知乎容器化构建系统设计和实践

    知乎选用 Jenkins 作为构建方案,因其强大和灵活,且有非常丰富的插件可供使用和扩展.早期,应用数量较少时,每个开发者都手动创建并维护着几个 Job,各自编写 Jenkins Job 的配置,以及 ...

  2. docker容器构建_我如何容器化构建系统

    docker容器构建 构建系统由用于从源代码过渡到正在运行的应用程序的工具和过程组成. 这种过渡还涉及将代码的读者从软件开发人员更改为最终用户,无论最终用户是运营方面的同事还是部署系统的同事. 在使用 ...

  3. 使用Jenkins Pipeline插件和Docker打造容器化构建环境

    Docker和Jenkins像DevOps界的巧克力和花生酱那样,它们的组合产生了无数的机会,当然也产生了很多难题,笔者将提及这两个方面. 本文中,我假定读者已经熟悉Jenkins和Docker,我将 ...

  4. K8S 快速入门(一)虚拟化、容器化构建云计算平台的基本概念及原理解析

    本章主题 1.认识kubernetes (k8s) 在企业中应用场景? ----- 为什么要学习K8s?? 2.云技术(云计算平台) - 虚拟化及虚拟化基本概念及原理 3.云技术(云计算平台) - 容 ...

  5. AutoMagic-开源自动化平台的容器化构建

    github上看到AutoMagic自动化平台开源了,一时手痒,就试着搭了一套环境,现在把思路和大家说一说. AutoMagic从其工作分工分两部分: 1:Web端管理平台 管理平台基于Python ...

  6. 基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)

    原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerizat ...

  7. Docker学习总结(36)——利用Google开源Java容器化工具Jib构建镜像

    一.前言 容器的出现让Java开发人员比以往任何时候都更接近"编写一次,到处运行"的工作流程,但要对Java应用程序进行容器化并非易事:你必须编写Dockerfile,以root身 ...

  8. 大数据容器化-基于Kubernetes(k8s)构建spark运行环境

    Apache Spark 在大数据处理与分析领域,Apache Spark无疑占据着重要地位.它的特点是基于内存计算,支持各类资源管理平台,其中以YARN最为常见,同时又与Hadoop平台集成,在集群 ...

  9. Easypack: JEECG的容器化编译环境快速构建

    这篇文章整理一下使用镜像方式进行JEECG编译环境的标准化,并将标准化的编译镜像和脚本放到了easypack上. JEECG介绍 详细的介绍可以参看如下链接: http://www.jeecg.com ...

最新文章

  1. 票房破五十亿!用Python分析李焕英为啥能逆袭《唐探3》
  2. java mysql数据库封装_java-jdbc封装连接数据库工具
  3. 什么时候使用临时表?
  4. 重定向index.php,使用htaccess将all重定向到index.php
  5. BugkuCTF-Misc:眼见非实(ISCCCTF)
  6. CAN接口芯片TJF1051T/3波形
  7. Exceptions(小节)
  8. 因为银行原因出现房贷逾期,怎么修复征信?
  9. AliOS Things v1.1.2新特性
  10. MySQL 授予普通用户PROCESS权限
  11. Java api监控_网站api监控、api监控教程详解
  12. cpu烤机温度测试软件,手机烤机测试软件 全自动烤肉机
  13. matlab 摄氏度符号怎么打
  14. app端分页 简单的分页 java
  15. 「MacTeX 小笔记」如何使用 LaTeXiT,以及导出一个数学公式图片
  16. 如何使用TPTP中的IDatapool
  17. 免费美食网页设计成品
  18. spring boot清远旅游推荐网站的开发毕业设计-附源码211551
  19. 世界各地的游戏都是如何分级的?哪个最严格?
  20. 第1章 开始使用C++

热门文章

  1. 打开桌面计算机投屏到扩展屏,电脑投屏到电视显示不完全解决办法
  2. Python 文件 tell() 方法
  3. 20150128-堆雪人
  4. 可视化模块(三): wandb
  5. 基于Vivado MIG IP核的DDR3读写实验(top_rom_ddr/ddr_top)
  6. 高项_第七章项目成本管理
  7. RTK ? PPK ?到底该选啥
  8. php 正态分布数据描述,正态分布-统计百科- 人大经济论坛-经管百科
  9. 如何查看Win11的CUDA版本
  10. CMake I 设置编译器标志