目标:把Spring Boot项目布署到docker上。
参考文章:
- https://www.baeldung.com/dockerizing-spring-boot-application#Dockerize
- https://spring.io/guides/gs/spring-boot-docker/
布署流程:
![](https://img.haomeiwen.com/i15522532/0c24daac89c60401.png)
1. 首先新建一个Spring Boot项目
1.1 依赖(略):
- spring-boot-starter-parent
- spring-boot-starter-web
除了依赖以外,还需要配置build plugin:这样通过mvn clean package打出来的包,可以找到main class:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
1.2 SpringBootDockerApplication:
@SpringBootApplication
@RestController
public class SpringBootDockerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDockerApplication.class, args);
}
@Value("${custom.version}")
private String customVersion;
@GetMapping("custom-version")
public String getCustomVersion() {
return customVersion;
}
@GetMapping("hello")
public String helloWorld() {
return "hello world!";
}
}
1.3 application.yaml定义:
custom:
version: ${version}
2. 本地通过maven打包成fat jar
mvn clean package
SpringBootDockerTest-1.0-SNAPSHOT.jar
3. 编写Dockerfile
Dockerfile的目的主要是为了生成镜像(Image),然后才是run它。
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=SpringBootDockerTest-1.0-SNAPSHOT.jar
COPY ${JAR_FILE} SpringBootDockerTest.jar
ENTRYPOINT ["java", "-jar", "-Dcustom.version=v1.0", "SpringBootDockerTest.jar"]
Dockerfile官网参考:https://docs.docker.com/engine/reference/builder/
比如FROM关键字的解释,戳:https://docs.docker.com/engine/reference/builder/#from
当然中文博客也有很多相关的解释,百度之。
-
FROM
指定基础镜像,如上述是从基础镜像(openjdk:8-jdk-alpine)开始构建。一般基础镜像都是在https://docs.docker.com/docker-hub/repos/上的。一般Dockerfile都是以FROM开头。如果是基础镜像是空白的,可以使用:FROM scratch
-
ARG
构建参数(与ENV想类似,设置环境变量),ARG只供构建image时使用。上述例子,将参数JAR_FILE的值指定为maven build的结果jar包。 -
COPY
复制文件,从源文件复制到新的文件,上述例子把SpringBootDockerTest-1.0-SNAPSHOT.jar复制成SpringBootDockerTest.jar -
ENTERPOINT
入口点,有点像CMD指令。在Dockerfile中特地写了-Dcustom.version,用来测试VM options是否真的能传入。这个在docker run的时候一样可以传入。
4. build image
docker build -t spring-boot-docker-test .
语法:docker build -t 父镜像名:镜像的 tag Dockerfile 文件所在路径
![](https://img.haomeiwen.com/i15522532/aa8c4e4ea2f11b72.png)
使用docker images查看:
docker images
![](https://img.haomeiwen.com/i15522532/7a1e793e80ea84b8.png)
5. run image
5.1 run上述build的image:
docker run -p 8080:8080 -t spring-boot-docker-test
![](https://img.haomeiwen.com/i15522532/10ba604cf9f714c1.png)
验证:
- http://localhost:8080/hello 返回hello world!
- http://localhost:8080/custom-version 返回v1.0
5.2 run的时候加-e参数
把上述Dockerfile中的ENTERPOINT参数去掉-Dcustom.version,重新build,再run:
docker run -e "custom.version=v2.0" -p 8080:8080 -t spring-boot-docker-test
那么访问http://localhost:8080/custom-version返回:v2.0
![](https://img.haomeiwen.com/i15522532/796075bf7ec9e6a9.png)
5.3 docker run有很多参数
参考:https://www.runoob.com/docker/docker-run-command.html
-e
username="ritchie": 设置环境变量。
-p
指定端口映射,格式为:主机(宿主)端口:容器端口。比如-p 5000:80:代表把容器里的80给宿主机的5000端口。这样做了映射之后,可以通过5000端口访问该项目的主页。
-t
: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-d
: 后台运行容器,并返回容器ID;
5.4 后台运行
返回container id: 44bb98004226e06ceb66fdbf9d0937166ccadf4fcf0b427372cf7476ed7c41b0!docker run -d -e "custom.version=v2.0" -p 8080:8080 -t spring-boot-docker-test
![](https://img.haomeiwen.com/i15522532/29de38fbc29279e6.png)
5.5 查看日志
参考:https://www.cnblogs.com/qufanblog/p/6927411.html
docker logs -f -t --since="2017-05-31" --tail=10 exciting_noether
--since
: 此参数指定了输出日志开始日期,即只输出指定日期之后的日志。
-f
: 查看实时日志。
-t
: 查看日志产生的日期。
-tail=10
: 查看最后的10条日志。
exciting_noether
: 容器名称。通过docker ps查得。
![](https://img.haomeiwen.com/i15522532/551cd34af9244019.png)
网友评论