本文将介绍通过maven插件,一键实现将springboot应用构建成docker镜像并上传到远程仓库的过程。

一、Maven 生命周期

   idea 配置maven后,我们在右边栏能看到 Lifecycle这一栏, 里面包含了maven 所有的生命周期阶段所干的事。
在这里插入图片描述

生命周期阶段描述
验证 validate验证项目
编译 compile编译项目的源代码
测试 Test使用Junit运行测试
包装 package打jar包或者war包
检查 verify对集成测试的结果进行检查
安装 install将项目安装到本地仓库
部署 deploy部署项目到远程仓库

二、打包插件 dockerfile-maven-plugin

   该插件由 spotify官方维护,可以通过编写dockerfile来将springboot应用构建成docker镜像,dockerfile 可以放在根目录下即可。

1. 编写Dockerfile

FROM java:8
WORKDIR app
ADD ./target/my-shop-project.jar /app/my-app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar","/app/my-app.jar"]
MAINTAINER zhengbing

ENTRYPOINT 类似于CMD治理,在终端执行。
EXPOSE 指定运行端口为 8080.
WORKDIR 指定工作目录。
ADD 将项目添加到工作目录里。

2. 配置server

   我们可以通过在maven里配置远程仓库的ip 、用户名和密码实现访问远程镜像仓库。 在settings.xml文件中的 标签下添加需要访问远程仓库服务器的ip, 用户名和密码, 推荐使用此方式来认证,因为我们不会把关键信息放在远程git的配置里。

<servers>
<server>
	<id>116.62.146.90</id>       
	<username>***</username>
	<password>*****</password>
</server>
</servers>

3. 配置plugin

  在使用该plugin插件前,需要注意一点,因为我已经躺坑一小时~
注: 不要使用<PluginManageMent> 标签包住 plugins ,否则会出现打包后的jar 运行不起来,报没有主程序之类、no main manifest attribute之类的问题。
   在使用插件dockerfile-maven-plugin插件时,让我们先了解一下executions和goal标签的用法。

1) executions、phase和goal 标签介绍
  • <executions >标签在插件加载的时候可以通过该标签执行一下指令,配合子标签来使用,我们可以在放入一些需要执行的动作和指令。
  • <phase>标签用来捕获执行的maven声明周期里的某个阶段, maven 有以下三个标准的生命周期。
    clean:项目清理的处理
    default(或 build):项目部署的处理
    site:项目站点文档创建的处理
    我们可以在default周期里的里的某个阶段赋值给 <phase>标签
  • <goal >用goal标签执行生命周期里的某个动作, 例如在打包阶段执行打包和推送远程仓库的动作。
                  <execution>
                        <id>build_image</id>
                        <phase>package</phase>
                        <goals>
                            <!--如果package时不想用docker打包,就注释掉这个goal -->
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
2)dockerfile-maven-plugin和pom.xml完整配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.shop</groupId>
    <artifactId>my-shop</artifactId>
    <version>0.0.7-SNAPSHOT</version>
    <name>my-shop</name>
    <description>project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <docker.registry.url>116.62.146.90</docker.registry.url>
        <docker.namespace>my-shop</docker.namespace>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>

        </dependency>


        <!--MyBatis分页插件-->

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.10</version>
        </dependency>


        <!--集成druid连接池-->

        <dependency>

            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>

        </dependency>

        <!-- MyBatis 生成器 -->
        <dependency>

            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.3</version>

        </dependency>

        <!--Mysql数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>my-shop-project</finalName>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.13</version>
                <executions>
                    <execution>
                        <id>build_image</id>
                        <phase>package</phase>
                        <goals>
                            <!--如果package时不想用docker打包,就注释掉这个goal -->
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <contextDirectory>${project.basedir}</contextDirectory>
                    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
                    <repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
                    <tag>${project.version}</tag>
                    <buildArgs>
                        <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

   以上步骤只是我们整个过程的准备阶段和开胃菜,重点来了!!!

三、在windows环境下安装docker环境

1) 安装docker

docker for windows 官方下载地址: https://www.docker.com/products/docker-desktop
直接点击安装后, 不出意外就出现了报错问题! 一直报错:
WSL 2 installation is incomplete.
经过千辛万苦,终于找到了解决方法, 点击以下连接,更新wsl 镜像即可。
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
感谢下面的大佬帮忙解决安装不上的问题!
参考博客: https://xunmi.blog.csdn.net/article/details/108625840

接着点击package打包, 自动构建镜像并推送。
在这里插入图片描述
到最后推送一步时出现错误: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)!
在这里插入图片描述
果然不出所料, 还是报错了!!! 因为在linux环境下,如果不配置–insecure registry也会出现同样的问题。因为docker的默认交互方式是Https的,因此需要配置 --insecure 模式的交互。

如果启动时,出现报错:Failed to set version to docker-desktop: exit code: -1
以管理员的身份打开cmd命令窗口,输入命令:

netsh winsock reset

在这里插入图片描述
成功后,再次重启docker即可。
感谢大佬文章: https://blog.csdn.net/MShow006/article/details/103774672

2) 远程仓库开放支持Http上传镜像的方式

在docker.service文件中添加支持TCP的配置,将原先的配置更改如下:

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

如果不知道docker.sersvice所在的路径,可以参考我的另外一篇博客:
https://blog.csdn.net/qq_33036061/article/details/115293724

tcp端口配置好后,可以通过systemctl status docker.service 命令查看运行状况。
在这里插入图片描述

3) 本地配置远程仓库地址

参考linux的 解决方式, 找到docker的配置文件daemon.json文件,所在位置为用户下 ~/.docker/daemon.json。
在这里插入图片描述
编辑 daemon.json,添加远程仓库ip, 将ip 地址添加到 insecure-registries字段里, 同时也可以配置一下镜像,提升本地获取镜像和上传镜像的速度。将远程仓库的ip 放入到 insecure-registries, 因为我搭建的Harbor的默认使用的80端口,可以直接填写ip即可。

{
  "registry-mirrors": ["https://aiio42ii.mirror.aliyuncs.com"],
  "insecure-registries": ["116.62.146.90"],
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  }
}

修改完毕后,记得重启docker, 在桌面图标上邮件即可。
在这里插入图片描述
重启docker成功后,重复打包步骤!
在这里插入图片描述
推送成功!
在这里插入图片描述

GitHub 加速计划 / ha / harbor
23.24 K
4.68 K
下载
Harbor 是一个开源的容器镜像仓库,用于存储和管理 Docker 镜像和其他容器镜像。 * 容器镜像仓库、存储和管理 Docker 镜像和其他容器镜像 * 有什么特点:支持多种镜像格式、易于使用、安全性和访问控制
最近提交(Master分支:2 个月前 )
9e55afbb pull image from registry.goharbor.io instead of dockerhub Update testcase to support Docker Image Can Be Pulled With Credential Change gitlab project name when user changed. Update permissions count and permission count total Change webhook_endpoint_ui Signed-off-by: stonezdj <stone.zhang@broadcom.com> Co-authored-by: Wang Yan <wangyan@vmware.com> 13 天前
3dbfd422 Signed-off-by: wang yan <wangyan@vmware.com> 13 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐