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>

你们还在用这个插件吗?

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

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

所以这个插件我就不推荐咱们运用了,而是推荐官方的另外一个插件: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>

这个插件运用简略,功能更强壮。

新插件地址:

github.com/spotify/doc…

最新版插件的环境要求:

  • 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 教程实战源码在下面个库房:

github.com/javastacks/…

本篇一切实战源码到时也会悉数同步到上面,咱们 Star 一下吧!

四、构建 Docker 镜像

装备了 Maven 插件和 Dockerfile 文件后就能够开端构建 Docker 镜像了。

上面也说了,Docker 构建进程现已集成到了 Maven 的构建进程之中,那么能够直接运用mvn package就能够一起打包和构建 Docker 镜像了。

在 IDEA 中能够直接点击插件对应的指令运转:

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

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

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

五、IDEA 怎么操作 Docker?

一旦咱们创立了 Dockerfile 文件,IDEA 就会主动识别并提示咱们创立 Docker 衔接,当然,咱们也能够调出 Services 面板进行手动创立。

翻开 IDEA 中的 Services 面板:

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

然后点击 Add service > Docker Connection 来增加一个 Docker 衔接:

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

创立完后会主动衔接上,点击展开会显示 Docker 本地一切镜像和容器

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

如上图所示,便是咱们刚构建的镜像。

六、创立并运转容器

右击上面的镜像,选择 “Create Container” 菜单来创立并运转一个容器。

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

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

然后在 Build Log 和 Log 面板中能够看到容器运转日志和使用程序运转日志:

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

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

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

http://localhost:8080/docker/hello

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

OK,到这儿就布置并运转成功了。

七、总结

本文栈长运用 IntelliJ IDEA、Maven 用 Docker 布置了一个 Spring Boot 项目,尽管仅仅一个简略的示例,但一起为了合作写文章,全程硬是肝了几个小时。

本文仅仅一个简略的示例,所以进程并不杂乱,想要构建更加杂乱的使用,咱们需求学习 Dockerfile 文件的编写,这个下期再共享吧,重视大众号Java技能栈第一时间推送,不要走开。

假如仅仅运转一个 Spring Boot 使用的确没有必要用到 Docker,本文也是为了演示而上了 Docker。

但在实践工作中,Docker 就很有用了,Docker 一次将使用代码、JDK、环境变量、装备文件、以及其他装备信息都打包到一个镜像里面了,一次构建,处处运转,所以再也不用忧虑环境和装备问题了,开发测验运维都爽死。