目标: 将一个可执行的jar打包成docker image
源文件总共3个 Dockerfile, SampleController.java, pom.xml
- src
- main
- docker
- java
- com.kandebiji.ts.docker.hello
- 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! 就成功了。