使用docker-maven-plugin插件构建镜像并推送至私服Harbor

前言

如下所示,建议使用 Dockerfile Maven 插件,但该插件也停止维护更新了。因此先暂时使用docker-maven-plugin插件。


一、开启Docker服务器的远程访问

1.1 开启2375远程访问

默认的dokcer是不支持远程访问的,需要加点配置,开启Docker的远程访问

# 首先查看docker配置文件所在位置
systemctl status docker

# 会输出如下内容:
● docker.service - Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2020-12-17 14:22:23 CST; 18min ago
     Docs: http://docs.docker.com
 Main PID: 25113 (dockerd)

确定docker配置文件位置在:/etc/systemd/system/docker.service

然后编辑修改docker配置文件:

vi /lib/systemd/system/docker.service

找到包含ExecStart的这行,添加如下内容:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock \

其中,2375端口为docker远程服务端口,包含了docker可视化工具portainer,以及远程上传镜像的功能。

1.2 添加harbor镜像配置

编辑docker的配置文件:

vi /etc/docker/daemon.json
# 添加harbor镜像地址
{ 
 "insecure-registries": ["192.168.0.20:81"]
}

1.3 重启docker服务

# 后台配置重新加载
systemctl daemon-reload 
# 重启docker服务
systemctl restart docker.service
# 此处可能会出现docker无法启动情况,可能是由于docker.service配置文件修改错误,重新修改一次然后重新执行上述命令即可

#查看配置的端口号(2375)是否开启(非必要)
netstat -nlpt

1.4 验证是否开启成功

查看端口是否开启

#如果找不到netstat命令,使用yum install net-tools安装
[root@administrator ~]# netstat -antp | grep dockerd 
tcp6       0      0 :::2375                 :::*                    LISTEN      4514/dockerd  

直接curl看是否生效,测试通过localhost是否能使用Docker Engine API

curl http://127.0.0.1:2375/info
​curl http://localhost:2375/version
访问:http://ip:2375/version测试远程能否通过主机IP使用Docker Engine API

二、IDEA-Maven打包镜像

2.1 修改maven的配置文件settings.xml

在maven的配置文件中,添加harbor私服的用户名及密码:

 <servers>
    <server>
        <id>harbor</id>
        <username>harbor</username>
        <password>123456</password>
        <configuration>
            <email>123456@aliyun.com</email>
        </configuration>
    </server>
</servers>

2.2 修改SpringBoot项目中的pom.xml

添加属性配置,属性配置,在后面的插件配置里有引用这个:

  • docker.repostory 是docker私服地址,harbor配置完默认端口就是80,可以不带端口号。但是我将之改成81了
  • docker.registry.name 即是在harbor中配置的镜像仓库名,必须一致!这里我配的是test,因为harbor中配置的镜像仓库名也是test。
<properties>
    <!--docker插件-->
    <!-- docker私服地址,Harbor配置完默认地址就是80,默认不带端口号。但是我这里是81 -->
    <docker.repostory>192.168.10.11:81</docker.repostory>
    <!--项目名,需要和Harbor中的项目名称保持一致 -->
    <docker.registry.name>test</docker.registry.name>
</properties>

3.3 docker-maven-plugin插件配置

  • serverId 指定之前在maven的settings.xml中配置的server节点,这样maven会去找其中配置的用户名密码和邮箱
  • registryUrl 指定上面配置的properties属性,即是harbor私服的访问url,注意我设置的使用81端口,默认是80端口
  • imageName 指定上传harbor私服的镜像名,必须和harbor上的url、镜像仓库名保持一致。其中的docker.registry.name就是上面配置的properties属性

3.3.1 方式一:纯插件操作方式构建镜像

<build>
        <plugins>
            <!-- 解决资源文件的编码问题 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!-- maven打source包 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <!--<phase>verify</phase>-->
                        <goals>
                            <!--jar, jar-no-fork-->
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- spring Boot在编译的时候, 是有默认JDK版本的, 这里自定义指定JDK版本 -->
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>

            <!--拷贝依赖jar到指定的目录-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <!-- maven-jar-plugin用于生成META-INF/MANIFEST.MF文件的部分内容, -->
                            <addClasspath>true</addClasspath>
                            <!-- 指定依赖包所在目录。 -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!-- 指定MANIFEST.MF中的Main-Class, -->
                            <mainClass>org.fiend.SpringBootDockerApp</mainClass>
                            <useUniqueVersions>false</useUniqueVersions>
                        </manifest>
                    </archive>
                    <excludes>
                        <!--<exclude>*.properties</exclude>-->
                        <!--<exclude>*.yml</exclude>-->
                        <!--<exclude>*.xml</exclude>-->
                        <!--<exclude>org/fiend/controller/HomeController.class</exclude>-->
                    </excludes>
                </configuration>
            </plugin>

            <!-- ===================================== docker ================================== -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.2</version>
                <executions>
                    <execution>
                        <id>build-image</id>
                        <!--用户只需执行mvn package, 就会自动执行mvn docker:build-->
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!--
                    maven的 settings.xml文件添加如下配置:
                    <server>
                        <id>harbor</id>
                        <username>admin</username>
                        <password>admin123</password>
                        <configuration>
                            <email>admin@example.org</email>
                        </configuration>
                    </server>
                    -->
                    <serverId>harbor</serverId>
                    <registryUrl>http://${docker.repostory}</registryUrl>

                    <!--必须配置dockerHost标签(除非配置系统环境变量DOCKER_HOST)-->
                    <dockerHost>http://192.168.31.133:2375</dockerHost>

                    <!--指定基础镜像jdk1.8-->
                    <!--<baseImage>jdk:1.8</baseImage>-->
                    <baseImage>k8s-harbor:10001/my-project/openjdk11:jre-11.0.12_7-alpine</baseImage>

                    <!--Building image 192.168.0.20/demo1-->
                    <imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}</imageName>
                    <!--指定标签 这里指定的是镜像的版本,默认版本是latest-->
                    <imageTags>
                        <imageTag>${project.version}</imageTag>
                    </imageTags>

                    <!-- 指定 Dockerfile 路径-->
                    <!--镜像制作人本人信息 -->
                    <!--<maintainer>1090239782@qq.com</maintainer>-->

                    <!--切换到工作目录-->
                    <workdir>/home</workdir>

                    <!--执行容器运行的命令,添加如下指令, 打包成镜像后会自动启动容器-->
                    <!--<runs>-->
                    <!--    <run>sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories</run>-->
                    <!--    <run>apk update</run>-->
                    <!--    <run>apk add tzdata</run>-->
                    <!--    <run>cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</run>-->
                    <!--    <run>echo "Asia/Shanghai" > /etc/timezone</run>-->
                    <!--</runs>-->

                    <cmd>["java", "-version"]</cmd>

                    <!--${project.build.finalName}.jar是打包后生成的jar包的名字-->
                    <entryPoint>["java", "-jar", "-Xms896m", "-Xmx896m", "${project.build.finalName}.jar"]</entryPoint>

                    <!--<exposes>-->
                    <!--    &lt;!&ndash; 指定容器内部端口, 可以不写, 不写默认是项目中pom文件的端口 &ndash;&gt;-->
                    <!--    <expose>8080</expose>-->
                    <!--</exposes>-->

                    <!-- jar包位置-->
                    <resources>
                        <resource>
                            <targetPath>/home</targetPath>
                            <!-- target目录下-->
                            <directory>${project.build.directory}</directory>
                            <!--通过jar包名找到jar包-->
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                        <resource>
                            <targetPath>/home/lib</targetPath>
                            <!-- target目录下-->
                            <directory>${project.build.directory}/lib</directory>
                            <!--<include>*.jar</include>-->
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>

接下来只要先点击clean清除之前的所有打包的文件,然后再点击package打包文件即可完成镜像的构建,真正的一键部署

由于将 <phase>package</phase> 注释掉了,因此需要执行 docker:build 命令构建镜像:

如果要将镜像推送至Harbor仓库,执行docker:push命令:

删除docker镜像命令(不是删除Harbor中的镜像), docker:removeImage:

重新构建镜像时,记得先执行此命令,删除原来的镜像。

到此镜像构建成功,接下来使用Idea的Docker插件,创建容器跑起来(或者去Docker机器执行命令行)

通过ip访问

此种方式,直接通过Maven的package命令,即可实现镜像的制作,但是要推送镜像到harbor私服,还需执行docker:push,即:

点击push,将镜像推送到harbor私服中

3.3.2 方式二:结合Dockerfile文件构建镜像

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>1.0.0</version>
  <configuration>
      <serverId>my-hub</serverId>
      <registryUrl>http://${docker.repostory}</registryUrl>
      <!--必须配置dockerHost标签(除非配置系统环境变量DOCKER_HOST)-->
      <dockerHost>http://192.168.10.11:2375</dockerHost>
      <!--Building image 192.168.10.11/demo1-->
      <imageName>${docker.repostory}/${docker.registry.name}/${project.artifactId}:${project.version}</imageName>
      <!-- 指定 Dockerfile 路径-->
      <dockerDirectory>${basedir}/</dockerDirectory>
      <!-- jar包位置-->
      <resources>
          <resource>
          <targetPath>/ROOT</targetPath>
          <!-- target目录下-->
          <directory>${project.build.directory}</directory>
          <!--通过jar包名找到jar包-->
          <include>${pack-name}</include>
          </resource>
      </resources>
  </configuration>
</plugin>

那么Dockerfile文件中的jar包名相应需要修改:

FROM java:8
WORKDIR /ROOT
ADD /ROOT/demo1-2.jar /ROOT/
ENTRYPOINT ["java", "-jar", "demo1-2.jar"]

点击pakage打包,target 上生成了springboot工程的jar包

完了之后,点击docker bulid 构建工程镜像

然后点击push,将镜像推送到harbor私服中

3.4 docker-maven-plugin操作容器

此部分内容参考:

  • 掘金:MacroZheng:还在手动部署SpringBoot应用?试试这个自动化插件! - 掘金
  • docker-maven-plugin不仅可以操作镜像,还可以操作容器,比如我们以前需要使用如下Docker命令来运行容器;
docker run -p 8080:8080 —name mall-tiny-fabric \
—link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny-fabric/logs:/var/logs \
-d 192.168.3.101:5000/mall-tiny/mall-tiny-fabric:0.0.1-SNAPSHOT
  • 现在我们只需在插件中配置即可,在<image>节点下添加<run>节点可以定义容器启动的行为:
<!--在<image>节点下添加<run>节点可以定义容器启动的行为, 该配置不会自动启动打包后的镜像-->
<image>
    <!--定义容器启动行为-->
    <run><!--设置容器名,可采用通配符-->
        <containerNamePattern>${project.artifactId}</containerNamePattern>

        <!--设置端口映射-->
        <ports>
            <port>8600:8600</port>
        </ports>

        <!--设置容器间连接-->
        <!--<links>-->
        <!--    <link>mysql:db</link>-->
        <!--</links>-->

        <!--设置容器和宿主机目录挂载-->
        <!--<volumes>-->
        <!--    <bind>-->
        <!--        <volume>/etc/localtime:/etc/localtime</volume>-->
        <!--        <volume>/mydata/app/${project.artifactId}/logs:/var/logs</volume>-->
        <!--    </bind>-->
        <!--</volumes>-->
    </run>
</image>
  • 之后直接使用docker:start命令即可启动了;
# mvn docker:start
[root@linux-local mydata]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
95ce77c0394b 192.168.3.101:5000/mall-tiny/mall-tiny-fabric:0.0.1-SNAPSHOT “java -jar /mall-tin…” 32 seconds ago Up 31 seconds 0.0.0.0:8080->8080/tcp mall-tiny-fabric
  • 停止容器使用docker:stop命令即可;
mvn docker:stop
  • 删除容器使用docker:remove命令,是不是很方便!
mvn docker:remove

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/88803.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

bh002- Blazor hybrid / Maui 保存设置快速教程

1. 建立工程 bh002_ORM 源码 2. 添加 nuget 包 <PackageReference Include"BootstrapBlazor.WebAPI" Version"7.*" /> <PackageReference Include"FreeSql" Version"*" /> <PackageReference Include"FreeSql.…

MyBatis分页插件PageHelper的使用及特殊字符的处理

目录 一、PageHelper简介 1.什么是分页 2.PageHelper是什么 3.使用PageHelper的优点 二、PageHelper插件的使用 原生limit查询 1. 导入pom依赖 2. Mybatis.cfg.xml 配置拦截器 3. 使用PageHelper进行分页 三、特殊字符的处理 1.SQL注入&#xff1a; 2.XML转义&#…

【Linux】【驱动】第一个相对完整的驱动编写

【Linux】【驱动】第一个相对完整的驱动编写 续1.驱动部分的代码2 app 代码3 操作相关的代码 续 这个章节会讲述去直接控制一个GPIO&#xff0c;高低电平。 因为linux不允许直接去操作寄存器&#xff0c;所以在操作寄存器的时候就需要使用到函数&#xff1a;ioremap 和iounma…

线性代数的学习和整理10:各种特殊类型的矩阵(草稿-----未完成 建设ing)

目录 1 图形化分类 1.1对称矩阵 1.2 梯形矩阵 1.3 三角矩阵 1.3.1 上三角矩阵 1.4 对角线矩阵 2 按各自功能分 2.1 等价矩阵 2.2 增广矩阵 2.3 伴随矩阵 2.4 正交矩阵 2.5 正交矩阵 2.6 相似矩阵 1 图形化分类 1.1对称矩阵 1.2 梯形矩阵 1.3 三角矩阵 1.3.1 上…

【ARM-Linux】项目,语音刷抖音项目

文章目录 所需器材装备操作SU-03T语音模块配置代码&#xff08;没有用wiring库&#xff0c;自己实现串口通信&#xff09;结束 所需器材 可以百度了解以下器材 orangepi-zero2全志开发板 su-03T语音识别模块 USB-TTL模块 一个安卓手机 一根可以传输的数据线 装备操作 安…

windows Etcd的安装与使用

一、简介 etcd是一个分布式一致性键值存储&#xff0c;其主要用于分布式系统的共享配置和服务发现。 etcd由Go语言编写 二、下载并安装 1.下载地址&#xff1a; https://github.com/coreos/etcd/releases 解压后的目录如下&#xff1a;其中etcd.exe是服务端&#xff0c;e…

C语言弯道超车必做好题锦集(编程题)

目录 前言&#xff1a; 1.计算日期到天数转换 2.尼科彻斯定理 3.密码检查 4.图片整理 5.寻找数组的中心下标 6.字符个数统计 7.多数元素 前言&#xff1a; 编程想要学的好&#xff0c;刷题少不了&#xff0c;我们不仅要多刷题&#xff0c;还要刷好题&#xff01;为此我…

C# .aspx网页获取RFID读卡器HTTP协议提交的访问文件Request获得卡号、机号,Response回应驱动读卡器显示响声

本示例使用的设备&#xff1a;RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) 服务端代码&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.…

iptables的使用规则

环境中为了安全要限制swagger的访问&#xff0c;最简单的方式是通过iptables防火墙设置规则限制。 在测试服务器中设置访问swagger-ui.html显示如下&#xff0c;区分大小写&#xff1a; iptables设置限制访问9783端口的swagger字段的请求&#xff1a; iptables -A INPUT -p t…

Python可视化工具库实战

Matplotlib Matplotlib 是 Python 的可视化基础库&#xff0c;作图风格和 MATLAB 类似&#xff0c;所以称为 Matplotlib。一般学习 Python 数据可视化&#xff0c;都会从 Matplotlib 入手&#xff0c;然后再学习其他的 Python 可视化库。 Seaborn Seaborn 是一个基于 Matplo…

Vue 中 diff 算法原理

一、Diff 概念 Vue 基于虚拟 DOM 做更新。diff 算法的核心就是比较两个虚拟节点的差异&#xff0c;返回一个 patch 对象&#xff0c;这个对象的作用就是存储两个节点不同的地方&#xff0c;最后用 patch 里记录的信息进行更新真实DOM。 diff 算法的在很多场景下都有应用&#…

计算机竞赛 地铁大数据客流分析系统 设计与实现

文章目录 1 前言1.1 实现目的 2 数据集2.2 数据集概况2.3 数据字段 3 实现效果3.1 地铁数据整体概况3.2 平均指标3.3 地铁2018年9月开通运营的线路3.4 客流量相关统计3.4.1 线路客流量排行3.4.2 站点客流量排行3.4.3 入站客流排行3.4.4 整体客流随时间变化趋势3.4.5 不同线路客…

6.oracle中listagg函数使用

1. 作用 可以实现行转列&#xff0c;将多列数据聚合为一列&#xff0c;实现数据的压缩 2. 语法 listagg(measure_expr&#xff0c;delimiter) within group ( order by order_by_clause); 解释&#xff1a; measure_expr可以是基于任何列的表达式 delimiter分隔符&#xff0c…

创建harbor仓库并进行一些操作

文章目录 前言一、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。二、安装搭建私有仓库 Harbor1、安装docker-compse2、安装harbor 3、修改配置文件4、运行脚本5 登入harbor仓库总结 前言 本篇文章需要完成的以下几个操作&#xff1a; 使用mysql:5.6和 ownclo…

爬虫逆向实战(二十)--某99网站登录

一、数据接口分析 主页地址&#xff1a;某99网站 1、抓包 通过抓包可以发现登录接口是AC_userlogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”可以发现txtPassword和aws是加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无…

【Git版本控制工具使用---讲解一】

Git版本控制工具使用 安装设置用户名签名和邮箱Git常用的命令 初始化本地库查看本地状态Git 命令添加暂存区提交本地库查看版本信息修改文件版本穿梭 安装 首先根据自身电脑的配置选择性的安装是32位的还是64位的Git版本控制工具 我这边安装的是64位的 以下是我安装的时候的过…

C语言:选择+编程(每日一练Day8)

目录 选择题&#xff1a; 题一&#xff1a; 题二&#xff1a; 题三&#xff1a; 题四&#xff1a; 题五&#xff1a; 编程题&#xff1a; 题一&#xff1a;字符个数统计 思路一&#xff1a; 题二&#xff1a;多数元素 思路一&#xff1a; 本人实力有限可能对一些…

事件捕获和事件冒泡

事件捕获和事件冒泡与事件流有关系。 以下代码&#xff0c;点击 aa &#xff0c;控制台会打印什么呢&#xff1f; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content&q…

Docker(一)-安装、架构、业务开发常用命令、Dockerile、镜像卷、镜像仓库

基于业务开发使用Docker Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序&#xff0c;并可以缩短从编写到部署运行代码…

App Inventor 2 开发 ChatGPT 对话App

ChatGPT大家应该不会陌生&#xff0c;它的回答内容非常的专业及深入&#xff0c;具有实际的可指导性。我们通过App Inventor 2开发一个简单的对话App&#xff0c;先看效果&#xff1a; App Inventor 2 ChatGPT教育领域对话演示 代码块如下&#xff1a; 用到的核心组件“ChatBot…