本文将介绍通过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.67 K
下载
Harbor 是一个开源的容器镜像仓库,用于存储和管理 Docker 镜像和其他容器镜像。 * 容器镜像仓库、存储和管理 Docker 镜像和其他容器镜像 * 有什么特点:支持多种镜像格式、易于使用、安全性和访问控制
最近提交(Master分支:1 个月前 )
c5d26723 chore(deps): bump github.com/go-openapi/runtime in /src Bumps [github.com/go-openapi/runtime](https://github.com/go-openapi/runtime) from 0.26.2 to 0.28.0. - [Release notes](https://github.com/go-openapi/runtime/releases) - [Commits](https://github.com/go-openapi/runtime/compare/v0.26.2...v0.28.0) --- updated-dependencies: - dependency-name: github.com/go-openapi/runtime dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: miner <yminer@vmware.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shengwen YU <yshengwen@vmware.com> Co-authored-by: miner <yminer@vmware.com> 14 天前
76624373 chore(deps): bump github.com/coreos/go-oidc/v3 in /src Bumps [github.com/coreos/go-oidc/v3](https://github.com/coreos/go-oidc) from 3.10.0 to 3.11.0. - [Release notes](https://github.com/coreos/go-oidc/releases) - [Commits](https://github.com/coreos/go-oidc/compare/v3.10.0...v3.11.0) --- updated-dependencies: - dependency-name: github.com/coreos/go-oidc/v3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Shengwen YU <yshengwen@vmware.com> Co-authored-by: miner <yminer@vmware.com> 14 天前
Logo

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

更多推荐