使用 Docker 部署 Spring Boot 项目,带劲!!

简介: Docker 一次构建、处处运行及快速启停的特性,在微服务架构中有着举足轻重的地位,具体的概念性的东西就不介绍了,不懂的点击这里阅读 Docker 基础教程。

Docker 一次构建、处处运行及快速启停的特性,在微服务架构中有着举足轻重的地位,具体的概念性的东西就不介绍了,不懂的点击这里阅读 Docker 基础教程。


本篇栈长主要介绍下如何通过 IntelliJ IDEA、Maven 来操作 Docker 部署 Spring Boot 项目,这也是我们 Java 程序员最关心的开发实战。


一、Maven 插件配置

首先在 Maven pom.xml 配置文件中加入 Docker 的 Maven 插件。


我看网上很多人还在用 docker-maven-plugin 插件:

<properties>
    <docker.image.prefix>docker</docker.image.prefix>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.2.2</version>
            <configuration>
                <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                <dockerDirectory>src/main/docker</dockerDirectory>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>
    </plugins>
</build>

你们还在用这个插件吗?

栈长从官方仓库看到,这个插件官方已经不维护了:


所以这个插件我就不推荐大家使用了,而是推荐官方的另外一个插件:dockerfile-maven

<build>
    <plugins>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.4.13</version>
            <executions>
                <execution>
                    <id>default</id>
                    <goals>
                        <goal>build</goal>
                        <goal>push</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <repository>javastack/${project.name}</repository>
                <tag>${project.version}</tag>
                <buildArgs>
                    <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                </buildArgs>
                <dockerfile>src/main/docker/Dockerfile</dockerfile>
            </configuration>
        </plugin>
    </plugins>
</build>

这个插件使用简单,功能更强大。


新插件地址:


https://github.com/spotify/dockerfile-maven


最新版插件的环境要求:


JDK 7+


Apache Maven 3.5.2+


这个插件的牛逼之处在于:


1、从插件名称就可以知道,这个插件是基于 Dockerfile 文件进行构建 Docker 项目的,专注 Dockerfile 文件,所以需要一个 Dockerfile 文件,Dockerfile 也是构建 Docker 项目的基石。


2、把 Docker 的构建过程集成到了 Maven 的构建过程之中,如果使用默认的配置,使用 mvn package 命令就能打包成一个 Docker 镜像,使用 mvn deploy 命令就能推送到 Docker 仓库。


3、使我们的构建目标更明确,如我们先使用 mvn dockerfile:build 然后再 mvn dockerfile:tag,然后再 mvn dockerfile:push,也可以满足同时构建再推送的场景,如: mvn dockerfile:build dockerfile:push,这都没问题的。


4、与 Maven 构建集成,我们可以在一个项目中依赖另外一个项目的 Docker 镜像,Maven 将以正确的顺序构建项目。当我们运行涉及多个服务的集成测试用例时,这很有用的。


二、Docker 配置

Dockerfile 是创建 Docker 镜像的基本配置文件,本身是一个文本文件。


插件默认加载位置为项目所在根目录,因为我在上面的 Maven 插件配置中指明了路径。所以,在 src/main/docker/ 目录下添加一个 Dockerfile 文件:

# 添加 Java 8 镜像来源
FROM java:8
# 添加参数
ARG JAR_FILE
# 添加 Spring Boot 包
ADD target/${JAR_FILE} app.jar
# 执行启动命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

值得说一下的是,上面的 JAR_FILE 参数就是从 Docker Maven 插件中指定的构建参数,这也是这个插件的强大之处,可以翻到文章上面去看一下。


具体的 Dockerfile 文件细节比较多,这里就不展开详细介绍了,后面我再开一篇单独介绍,关注公众号Java技术栈第一时间推送。


三、添加测试接口

添加一个测试接口,以便后面部署测试。

package cn.javastack.springboot.docker;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * 微信公众号:Java技术栈
 */
@RestController
@SpringBootApplication
public class DockerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DockerApplication.class);
    }
    @GetMapping("/docker/hello")
    public String helloDocker() {
        return "hello docker";
    }
}

Spring Boot 基础性的知识和搭建过程就不介绍了,不熟悉的可以关注公众号Java技术栈,在后台回复关键字 "boot" 阅读我之前写的系列教程。


所有 Spring Boot 教程实战源码在下面个仓库:


https://github.com/javastacks/spring-boot-best-practice


本篇所有实战源码到时也会全部同步到上面,大家 Star 一下吧!


四、构建 Docker 镜像

配置了 Maven 插件和 Dockerfile 文件后就可以开始构建 Docker 镜像了。


上面也说了,Docker 构建过程已经集成到了 Maven 的构建过程之中,那么可以直接使用 mvn package 就可以同时打包和构建 Docker 镜像了。


在 IDEA 中可以直接点击插件对应的命令运行:

image.png

image.png

件会根据 Dockerfile 文件构建,文件中有多少条命令,就分为几个步骤构建,如果没问题就会构建成功。


五、IDEA 怎么操作 Docker?

一旦我们创建了 Dockerfile 文件,IDEA 就会自动识别并提示我们创建 Docker 连接,当然,我们也可以调出 Services 面板进行手动创建。


打开 IDEA 中的 Services 面板:


image.png


然后点击 Add service > Docker Connection 来添加一个 Docker 连接:


image.png


创建完后会自动连接上,点击展开会显示 Docker 本地所有镜像和容器:


image.png


如上图所示,就是我们刚构建的镜像。


六、创建并运行容器

右击上面的镜像,选择 "Create Container" 菜单来创建并运行一个容器。


image.png


填写相应的运行参数,再点击运行按钮,容器即开始运行。


然后在 Build Log 和 Log 面板中可以看到容器运行日志和应用程序运行日志:



image.png



项目在 Docker 中运行起来了,然后再访问下上面写的测试接口:


http://localhost:8080/docker/hello

image.png



OK,到这里就部署并运行成功了。


七、总结

本文栈长使用 IntelliJ IDEA、Maven 用 Docker 部署了一个 Spring Boot 项目,虽然只是一个简单的示例,但同时为了配合写文章,全程硬是肝了几个小时。


本文只是一个简单的示例,所以过程并不复杂,想要构建更加复杂的应用,我们需要学习 Dockerfile 文件的编写,这个下期再分享吧,关注公众号Java技术栈第一时间推送,不要走开。


如果只是运行一个 Spring Boot 应用确实没有必要用到 Docker,本文也是为了演示而上了 Docker。


但在实际工作中,Docker 就很有用了,Docker 一次将应用代码、JDK、环境变量、配置文件、以及其他配置信息都打包到一个镜像里面了,一次构建,处处运行,所以再也不用担心环境和配置问题了,开发测试运维都爽死。


好了,本文就到这里了,后续栈长还会带来更多 Docker 实用性的教程,比如 Docker 私库的搭建及其他实用的玩法等,关注公众号Java技术栈第一时间推送。


本文所有实战源码已上传到这个仓库:


https://github.com/javastacks/spring-boot-best-practice


觉得不错,在看、分享转发一下,写文章不易,需要你们的鼓励,感谢各位老铁们!


相关文章
|
4月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
840 108
|
2月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
1143 4
|
4月前
|
运维 Devops 持续交付
揭秘 Docker 自动部署神器 Websoft9:热门开源软件一键部署
在企业IT建设中,软件部署常面临效率低、易出错等问题。通过Docker与自动化工具,可实现高效、标准化和可追溯的部署流程,提升企业应用交付效率,降低运维门槛,助力中小企业实现自动化部署。
304 5
揭秘 Docker 自动部署神器 Websoft9:热门开源软件一键部署
|
3月前
|
JavaScript 算法 前端开发
【Docker项目实战】使用Docker部署paopao-ce微社区
【Docker项目实战】使用Docker部署paopao-ce微社区
384 84
【Docker项目实战】使用Docker部署paopao-ce微社区
|
4月前
|
运维 Cloud Native 开发者
Docker:现代化应用开发与部署的神器
Docker:现代化应用开发与部署的神器
252 101
|
4月前
|
设计模式 Linux 开发工具
Docker部署会吗?
本段内容主要介绍了Docker常用命令、Linux基础指令及日志查看方法,还涉及SpringMVC的执行流程、设计模式与注解,适合用于面试中技术能力的展示。
153 0
|
2月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
157 5
|
3月前
|
存储 Docker Python
docker 部署 sftp
本文介绍SFTP服务的部署与配置,包括users.conf用户配置规则、Docker容器运行命令及上传目录权限说明,重点解析atmoz/sftp镜像的chroot机制与子目录映射,确保用户登录后正确访问/upload目录,并提供Python脚本实现文件上传示例。
285 12
docker 部署 sftp
|
3月前
|
运维 Linux 数据库
基于 Docker 部署 n8n 指南,新手一看就会
本教程详解如何通过 Docker 快速部署开源自动化工具 n8n,适合新手快速上手。内容涵盖官方部署步骤、常见难点及第三方一键部署方案,助你高效搭建自动化工作流平台。
1257 6