仅想在Docker里运行一个Spring Boot项目,捣鼓了许久。。。
本文主要适用于Windows环境下的Docker
一、运行环境
- Windows 10
- Maven 3.5
- Docker 18.06.1-ce-win73 (19507)
二、创建Spring Boot项目
空空如也。。。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
@RestController
@SpringBootApplication
public class GreetApplication {
@GetMapping("hello")
public String hello() {
return "Hello Docker!";
}
public static void main(String[] args) {
SpringApplication.run(GreetApplication.class, args);
}
}
三、创建一个Dockerfile
参考:https://spring.io/guides/gs/spring-boot-docker/
内容:和官方指南完全一样;下边只说FROM,其他几个官网解释的很好
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
1、什么是FORM
我们定制镜像,需要以一个镜像为基础,FROM 指代的就是。
2、官方用哪个
openjdk:8-jdk-alpine
因为不知道为啥是这个,毕竟也是第一次见,就先试试其他的。
依次下载了他们,openjdk、oracle/openjdk 和 openjdk:8-jdk-alpine

3、具体差异
3.1 使用 openjdk

3.2 使用 openjdk:8-jdk-alpine

差异很明显吧,镜像小了874MB(......)
四、修改pom.xml配置
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<skipTests>true</skipTests>
<docker.image.prefix>amos</docker.image.prefix>
</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>greet</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>1.3.6</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
五、指南正文
1、Maven 不识别 docker:build
你刚开始百度到的命令可能是:mvn clean package docker:build,然后运行,接着就失败了...
[ERROR] No plugin found for prefix 'docker' in the current project and in the plugin groups...
解决办法是修改 maven 的配置文件 settings.xml。( pluginGroups 在 settings.xml 中的位置很靠上)
<pluginGroups>
<pluginGroup>com.spotify</pluginGroup>
</pluginGroups>
后来,你可能会发现,使用mvn clean package dockerfile:build,就不会有上边的错误。这个仇先记下了。。。
2、Must specify baseImage if dockerDirectory
接下来,开始运行了,以为正常了。
[ERROR] ... Exception caught: Must specify baseImage if dockerDirectory is null -> [Help 1]
翻到https://github.com/spotify/dockerfile-maven,你会发现应该使用mvn clean package dockerfile:build,而不是mvn clean package docker:build。
3、Connect to localhost:2375 ... failed
[ERROR] ... Connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: Connection refused: connect
右键运行中的docker,Settings,接着如下图

六、完
生成镜像到本地:mvn package dockerfile:build
查看镜像:docker images
运行镜像:docker run -d -p 8088:8080 --name greet amos/greet
浏览器内访问:
