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>
这个插件运用简略,功能更强壮。
新插件地址:
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 中能够直接点击插件对应的指令运转:
插件会根据 Dockerfile 文件构建,文件中有多少条指令,就分为几个步骤构建,假如没问题就会构建成功。
五、IDEA 怎么操作 Docker?
一旦咱们创立了 Dockerfile 文件,IDEA 就会主动识别并提示咱们创立 Docker 衔接,当然,咱们也能够调出 Services 面板进行手动创立。
翻开 IDEA 中的 Services 面板:
然后点击 Add service > Docker Connection 来增加一个 Docker 衔接:
创立完后会主动衔接上,点击展开会显示 Docker 本地一切镜像和容器:
如上图所示,便是咱们刚构建的镜像。
六、创立并运转容器
右击上面的镜像,选择 “Create Container” 菜单来创立并运转一个容器。
填写相应的运转参数,再点击运转按钮,容器即开端运转。
然后在 Build Log 和 Log 面板中能够看到容器运转日志和使用程序运转日志:
项目在 Docker 中运转起来了,然后再访问下上面写的测验接口:
http://localhost:8080/docker/hello
OK,到这儿就布置并运转成功了。
七、总结
本文栈长运用 IntelliJ IDEA、Maven 用 Docker 布置了一个 Spring Boot 项目,尽管仅仅一个简略的示例,但一起为了合作写文章,全程硬是肝了几个小时。
本文仅仅一个简略的示例,所以进程并不杂乱,想要构建更加杂乱的使用,咱们需求学习 Dockerfile 文件的编写,这个下期再共享吧,重视大众号Java技能栈第一时间推送,不要走开。
假如仅仅运转一个 Spring Boot 使用的确没有必要用到 Docker,本文也是为了演示而上了 Docker。
但在实践工作中,Docker 就很有用了,Docker 一次将使用代码、JDK、环境变量、装备文件、以及其他装备信息都打包到一个镜像里面了,一次构建,处处运转,所以再也不用忧虑环境和装备问题了,开发测验运维都爽死。