赞
踩
随着微服务概念的持续演进,容器化技术的火爆,对于广大基于 Java 语言开发的程序员而言,将开发好的项目快速构建为 Docker 镜像推送至服务器也成为了一项必会的技能。
伴随着技术的不断更新,基于 Spring Boot 构建 Docker 镜像的方式也是五花八门,大致分为以下几种:
Cloud Native Buildpacks(Spring Boot 2.3+ 版本开始支持)
Google 的 jib-maven-plugin
fabric8 和 spotify 的 docker-maven-plugin
下面我们一起学习如何通过这几种方式把 Spring Boot 应用构建成 Docker 镜像。
Spring Boot 项目
先准备一个简单的基于 Maven 的 Spring Boot 项目,方便实践。
pom
继承 spring-boot-starter-parent,引入 Spring Boot 父类依赖。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
</parent>
添加 spring-boot-starter-web 依赖。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
配置文件
配置文件无需添加任何内容,基于约定优于配置,使用默认配置即可。
启动类
@SpringBootApplication
public class SpringBootDockerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDockerApplication.class, args);
}
}
控制层
@RestController
public class DockerController {
@RequestMapping("/")
public String index() {
return "Hello Spring Boot Docker!";
}
}
启动访问
启动项目,浏览器访问:http://localhost:8080/,页面返回:Hello Spring Boot Docker!,说明项目OK,准备工作已完成。
Docker 安装
关于 Docker 的环境准备请参考:Docker 安装及配置镜像加速。
Cloud Native Buildpacks
简介
正所谓哪里有需求,哪里就有市场,传统的方式使用 Spring Boot 构建 Docker 镜像需要我们自己去维护 Dockerfile。
而从 Spring Boot 2.3 版本开始,借助 Buildpacks 的支持,无需 Dockerfile 即可将任何 Spring Boot 2.3 及更高版本的应用程序进行容器化。Spring Boot 2.4 版本开始又进行了进一步优化:官网文档。
说明
Spring Boot 可以快速将 Java 应用程序构建为 Docker 镜像推送至指定远程仓库:
DockerHub 官方公共仓库(DockerHub 官方公共仓库国内访问速度堪忧,不推荐)
阿里云镜像仓库(需要在阿里云登录账号自行创建仓库)
自建私有镜像仓库(本文演示方案)私有镜像仓库搭建请参考:Docker 私有镜像仓库的搭建及认证
使用
完整配置如下:
org.springframework.boot spring-boot-maven-plugin true http://192.168.10.10:2375 false<!-- 推送至指定镜像仓库(公共仓库、阿里云仓库、私有仓库等) --> <publishRegistry> <username>用户名</username> <password>密码</password> <url>仓库地址</url> </publishRegistry> </docker> <!-- 镜像配置 --> <image> <!-- 镜像名:版本号 --> <name>${project.artifactId}:${project.version}</name> <!-- 执行完 build 自动 push --> <publish>true</publish> </image> </configuration> </plugin> </plugins>
mvn spring-boot:build-image -Dmaven.test.skip=true
网络问题
构建过程中需要从 github 下载相关的依赖,这个过程大概率会失败。建议通过配置代理或者使用国外 ECS 来解决。
[INFO] Building image 'docker.io/library/spring-boot-docker:1.0-SNAPSHOT'
[INFO]
[INFO] > Pulling builder image 'docker.io/paketobuildpacks/builder:base' 100%
[INFO] > Pulled builder image 'paketobuildpacks/builder@sha256:c9141bd56f3e837a9d618c9e6748b8d5ab0783728a4924bbca41c7e8f
b21fca5'
[INFO] > Pulling run image 'docker.io/paketobuildpacks/run:base-cnb'
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。