使用io.fabric8:docker-maven-plugin插件构建Docker镜像并推送到远程Docker服务器和私有仓库

〇、准备工作

这里我们将使用fabric8平台提供的docker-maven-plugin插件,用于构建Docker镜像并自动推送到远程Docker服务器和私有仓库.

首先编写一个简单的SpringBoot项目,项目结构如下所示:

  • 父项目名称为boot-docker-initial,版本为1.0-SNAPSHOT
  • 子项目只有一个,名称为docker-helloworld,版本为1.0

该Boot项目的功能很简单:用户使用浏览器访问http://localhost:8080/hello ,此时浏览器页面将会显示"你好,这是Docker容器当中的一个SpringBoot项目测试样例"字样. 具体编写过程从略.

随后,来到子项目docker-helloworld的pom.xml文件当中,在dependencies域下方添加打包插件:

xml 复制代码
<build>
    <plugins>
        <!--将boot项目打包-->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.2.2.RELEASE</version>
            <configuration>
                <!--将本地jar包也一并打包,强烈建议设置该选项-->
                <includeSystemScope>true</includeSystemScope>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

插件spring-boot-maven-plugin的作用就是将当前Boot项目打包为jar包,最终在项目根路径/target目录下生成文件:docker-helloworld-1.0.jar. 这里说的项目根路径指pom.xml文件所在的目录,可使用{project.basedir}来表示.

接下来在plugins域当中,添加一个坐标:

xml 复制代码
<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.37.0</version>
</plugin>

如果Maven并没有自动下载该插件,而是傻乎乎地报错,那么请将下列坐标放入子项目的dependencies域当中:

xml 复制代码
<dependency>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.37.0</version>
</dependency>

此时Maven将会自动下载该插件. 下载完毕,plugins域就不再出现红线警告了. 届时读者可从dependencies域当中移除依赖io.fabric8: docker-maven-plugin:0.37.0,但为了方便我们建议读者不要移除.

一、使用示例

Step 1

已知

  • 我的虚拟机在通信子网当中的IP地址为192.168.174.101,主机域名为broker01
  • Docker服务的连接地址为tcp://192.168.174.101:2375
  • 私有仓库部署在broker01上,https://192.168.174.101:5000或者http://192.168.174.101:5000

在docker-helloworld的pom.xml文件当中添加插件

第一种写法

xml 复制代码
<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.37.0</version>
    <configuration>
        <!--指定远程服务器的Docker服务访问地址-->
        <dockerHost>tcp://192.168.174.101:2375</dockerHost>
        <!--指定私有仓库的访问路径-->
        <pushRegistry>http://192.168.174.101:5000</pushRegistry>
        <!--指定私有仓库的用户名与密码-->
        <authConfig>
            <username>root</username>
            <password>abc123</password>
        </authConfig>
        <images>
            <image>
                <!--指定私有仓库访问地址/镜像名称-->
                <name>192.168.174.101:5000/${project.build.finalName}:${project.version}</name>
                <build>
                    <!--指定Dockerfile的路径-->
                    <dockerFileDir>${project.basedir}</dockerFileDir>
                </build>
                <!--指定docker run命令的参数-->
                <run>
                    <!--指定容器名称-->
                    <containerNamePattern>${project.artifactId}</containerNamePattern>
                    <ports>
                        <!--指定端口映射关系-->
                        <port>3344:8080</port>
                    </ports>
                    <volumes>
                        <!--挂载目录-->
                        <bind>
                            <volume>/home/docker/boot/helloworld:/ROOT</volume>
                        </bind>
                    </volumes>
                </run>
            </image>
        </images>
    </configuration>
    <!--指定在每次打包或者重新打包的时候运行该插件的build, push, run目标-->
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
                <goal>push</goal>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

点击package插件之后,Maven将会自动执行本插件的build, push, run目标.

第二种写法

如果不想执行run目标,那么可以精简为

xml 复制代码
<!--将jar包打包为镜像-->
<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.37.0</version>
    <configuration>
        <!--指定远程服务器的Docker服务访问地址-->
        <dockerHost>tcp://192.168.174.101:2375</dockerHost>
        <!--指定私有仓库的访问路径-->
        <pushRegistry>http://192.168.174.101:5000</pushRegistry>
        <!--指定私有仓库的用户名与密码-->
        <authConfig>
            <username>root</username>
            <password>abc123</password>
        </authConfig>
        <images>
            <image>
                <!--指定私有仓库访问地址/镜像名称-->
                <name>192.168.174.101:5000/${project.build.finalName}:${project.version}</name>
                <build>
                    <!--指定Dockerfile的路径-->
                    <dockerFileDir>${project.basedir}</dockerFileDir>
                </build>
            </image>
        </images>
    </configuration>
    <!--指定在每次打包或者重新打包的时候运行该插件的build, push, run目标-->
    <executions>
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
                <goal>push</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Step 2

在docker-helloworld项目根路径下创建文件Dockerfile,写上

bash 复制代码
#基于openjdk:8-jre-slim构建镜像. 这是一个精简过的jre镜像,适合服务端程序使用
FROM openjdk:8-jre-slim
#将target目录下的jar文件复制到镜像根路径当中
COPY target/*.jar /app.jar
#对外暴露端口
EXPOSE 8080
#执行命令,不要使用CMD,必须使用ENTRYPOINT
ENTRYPOINT ["java","-jar","/app.jar"]

Step 3

打开IDEA当中的Maven菜单,展开boot-docker-initial,点击Lifecycle-package,如图所示


或者打开IDEA终端`Terminal`,输入

go 复制代码
mvn package

此时Maven将会自动构建工程、将工程打包为jar包、构建镜像、将镜像发布到远程Docker服务器和私有仓库.

Step 4

执行成功之后,在虚拟机当中执行命令

perl 复制代码
docker images | grep docker-helloworld

可以看到命令行显示

bash 复制代码
192.168.174.101:5000/docker-helloworld-1.0   1.0          7e1fea54a81c   3 minutes ago   223MB

Step 5

执行

arduino 复制代码
docker run -d -p 3344:8080 --name docker-hwlloworld 192.168.174.101:5000/docker-helloworld-1.0:1.0

或者使用IDEA当中的Docker插件启动一个容器实例.

Step 6

确保虚拟机已经对物理机开放了3344、2375端口,使用物理机浏览器访问http://192.168.174.101:3344/hello ,可以看到浏览器页面显示"你好,这是Docker容器当中的一个SpringBoot项目测试样例"字样. 如果读者采用第一种写法,那么可以看到控制台显示

(未完待续...)

相关推荐
是枚小菜鸡儿吖11 小时前
Home Assistant跨品牌智能家居教程:Docker部署、米家接入、vivo桥接与远程访问
docker·容器·智能家居
螺蛳粉 螺蛳粉13 小时前
第 02 篇:镜像分层与 containerd 2.x 实战:SystemdCgroup 与 pause 镜像配置踩坑(底座认知 02)
docker·云原生·容器·kubernetes·etcd·containerd·kube-apiserver
wefg114 小时前
【Docker】镜像相关指令
运维·docker·容器
java_logo15 小时前
Docker 部署 DPanel:轻松搭建轻量容器管理平台
运维·docker·容器·podman·容器管理·dpanel·轩辕镜像
死磕音视频15 小时前
Open WebUI 入门:用 Docker 装上本地对话界面并连接 Ollama
docker·ollama·本地大模型·open webui
分布式存储与RustFS15 小时前
CI 老被 Docker Hub 的 429 卡住,自建 Registry 把镜像搬进内网
运维·docker·开源·镜像仓库·对象存储·ci·rustfs
n1121216 小时前
Docker 容器时区错 8 小时:3 个坑
运维·docker·容器·故障排查·服务器运维·容器时区
慈云数据17 小时前
用 DSH 辅助部署一个网站监控平台:Uptime Kuma + Docker 实战
运维·docker·容器
螺蛳粉 螺蛳粉17 小时前
第 03 篇:为什么 K8s 的最小调度单元是 Pod 而不是容器:pause 容器与边车模式(底座认知 03)
docker·云原生·容器·kubernetes·etcd·运维排障·kube-apiserver
杨浦老苏1 天前
把项目管理搬回自己服务器:Windshift部署与避坑
docker·项目管理·群晖