创建 spring boot 项目
### pom.xml
```xml hljs
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.2.4.RELEASE
com.easy
spring-boot-docker
1.0
jar
spring-boot-docker
Demo project for Spring Boot
UTF-8
1.8
springboot
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
com.spotify
docker-maven-plugin
1.0.0
${docker.image.prefix}/${project.artifactId}
src/main/docker
/
${project.build.directory}
${project.build.finalName}.jar
```
### Dockerfile 配置
```cfml
# Docker image for springboot file run
# VERSION 0.0.1
# Author: qingjiaqi
# 基础镜像使用java
FROM java:8
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD taole-app-api-0.0.1-SNAPSHOT.jar 项目别名.jar
# 运行jar包
RUN bash -c 'touch /taole-app-web.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/项目别名.jar"]
#编译命令:docker build -t taole-app-api . 注:.不能少
#启动命令 docker run -d -p 12305:12305 项目名称 --------- -p是端口 -d是后台运行
```
Dockerfile 文件介绍,构建 Jdk 基础环境,添加 Spring Boot Jar 到镜像中:
* FROM,表示使用 Jdk8 环境 为基础镜像,如果镜像不是本地的会从 DockerHub 进行下载
* VOLUME,VOLUME 指向了一个/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
* EXPOSE,EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
* ADD,拷贝文件并且重命名
* ENTRYPOINT,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT
### 其它示例代码
DockerController.java
```java hljs
@RestController
public class DockerController {
@RequestMapping("/")
public String index() {
return "Hello Docker!";
}
}
```
DockerApplication.java
```java hljs
@SpringBootApplication
public class DockerApplication {
public static void main(String[] args) {
SpringApplication.run(DockerApplication.class, args);
}
}
```
application.properties
```properties
server.port=8282
```
## 使用 Docker 部署 Spring Boot 项目
将项目 docker 拷贝至服务器中,进入项目路径下进行打包测试。
```cfml
#打包
mvn package
#启动
java -jar target/spring-boot-docker-1.0.jar
```
看到 Spring Boot 的启动日志后表明环境配置没有问题,接下来我们使用 DockerFile 构建镜像。
```cfml
mvn package docker:build
```
第一次构建可能有点慢,当看到以下内容的时候表明构建成功:
```cfml
Step 1/5 : FROM openjdk:8-jdk-alpine
---> a3562aa0b991
Step 2/5 : VOLUME /tmp
---> Using cache
---> d070c927d0a7
Step 3/5 : EXPOSE 8282
---> Using cache
---> b16d14267527
Step 4/5 : ADD spring-boot-docker-1.0.jar app.jar
---> c4ddc409b458
Removing intermediate container c58c986e6b9a
Step 5/5 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /app.jar
---> Running in d2b61fddd616
---> 13c600d3f625
Removing intermediate container d2b61fddd616
Successfully built 13c600d3f625
[INFO] Built springboot/spring-boot-docker
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.273 s
[INFO] Finished at: 2020-03-25T10:05:04+08:00
[INFO] ------------------------------------------------------------------------
```
使用docker images命令查看构建好的镜像:
```cfml
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springboot/spring-boot-docker latest 13c600d3f625 18 minutes ago 122 MB
docker.io/openjdk 8-jdk-alpine a3562aa0b991 10 months ago 105 MB
```
springboot/spring-boot-docker 就是我们构建好的镜像,下一步就是运行该镜像
```cfml
docker run -p 8282:8282 -t springboot/spring-boot-docker
```
启动完成之后我们使用docker ps查看正在运行的镜像:
```cfml
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a626c3dbdb1b springboot/spring-boot-docker "java -Djava.secur..." 34 seconds ago Up 34 seconds 0.0.0.0:8282->8282/tcp suspicious_murdock
```
可以看到我们构建的容器正在在运行,访问浏览器:[http://192.168.0.x:8282/,返回](http://192.168.0.x:8282/,%E8%BF%94%E5%9B%9E)
```cfml
Hello Docker!
```
```
说明使用 Docker 部署 Spring Boot 项目成功!

Docker部署SpringBoot项目