SpringBoot项目使用docker-maven-plugin插件构建docker镜像以及推送到docker hub或docker registry私服

2023-11-01

我们知道docker可将应用程序和基础设施层隔离,可更快地打包、测试以及部署应用程序。本文主要介绍SpringBoot项目如何构建docker镜像以及推送到私服或者docker hub服务器上。

本文介绍的方式是使用docker-maven-plugin的方式构建SpringBoot的docker镜像以及推送到私服或docker hub服务器上。

Docker环境配置

本地环境配置

docker-maven-plugin 插件默认连接本地 Docker 地址为:localhost:2375,如果我们本地开发环境有docker环境并准备使用本地开发环境的docker,只需要先设置下本地开发环境的环境变量。

DOCKER_HOST=tcp://<host>:2375

服务器环境配置

如果使用CentOS服务器上的docker环境 (CentOS上安装docker环境),则需要在服务器上修改 docker 配置,开启允许远程访问 docker 的功能,开启方式很简单,修改 /usr/lib/systemd/system/docker.service 文件,ExecStart中加入如下内容:

-H tcp://0.0.0.0:2375  -H unix:///var/run/docker.sock

 

 修改好配置后,使用如下命令重启docker生效:

systemctl daemon-reload    
systemctl restart docker 

IDEA测试docker连接

IDEA 中我们可以测试服务器上的docker环境是否连接成功,打开 File->Settings->Build,Execution,Deployment->Docker ,然后配置一下 Docker 的远程连接地址:

配置一下 Docker 的地址,配置完成后,提示 Connection successful 信息,表示 Docker 已经连接上了。

SpringBoot项目引入docker-maven-plugin插件

pom.xml配置

项目中引入docker-maven-plugin插件,在pom.xml引入插件并做相应的配置:

<project>
    <!-- other setting-->
    <build>
        <plugins>
            <plugin>
                <!-- https://mvnrepository.com/artifact/com.spotify/docker-maven-plugin -->
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <executions>
                    <!-- 当mvn执行install操作的时候,执行docker的build和push -->
                    <execution>
                        <id>buildAndPush</id>
                        <phase>install</phase>
                        <goals>
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- 连接到 带docker环境的linux服务器 编译image -->
                    <dockerHost>http://192.168.**.***:2375</dockerHost>

                    <!-- push到 docker hub 开始 -->
                    <!-- serverId 这个是配置在maven的setting.xml中私服的登录账户信息-->
                    <serverId>docker-hub</serverId>
                    <retryPushCount>1</retryPushCount>
                    <retryPushTimeout>2000</retryPushTimeout>
                    <registryUrl>https://index.docker.io/v1/</registryUrl>
                    <!-- 格式:私有仓库/镜像名称:版本号, 如果要执行push操作, 那么镜像名称必须为私有仓库为前缀,不然无效。-->
                    <imageName>flyduck128/${project.artifactId}</imageName>
                    <!-- push到 docker hub 结束 -->

                    <!-- 指定tag版本 -->
                    <imageTags>
                        <imageTag>v1.0</imageTag>
                    </imageTags>
                    <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                    <!-- optionally overwrite tags every time image is built with docker:build -->
                    <forceTags>true</forceTags>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.zip</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Docker命令可以绑定到maven各阶段命令中。该示例配置中我们在execution上将docker的build和push命令绑定在了maven的install阶段命令中。当springboot项目执行maven的install命令阶段,会执行docker的build和push命令。

如果需要推送到docker hub或者私服,还需要在本地的maven目录的setting.xml中配置相应的server:

    <server>
      <id>docker-hub</id>
      <username>flyduck128</username>
      <password>***</password>
      <configuration>
        <email>***@qq.com</email>
      </configuration>
    </server>

如果我们不需要推送到docker hub或者私服,可以不配置docker的push命令以及相应的推送配置:

                    <!-- push到 docker hub 开始 -->
                    <!-- serverId 这个是配置在maven的setting.xml中私服的登录账户信息-->
                    <serverId>docker-hub</serverId>
                    <retryPushCount>1</retryPushCount>
                    <retryPushTimeout>2000</retryPushTimeout>
                    <registryUrl>https://index.docker.io/v1/</registryUrl>
                    <!-- 格式:私有仓库/镜像名称:版本号, 如果要执行push操作, 那么镜像名称必须为私有仓库为前缀,不然无效。-->
                    <imageName>flyduck128/${project.artifactId}</imageName>
                    <!-- push到 docker hub 结束 -->

Dockerfile文件配置

Dockerfile文件放入项目的/src/main/docker目录,在上面的pom.xml中dockerDirectory节点中保持一致。Dockerfile文件配置如下:

FROM openjdk:8
MAINTAINER flyduck 'flyduck@flyduck.com'
ENV APP_HOME=/usr/local/app
ENV PROJECT_HOME=${APP_HOME}/springboot-docker-1.0-SNAPSHOT
COPY springboot-docker-1.0-SNAPSHOT.zip springboot-docker.zip
RUN mkdir -p ${APP_HOME} && mv springboot-docker.zip ${APP_HOME}
RUN cd ${APP_HOME} && unzip springboot-docker.zip && rm -rf springboot-docker.zip
RUN chmod 777 ${PROJECT_HOME}/bin/dockerrun.sh
EXPOSE 7003
ENTRYPOINT sh ${PROJECT_HOME}/bin/dockerrun.sh

Dockerfile镜像制作逻辑如下:

  1. 项目的运行依赖 Java 环境,所以镜像基于 openjdk:8镜像来构建。
  2. 容器中创建/user/local/app目录,将打包的zip文件拷贝到容器中,并移动到/user/local/app目录,然后解压zip文件到/user/local/app目录。
  3. 将程序的端口通过EXPOSE暴露出来。
  4. 最后就是配置一下启动命令,由于我们springboot项目使用的zip打包发布的方式,所以启动的方式和默认springboot项目有些区别。这里我们单独将启动配置放入dockerrun.sh文件,然后通过运行dockerrun.sh文件的方式启动程序。

dockerrun.sh运行程序配置如下:

# app home
APP_HOME=/usr/local/app/springboot-docker-1.0-SNAPSHOT
# java jar
PROJECT_NAME=${APP_HOME}/springboot-docker-1.0-SNAPSHOT.jar

#spring init load application properties or yml
CONF_FILE=${APP_HOME}/config/application.yml

# java opts.
JAVA_OPTS="-Xms64m -Xmx64m -Xmn64m"

#pid file
PID_CONF=${APP_HOME}/pid/process.pid

java ${JAVA_OPTS} -Djava.ext.dirs=${APP_HOME}/lib:$JAVA_HOME/jre/lib/ext -Dspring.config.location=${CONF_FILE} -jar ${PROJECT_NAME}

构建镜像以及推送到服务器

在IDEA中直接点击install,会先打包springboot项目,然后在dockerHost配置的服务器上构建镜像,最后推送到registerUrl配置的docker私服或者hub docker上。

 项目install完成后,登录linux服务器,可以看到镜像已经构建成功:

登录docker hub网站,可以看到镜像已经推送到docker hub上: 

 

总结

本文主要介绍如何在IDEA中将SpringBoot项目构建docker镜像并推送到私服或者docker hub上,本文通过使用docker-maven-plugin插件的方式,连接docker环境的linux服务器构建docker镜像,并推送到docker hub上。如果需要推送到私服上,只需要将pom.xml中推送的配置修改私服的配置即可。示例代码已经上传至Gitee上,感兴趣的小伙伴可以直接获取查看。

参考

CentOS上安装docker环境

Maven 插件之 docker-maven-plugin 的使用

Github上docker-maven-plugin源码地址

docker与Spring boot的集成:docker-maven-plugin使用
Maven 插件之 docker-maven-plugin 的使用
docker-maven-plugin的github地址

使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上 - 码农教程

详细docker-maven-plugin使用方法_服务器_网站技巧 - 编程客栈

私服docker registry server安装

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot项目使用docker-maven-plugin插件构建docker镜像以及推送到docker hub或docker registry私服 的相关文章

随机推荐

  • snapgene设计引物_分子克隆之引物设计(一)

    分子克隆之引物设计 一 目的 将目的基因Homosapiens interleukin 37利用引物扩增表达带上限制酶酶切位点 再与载体pcDNA3 1 3xFlag C酶切连接 师兄给定的酶切位点是 固定 BamH I GGATCC Xh
  • bilibili直播间接收监听和发送弹幕api

    参考文 https blog csdn net fei347795790 article details 111164254 Python实现自动发送B站直播弹幕软件 https blog csdn net fzq13994952987 a
  • 双目相机计算稠密深度点云详解教程

    点击上方 计算机视觉工坊 选择 星标 干货第一时间送达 作者 本文为3D视觉开发者社区特约作者 熊猫飞天授权发布 引言 本教程主要内容为介绍如何使用双目相机计算出稠密的3D点云 主要涉及到elas包的使用 通过KITTI数据集和ZED相机进
  • node生成唯一设备id(node-machine-id)

    npm安装 npm install node machine id yarn安装 yarn add node machine id 有 异步 同步 两种生成方式 import machineId machineIdSync from nod
  • MYSQL

    regexp extract regexp extract str regexp idx str是被解析的字符串或字段名 regexp 是正则表达式 idx是返回结果 取表达式的哪一部分 默认值为1 0表示把整个正则表达式对应的结果全部返回
  • Synchronized锁对象详解

    synchronized 是我们的同步的一种选择 加锁就要有对应的钥匙 这个钥匙分为 当前类对象 当前class对象 第三方对象 synchronized 可以修饰 变量 方法 我们以方法举例可以有如下的几种情况 修饰静态方法 这里默认的锁
  • Netty和Tomcat区别

    Netty与Tomcat区别 它们的区别不少 最大的区别就在于通信协议 这是众所周知的 Tomcat是一个服务器 它一定是基于Http协议的 它的实质是一个基于http协议的web容器 Netty则不同 Netty可以通过编程自定义各种协议
  • docker学习:dockerfile介绍

    这里主要是介绍dockerfile dockerfile就是用来构建docker镜像的脚本 脚本就意味着会有相关的dockerfile命令 也是我们要学习的一部分 构建步骤 1 编写一个Dockerfile文件 2 docker build
  • win10网络诊断为DNS服务器未响应,Windows10网络诊断DNS服务器未响应的解决办法

    Windows10网络诊断DNS服务器未响应怎么办 不少win10系统用户在遇到网络无法连接的时候 诊断网络会提示Windows10网络诊断DNS服务器未响应 那么这个问题要如何解决呢 下面小编为大家带来详细的解决办法 Windows10网
  • 机器学习的概率统计模型(附代码)(一)

    目录 概率论 1 1 离散随机变量分布 1 伯努利分布 2 二项分布 3 泊松分布 1 2 连续随机变量分布 1 均匀分布 2 指数分布 3 正态分布 总结 系列文章目录 概率论 概率论 是研究随机现象数量规律的数学分支 随机现象是相对于决
  • openai Python库

    OpenAI 是一个人工智能研究机构 他们开发了一个 Python 库 用于帮助开发者使用人工智能技术 这个库包含了许多用于自然语言处理 机器学习 深度学习和其他人工智能应用的工具和算法 您可以在 OpenAI 的 GitHub 页面上找到
  • Mysql连接问题

    连接MySQL长时间不连接后报错 com mysql cj core exceptions ConnectionIsClosedException No operations allowed after connection closed
  • eNSP华为模拟器使用——(11)eNSP模拟无线AC和AP

    eNSP模拟无线AC和AP 1 拓扑 2 需求 实现AC和AP二层关联 3 配置 dhcp enable interface Vlanif 1 ip address 192 168 10 1 255 255 255 0 dhcp selec
  • MySql 字符串数据类型

    字符串类型 CHAR CHAR类型是定长的 会根据定义的长度分配空间 当存储CHAR值时 mysql会删除所有的末尾空格 CHAR很适合存储很短的字符串 或者所有的值都接近同一个长度 例如 CHAR非常适合存储密码的MD5的值 因为这是一个
  • Java毕设 SSM中药店商城系统(含源码+论文)

    文章目录 1 项目简介 2 实现效果 2 1 界面展示 3 设计方案 3 1 概述 3 2 系统流程 3 3 系统结构设计 4 项目获取 1 项目简介 Hi 各位同学好呀 这里是M学姐 今天向大家分享一个今年 2022 最新完成的毕业设计项
  • id 重启event_系统已在未先正常关机的情况下重新启动 事件ID:41

    创建日期 2018 07 18 系统已在未先正常关机的情况下重新启动 事件ID 41 日志名称 System 来源 Microsoft Windows Kernel Power 日期 2018 7 17 23 55 06 事件 ID 41
  • do...while(0)的妙用

    在C 中 有三种类型的循环语句 for while 和do while 但是在一般应用中作循环时 我们可能用for和while要多一些 do while相对不受重视 但是 最近在读我们项目的代码时 却发现了do while的一些十分聪明的用
  • Km Kcat Kcat/Km

    max 是指 最大反应速度 当 底物浓度 足够大时 体系中 酶的活性中心达到饱和状态 其反应速度达到最大 由此可见 最大反应速度 max 随 酶浓度的变化而变化 kcat 指反应常数 catalytic constant kcat 可以由
  • python爬取小说(二)书籍基本信息爬取

    爬完数据目录和内容后 我们来爬取书籍的基本信息 在上篇博客的基础上 爬取书籍信息并存入字典 coding utf 8 import urllib request import bs4 import re import sqlite3 def
  • SpringBoot项目使用docker-maven-plugin插件构建docker镜像以及推送到docker hub或docker registry私服

    我们知道docker可将应用程序和基础设施层隔离 可更快地打包 测试以及部署应用程序 本文主要介绍SpringBoot项目如何构建docker镜像以及推送到私服或者docker hub服务器上 本文介绍的方式是使用docker maven