@@ -37,6 +37,7 @@ | |||
<module>spring-boot-demo-war</module> | |||
<module>spring-boot-demo-elasticsearch</module> | |||
<module>spring-boot-demo-neo4j</module> | |||
<module>spring-boot-demo-docker</module> | |||
</modules> | |||
<packaging>pom</packaging> | |||
@@ -0,0 +1,25 @@ | |||
/target/ | |||
!.mvn/wrapper/maven-wrapper.jar | |||
### STS ### | |||
.apt_generated | |||
.classpath | |||
.factorypath | |||
.project | |||
.settings | |||
.springBeans | |||
.sts4-cache | |||
### IntelliJ IDEA ### | |||
.idea | |||
*.iws | |||
*.iml | |||
*.ipr | |||
### NetBeans ### | |||
/nbproject/private/ | |||
/build/ | |||
/nbbuild/ | |||
/dist/ | |||
/nbdist/ | |||
/.nb-gradle/ |
@@ -0,0 +1,20 @@ | |||
# 基础镜像 | |||
FROM openjdk:8-jdk-alpine | |||
# 作者信息 | |||
MAINTAINER "Yangkai.Shen 237497819@qq.com" | |||
# 添加一个存储空间 | |||
VOLUME /tmp | |||
# 暴露8080端口 | |||
EXPOSE 8080 | |||
# 添加变量,如果使用dockerfile-maven-plugin,则会自动替换这里的变量内容 | |||
ARG JAR_FILE=target/spring-boot-demo-docker.jar | |||
# 往容器中添加jar包 | |||
ADD ${JAR_FILE} app.jar | |||
# 启动镜像自动运行程序 | |||
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/urandom","-jar","/app.jar"] |
@@ -0,0 +1,116 @@ | |||
# spring-boot-demo-docker | |||
> 本 demo 主要演示了如何容器化一个 Spring Boot 项目。通过 `Dockerfile` 的方式打包成一个 images 。 | |||
## Dockerfile | |||
```dockerfile | |||
# 基础镜像 | |||
FROM openjdk:8-jdk-alpine | |||
# 作者信息 | |||
MAINTAINER "Yangkai.Shen 237497819@qq.com" | |||
# 添加一个存储空间 | |||
VOLUME /tmp | |||
# 暴露8080端口 | |||
EXPOSE 8080 | |||
# 添加变量,如果使用dockerfile-maven-plugin,则会自动替换这里的变量内容 | |||
ARG JAR_FILE=target/spring-boot-demo-docker.jar | |||
# 往容器中添加jar包 | |||
ADD ${JAR_FILE} app.jar | |||
# 启动镜像自动运行程序 | |||
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/urandom","-jar","/app.jar"] | |||
``` | |||
## 打包方式 | |||
### 手动打包 | |||
1. 前往 Dockerfile 目录,打开命令行执行 | |||
```bash | |||
$ docker build -t spring-boot-demo-docker . | |||
``` | |||
2. 查看生成镜像 | |||
```bash | |||
$ docker images | |||
REPOSITORY TAG IMAGE ID CREATED SIZE | |||
spring-boot-demo-docker latest bc29a29ffca0 2 hours ago 119MB | |||
openjdk 8-jdk-alpine 97bc1352afde 5 weeks ago 103MB | |||
``` | |||
3. 运行 | |||
```bash | |||
$ docker run -d -p 9090:8080 spring-boot-demo-docker | |||
``` | |||
### 使用 maven 插件打包 | |||
1. pom.xml 中添加插件 | |||
2. ```xml | |||
<properties> | |||
<dockerfile-version>1.4.9</dockerfile-version> | |||
</properties> | |||
<plugins> | |||
<plugin> | |||
<groupId>com.spotify</groupId> | |||
<artifactId>dockerfile-maven-plugin</artifactId> | |||
<version>${dockerfile-version}</version> | |||
<configuration> | |||
<repository>${project.build.finalName}</repository> | |||
<tag>${project.version}</tag> | |||
<buildArgs> | |||
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> | |||
</buildArgs> | |||
</configuration> | |||
<executions> | |||
<execution> | |||
<id>default</id> | |||
<phase>package</phase> | |||
<goals> | |||
<goal>build</goal> | |||
</goals> | |||
</execution> | |||
</executions> | |||
</plugin> | |||
</plugins> | |||
``` | |||
2. 执行mvn打包命令,因为插件中 `execution` 节点配置了 package,所以会在打包的时候自动执行 build 命令。 | |||
```bash | |||
$ mvn clean package -Dmaven.test.skip=true | |||
``` | |||
3. 查看镜像 | |||
```bash | |||
$ docker images | |||
REPOSITORY TAG IMAGE ID CREATED SIZE | |||
spring-boot-demo-docker 1.0.0-SNAPSHOT bc29a29ffca0 2 hours ago 119MB | |||
openjdk 8-jdk-alpine 97bc1352afde 5 weeks ago 103MB | |||
``` | |||
4. 运行 | |||
```bash | |||
$ docker run -d -p 9090:8080 spring-boot-demo-docker:1.0.0-SNAPSHOT | |||
``` | |||
## 参考 | |||
- docker 官方文档:https://docs.docker.com/ | |||
- Dockerfile 命令,参考文档:https://docs.docker.com/engine/reference/builder/ | |||
- maven插件使用,参考地址:https://github.com/spotify/dockerfile-maven |
@@ -0,0 +1,70 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<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/xsd/maven-4.0.0.xsd"> | |||
<modelVersion>4.0.0</modelVersion> | |||
<artifactId>spring-boot-demo-docker</artifactId> | |||
<version>1.0.0-SNAPSHOT</version> | |||
<packaging>jar</packaging> | |||
<name>spring-boot-demo-docker</name> | |||
<description>Demo project for Spring Boot</description> | |||
<parent> | |||
<groupId>com.xkcoding</groupId> | |||
<artifactId>spring-boot-demo</artifactId> | |||
<version>1.0.0-SNAPSHOT</version> | |||
</parent> | |||
<properties> | |||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> | |||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> | |||
<java.version>1.8</java.version> | |||
<dockerfile-version>1.4.9</dockerfile-version> | |||
</properties> | |||
<dependencies> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-web</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
</dependencies> | |||
<build> | |||
<finalName>spring-boot-demo-docker</finalName> | |||
<plugins> | |||
<plugin> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-maven-plugin</artifactId> | |||
</plugin> | |||
<plugin> | |||
<groupId>com.spotify</groupId> | |||
<artifactId>dockerfile-maven-plugin</artifactId> | |||
<version>${dockerfile-version}</version> | |||
<configuration> | |||
<repository>${project.build.finalName}</repository> | |||
<tag>${project.version}</tag> | |||
<buildArgs> | |||
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE> | |||
</buildArgs> | |||
</configuration> | |||
<executions> | |||
<execution> | |||
<id>default</id> | |||
<phase>package</phase> | |||
<goals> | |||
<goal>build</goal> | |||
</goals> | |||
</execution> | |||
</executions> | |||
</plugin> | |||
</plugins> | |||
</build> | |||
</project> |
@@ -0,0 +1,25 @@ | |||
package com.xkcoding.docker; | |||
import org.springframework.boot.SpringApplication; | |||
import org.springframework.boot.autoconfigure.SpringBootApplication; | |||
/** | |||
* <p> | |||
* 启动器 | |||
* </p> | |||
* | |||
* @package: com.xkcoding.docker | |||
* @description: 启动器 | |||
* @author: yangkai.shen | |||
* @date: Created in 2018-11-29 14:59 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@SpringBootApplication | |||
public class SpringBootDemoDockerApplication { | |||
public static void main(String[] args) { | |||
SpringApplication.run(SpringBootDemoDockerApplication.class, args); | |||
} | |||
} |
@@ -0,0 +1,27 @@ | |||
package com.xkcoding.docker.controller; | |||
import org.springframework.web.bind.annotation.GetMapping; | |||
import org.springframework.web.bind.annotation.RequestMapping; | |||
import org.springframework.web.bind.annotation.RestController; | |||
/** | |||
* <p> | |||
* Hello Controller | |||
* </p> | |||
* | |||
* @package: com.xkcoding.docker.controller | |||
* @description: Hello Controller | |||
* @author: yangkai.shen | |||
* @date: Created in 2018-11-29 14:58 | |||
* @copyright: Copyright (c) 2018 | |||
* @version: V1.0 | |||
* @modified: yangkai.shen | |||
*/ | |||
@RestController | |||
@RequestMapping | |||
public class HelloController { | |||
@GetMapping | |||
public String hello() { | |||
return "Hello,From Docker!"; | |||
} | |||
} |
@@ -0,0 +1,4 @@ | |||
server: | |||
port: 8080 | |||
servlet: | |||
context-path: /demo |
@@ -0,0 +1,16 @@ | |||
package com.xkcoding.docker; | |||
import org.junit.Test; | |||
import org.junit.runner.RunWith; | |||
import org.springframework.boot.test.context.SpringBootTest; | |||
import org.springframework.test.context.junit4.SpringRunner; | |||
@RunWith(SpringRunner.class) | |||
@SpringBootTest | |||
public class SpringBootDemoDockerApplicationTests { | |||
@Test | |||
public void contextLoads() { | |||
} | |||
} |