使用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-helloworldpom.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-helloworldpom.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

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

(未完待续...)

相关推荐
毕竟是shy哥2 小时前
vs code连接远程服务器docker环境及配置免密登录
服务器·docker·vs code
java_logo3 小时前
Docker 部署 Rocky Linux:轻松搭建 RHEL 兼容企业级基础镜像平台
linux·docker·容器·rocky linux·基础镜像·轩辕镜像·rhel 兼容
cloudfantasy4 小时前
docker直接二进制安装,非编译。KylinV10SP3 aarch64有效
运维·docker
M--Y7 小时前
Docker数据持久化与网络架构
网络·docker·架构
yanwumuxi10 小时前
Docker记录:误删宿主机挂载目录导致 PostgreSQL 数据丢失
docker·postgresql·容器
cui_hao_nan12 小时前
Docker 学习 5
docker·容器
A黄俊辉A13 小时前
两分钟上手docker
运维·docker·容器
程序员老赵14 小时前
Docker 部署 go2rtc:轻松搭建摄像头多协议流媒体平台
前端·docker·直播
努力努力再努力wz15 小时前
【Docker入门系列】:从架构演进到容器化:一文建立 Docker、虚拟化与 Namespace 的底层心智模型
运维·开发语言·数据结构·c++·docker·容器·架构
吴佳浩 Alben15 小时前
多智能体系统的通信风暴与死锁治理:生产级降级与容灾方案
人工智能·docker·ai·容器·架构