// 团队介绍
TEAM INTRODUCE
光大科技智能云计算部云计算团队云管项目组,致力于金融行业多云管理平台的咨询、设计、研发、部署及实施工作。我团队在云计算、虚拟化、存储、云管理平台建设领域拥有多名经验丰富的技术专家。将不定期与大家分享原创技术文章和相关实践经验,期待与大家共同探讨和进步。
一、简 介
在我们持续集成过程中,项目工程一般使用 Maven 编译打包,生成、推送Docker镜像,在服务器上拉取Docker镜像进行部署,这样能够大大提高上线效率,同时能够快速动态扩容、快速回滚,非常方便。
dockerfile-maven-plugin是Spotify组织开发的一款Maven插件,能够帮助我们在Maven工程中,通过简单的配置就能达到自动生成镜像并推送到仓库中的目的。该组织之前开发过另一款叫做docker-maven-plugin的Maven插件,能够达到相同的目的,但是配置相对繁琐一些,现在已经不推荐使用了。
本文将简单介绍dockerfile-maven-plugin插件的配置、使用过程,用来快速发布Docker镜像。
基本环境:
·操作系统:macOS Monterey v12.0.1
·jdk版本:1.8.0_211
·maven版本:3.3.9
二、Docker安装及配置

① Mac版本安装包下载地址
https://desktop.docker.com/mac/main/arm64/Docker.dmg?utm_source=docker&utm_medium=webreferral&utm_campaign=docs-driven-download-mac-arm64
② mac使用socat镜像开启远程连接服务
$ docker run -d --name socat --restart always -p 5555:2375 -v /var/run/docker.sock:/var/run/docker.sock alpine/socat tcp-listen:2375,fork,reuseaddr unix-connect:/var/run/docker.sock
③ 在宿主机hosts文件添加以下配置
127.0.0.1 my.docker.com
三、Docker镜像仓库

① 拉取Docker仓库的镜像
$ docker pull registry:2
② 运行Docker镜像仓库容器,并将容器命名为myregistry,映射容器5000端口到宿主机5500端口
$ docker run -d --restart always -v /Users/genan/develop/docker-registry:/var/lib/registry -p 5500:5000 --name myregistry registry:2
③ 在Docker Engine中配置本地Docker镜像仓库地址
\"insecure-registries\": [\"my.docker.com:5500\"]
四、SpringBoot项目示例

① 启动类示例
package com.ebtech.cmp;import org.springframework.boot.*;import org.springframework.boot.autoconfigure.*;import org.springframework.web.bind.annotation.*;@SpringBootApplication@RestControllerpublic class HiApplication {@GetMapping(\"/\")String home() {return \"Hi!!!\";}public static void main(String[] args) {SpringApplication.run(HiApplication.class, args);}}
② 配置pom文件(省略项目信息、依赖部分)
<!-- 在pom文件中,配置远程仓库的地址 --><distributionManagement><!-- 仓库的唯一标识,与上一项配置的id相同 --><snapshotRepository><id>test</id><!-- 仓库名称 --><name>test-Snapshot</name><!-- 仓库路径 --><url>http://my.docker.com:8081/repository/test-Snapshot</url></snapshotRepository></distributionManagement><build><!-- jar包名称 --><finalName>${project.name}-${project.version}</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><!-- 旧版为docker-maven-plugin --><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.13</version><executions><execution><id>default</id><goals><goal>build</goal><goal>push</goal></goals></execution></executions><configuration><useMavenSettingsForAuth>true</useMavenSettingsForAuth><!-- docker镜像的repository属性 --><repository>my.docker.com:5500/${project.name}</repository><!-- docker镜像的tag属性 --><tag>${project.version}</tag><buildArgs><!-- 标签可以在Dockerfile中被引用 --><JAR_FILE>${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration></plugin></plugins></build>
③ 配置application.properties
# 设置端口号server.port=9000
④ 编写Dockerfile
Dockerfile文件位于项目根目录下,文件内容如下:
FROM java:8-alpineEXPOSE 9000ARG JAR_FILEADD target/${JAR_FILE} /hi-0.0.1-SNAPSHOT.jarENTRYPOINT [\"java\", \"-jar\", \"/hi-0.0.1-SNAPSHOT.jar\"]
五、镜像打包以及推送

① 生成jar包并打包docker镜像
$ mvn package
② 推送docker镜像到本地私服
$ mvn dockerfile:push
③ 查看docker镜像
$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEmy.docker.com:5500/hi 0.0.1-SNAPSHOT 6420f762c1d0 3 minutes ago 161MBalpine/socat latest 747019af8776 12 days ago 7.03MBregistry 2 b8604a3fe854 3 weeks ago 26.2MBmaven 3-jdk-8-alpine 7445f83cd169 2 years ago 122MBjava 8-alpine 3fd9dd82815c 4 years ago 145MB
④ 查看本地镜像仓库中是否存在已经推送的镜像
Docker镜像仓库映射到宿主机的路径为/Users/genan/develop/docker-registry,在此目录下的docker/registry/v2/repositories/目录中存放的是镜像仓库实际存储的镜像。
$ ll /Users/genan/develop/docker-registry/docker/registry/v2/repositories/total 16drwxr-xr-x 5 genan staff 160B 12 8 10:33 hi
⑤ 运行docker容器
$ docker run -itd -p 9000:9000 --name hi my.docker.com:5500/hi:0.0.1-SNAPSHOT /bin/sh
⑥ 验证结果
# 查看docker容器$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES42181ef59ff3 my.docker.com:5500/hi:0.0.1-SNAPSHOT \"java -jar /hi-0.0.1…\" 3 seconds ago Up 2 seconds 0.0.0.0:9000->9000/tcp hibe0e86152f09 alpine/socat \"socat tcp-listen:23…\" 5 days ago Up 5 hours 0.0.0.0:5555->2375/tcp socat0c1cfa13c2a5 registry:2 \"/entrypoint.sh /etc…\" 6 days ago Up 5 hours 0.0.0.0:5500->5000/tcp myregistry# 访问网址验证结果$ curl localhost:9000Hi!!!
六、总 结

通过这样一个简单的示例,相信大家应该学会如何使用dockerfile-maven-plugin插件快速发布Docker镜像,并把Docker镜像推送到Docker仓库了。
除了上述简单的设置以外,更多的配置参见https://github.com/spotify/dockerfile-maven。
开发人员在本地通过maven插件发布Docker镜像非常快捷,但是也有许多场景用起来不大方便,例如需要针对某分支某版本打包Docker镜像并发布,或者本地没有开发环境。此时,我们可以通过GitLab直接进行镜像的打包、推送和部署,具体如何实现,我们将会下次与大家分享。
期待与各位的再会!
作者:葛楠
往期回顾
金融行业云运维管理能力平台之分布式缓存平台
WEB安全之探究
Fabric2.2LTS版本配置解读
分布式存储之FusionStorage探究
微信公众号
EBCloud
赶快扫码关注我们
了解更多技术干货!
原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/32692.html