使用Maven插件快速发布Docker镜像

// 团队介绍

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安装及配置

使用Maven插件快速发布Docker镜像
使用Maven插件快速发布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镜像仓库

使用Maven插件快速发布Docker镜像
使用Maven插件快速发布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项目示例

使用Maven插件快速发布Docker镜像
使用Maven插件快速发布Docker镜像

① 启动类示例

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\"]

五、镜像打包以及推送

使用Maven插件快速发布Docker镜像
使用Maven插件快速发布Docker镜像

① 生成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!!!

六、总  结

使用Maven插件快速发布Docker镜像
使用Maven插件快速发布Docker镜像

通过这样一个简单的示例,相信大家应该学会如何使用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

Like (0)
EBCloud的头像EBCloud
Previous 2024年4月2日
Next 2024年4月2日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注