使用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项目测试样例"字样. 如果读者采用第一种写法,那么可以看到控制台显示

(未完待续...)

相关推荐
罗狮粉 992 小时前
docker部署微信小程序自动构建发布和更新
docker·微信小程序·notepad++
旺仔学IT2 小时前
CentOS上安装和卸载Docker
docker·centos
前端_库日天3 小时前
部署自己的git托管平台
git·ubuntu·docker
西西弗Sisyphus4 小时前
RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 在 Ubuntu 上安装 Docker Engine
docker·大模型·rag
@泽栖10 小时前
Docker 常用命令
运维·服务器·docker
鲁正杰12 小时前
在一个服务器上抓取 Docker 镜像并在另一个服务器上运行
运维·服务器·docker
老大白菜12 小时前
Windows 11 安装 Dify 完整指南 非docker环境
windows·docker·容器
VinciYan16 小时前
基于Jenkins+Docker的自动化部署实践——整合Git与Python脚本实现远程部署
python·ubuntu·docker·自动化·jenkins·.net·运维开发
tntlbb17 小时前
Ubuntu20.4 VPN+Docker代理配置
运维·ubuntu·docker·容器
Gabriel_liao17 小时前
Docker安装Neo4j
docker·容器·neo4j