SpringBoot构建Docker镜像

前言

拒绝手动构建 Docker 镜像,本文将分别演示 Spring 官方fabric8io 的 docker-maven-plugin 插件,Build 期间自动构建镜像,并 push 到私有仓库,为 CI/CD 提供支持。

自建 Docker 私有仓库

  1. 本机安装 dokcer 环境,这里不再赘述,自行百度。

    macOS 系统推荐使用 Homebrew 进行安装。brew install –cask docker

  2. 私有仓库也是一个 docker 镜像,我们这里使用 Docker Registry

    1
    2
    3
    4
    # 拉取镜像
    docker pull registry:latest
    # 启动容器
    docker run -d -p 5088:5000 --restart always --name registry registry:latest

    -d 代表后台运行

    -p 5088:5000 代表宿主机5088端口映射到容器的5000端口

    –restart always 代表 Docker 启动的时候运行该容器

  3. 按照官方文档使用 ubuntu 镜像进行测试。

    1
    2
    3
    4
    5
    6
    7
    8
    # 拉取 ubuntu 镜像
    docker pull ubuntu
    # 更改镜像,使其指向私有仓库
    docker image tag ubuntu localhost:5088/myfirstimage
    # 查看镜像列表确认要操作的镜像仓库名称
    docker images
    # push 到私有仓库
    docker push localhost:5088/myfirstimage

    打开私有仓库地址 http://localhost:5088/v2/_catalog如果能看到推送的镜像 myfirstimage 就说明成功了。

SpringBoot 打包推送到私有仓库

Spring 官方插件

添加 maven 插件 官方文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.0</version>
<configuration>
<image>
<!--配置镜像名称-->
<name>localhost:5088/${project.artifactId}:${project.version}</name>
<publish>true</publish>
</image>
<docker>
<publishRegistry>
<username>pepsiyoung</username>
<password>123456</password>
<url>https://localhost:5088/v2</url>
</publishRegistry>
</docker>
</configuration>
</plugin>

需要SpringBoot 版本 2.4 及以上

publishRegistry.username 与 publishRegistry.password 可以任意填写

构建的时候会从 GitHub 下载依赖没有代理的话很容易报错。

执行 mvn clean package spring-boot:build-image -Dmaven.test.skip=true 等待完成。

再次进入 http://localhost:5088/v2/_catalog 查看是否 push 成功。

fabric8io 插件

添加 maven 插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.39.1</version>
<configuration>
<images>
<image>
<name>web-1.0.4.jar</name>
<registry>localhost:5088</registry>
<build>
<!-- 使用 Dockerfile 文件,默认地址是 src/main/docker -->
<dockerFile>Dockerfile</dockerFile>
<assembly>
<descriptorRef>artifact</descriptorRef>
</assembly>
</build>
</image>
</images>
</configuration>
</plugin>

Dockerfile

1
2
3
FROM openjdk:8-jdk-alpine
ADD maven/web-1.0.4.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

执行 mvn clean package docker:build docker:push -Dmaven.test.skip=true 等待完成。

http://localhost:5088/v2/{镜像名称}/tags/list查看具体镜像的版本

总结

今天介绍了如何搭建私有仓库,并用 ubuntu 镜像进行了测试,以及使用 SpringBoot 构建 Docker 镜像推送到私有仓库。
官方插件需要网络支持(代理)并且不需要编写 Dockerflie,相对来说更加方便,如果只是简单的使用并且网络情况良好推荐使用官方插件,如果想要在 Dockerfile 中有更多操作或者网络不是那么好的情况下推荐使用 fabric8io。