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

(未完待续...)

相关推荐
小夏卷编程3 小时前
Ubuntu 20.04.4 宝塔 docker showdoc v3.2 更新到v3.7.3
运维·docker·容器
JEECG低代码平台3 小时前
JeecgBoot低代码平台 Docker 部署 OnlyOffice 文档服务完整指南
低代码·docker·容器
生活爱好者!4 小时前
NAS帮我找回童年的快乐!部署 小游戏
运维·服务器·docker·容器·娱乐
自在极意功。5 小时前
nginx和docker面试题
运维·nginx·docker
不做超级小白7 小时前
执行docker命令时自动启动Docker Desktop?一个小工具让开发体验更丝滑
windows·docker
222you7 小时前
Ubuntu当中的Docker安装和镜像管理
ubuntu·spring cloud·docker
心易行者7 小时前
别再说“在我的机器上能跑”了!Docker 入门指南,专治各种环境不服
运维·人工智能·docker·容器
zhim008 小时前
【保姆级教程】使用 Docker 部署 PostgreSQL + pgvector(含踩坑指南)
linux·docker
进击切图仔9 小时前
ROS 跨机通信与 Docker 多机环境搭建
运维·docker·容器
xiaoye37089 小时前
docker 迁移mysql容器
mysql·docker