Docker image of Spring boot

目标: 将一个可执行的jar打包成docker image

源文件总共3个 Dockerfile, SampleController.java, pom.xml

  • src
    • main
      • docker
        • Dockerfile
      • java
        • com.kandebiji.ts.docker.hello
          • SampleController.java
  • pom.xml

一. 创建hello world

用spring boot新建一个hello world的web程序

File: pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<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 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.kandebiji.ts</groupId>
<artifactId>docker-war</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>docker-war</name>
<url>http://maven.apache.org</url>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

</project>

File: SampleController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.kandebiji.ts.docker.hello;

import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.stereotype.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.annotation.ApplicationScope;

@Controller
@EnableAutoConfiguration
public class SampleController {

@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World!";
}

public static void main(String[] args) throws Exception {
SpringApplication.run(SampleController.class, args);
}
}

Run:
右键运行, 然后浏览器访问 http://localhost:8080 , 看到 Hello World! 就成功了。

二. 打包可执行jar

使用spring boot plugin将web程序打包成可执行的jar

File: pom.xml 增加内容

1
2
3
4
5
6
7
8
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

Run:
mvn package
在 target 下面可以看到

  • docker-war-1.0-SNAPSHOT.jar
  • docker-war-1.0-SNAPSHOT.jar.original

然后 java -jar docker-war-1.0-SNAPSHOT.jar 启动
浏览器访问 http://localhost:8080 , 看到 Hello World! 就成功了。

三. 打包出images

增加docker maven plugin,在有maven, docker环境的linux机器上进行打包

File: pom.xml 增加内容

1
2
3
<properties>
<docker-plugin>1.3.1</docker-plugin>
</properties>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.14</version>
<configuration>
<imageName>ts/${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>

docker-maven里指定了Dockerfile的文件位置:src/main/docker
同时也将可执行的jar包放在plugin的根路径

File: Dockerfile

1
2
3
4
5
6
7
FROM java:8
VOLUME /tmp
ADD docker-war-1.0-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
EXPOSE 8080
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"

Dockerfile的主要含义:
基于java 8
增加根路径下的docker-war-1.0-SNAPSHOT.jar为app.jar
暴露 8080 端口
接收JAVA_OPTS的环境变量

Run:
mvn package
mvn docker:build
docker images 可以看到ts/docker-war
docker run –name tsdw -d -p 8080:8080 ts/docker-war
浏览器访问 http://localhost:8080 , 看到 Hello World! 就成功了。