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

(未完待续...)

相关推荐
阿尔帕兹2 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口3 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
川石课堂软件测试8 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
追风林16 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
城南vision17 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge18 小时前
Docker篇(Docker Compose)
运维·docker·容器
梦魇梦狸º21 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
鬼才血脉21 小时前
docker+mysql配置
mysql·adb·docker
詹姆斯爱研究Java1 天前
Docker 的基本概念和优势
docker
南猿北者1 天前
docker镜像仓库常用命令
运维·docker·容器