// 团队介绍
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
@RestController
public 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-alpine
EXPOSE 9000
ARG JAR_FILE
ADD target/${JAR_FILE} /hi-0.0.1-SNAPSHOT.jar
ENTRYPOINT [\"java\", \"-jar\", \"/hi-0.0.1-SNAPSHOT.jar\"]
五、镜像打包以及推送
① 生成jar包并打包docker镜像
$ mvn package
② 推送docker镜像到本地私服
$ mvn dockerfile:push
③ 查看docker镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my.docker.com:5500/hi 0.0.1-SNAPSHOT 6420f762c1d0 3 minutes ago 161MB
alpine/socat latest 747019af8776 12 days ago 7.03MB
registry 2 b8604a3fe854 3 weeks ago 26.2MB
maven 3-jdk-8-alpine 7445f83cd169 2 years ago 122MB
java 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 16
drwxr-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 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42181ef59ff3 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 hi
be0e86152f09 alpine/socat \"socat tcp-listen:23…\" 5 days ago Up 5 hours 0.0.0.0:5555->2375/tcp socat
0c1cfa13c2a5 registry:2 \"/entrypoint.sh /etc…\" 6 days ago Up 5 hours 0.0.0.0:5500->5000/tcp myregistry
# 访问网址验证结果
$ curl localhost:9000
Hi!!!
六、总 结
通过这样一个简单的示例,相信大家应该学会如何使用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