Docker基础知识 (7) - 使用 Docker 部署 SpringBoot 项目
本文将完全复制 “ Springboot基础知识(08)- spring-boot-starter-web(Web启动器)” 里的 SpringbootWeb 项目的代码和配置到新项目 SpringbootWebDocker。
在新项目 SpringbootWebDocker 的基础上,修改部分配置和代码,Jar 打包 SpringbootWebDocker 项目,并使用 Docker 部署 Jar 包。
1. 修改 SpringbootWebDocker 项目
1) 修改 pom.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 5 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 6 <parent> 7 <groupId>org.springframework.boot</groupId> 8 <artifactId>spring-boot-starter-parent</artifactId> 9 <version>2.6.6</version> 10 <relativePath/> <!-- lookup parent from repository --> 11 </parent> 12 13 <modelVersion>4.0.0</modelVersion> 14 15 <groupId>com.example</groupId> 16 <artifactId>SpringBootWebDocker</artifactId> 17 <version>1.0-SNAPSHOT</version> 18 19 <name>SpringBootWebDocker</name> 20 <!-- FIXME change it to the project's website --> 21 <url>http://www.example.com</url> 22 23 <properties> 24 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 25 <maven.compiler.source>1.8</maven.compiler.source> 26 <maven.compiler.target>1.8</maven.compiler.target> 27 </properties> 28 29 <dependencies> 30 <dependency> 31 <groupId>junit</groupId> 32 <artifactId>junit</artifactId> 33 <version>4.11</version> 34 <scope>test</scope> 35 </dependency> 36 37 <dependency> 38 <groupId>org.springframework.boot</groupId> 39 <artifactId>spring-boot-starter-web</artifactId> 40 </dependency> 41 <dependency> 42 <groupId>org.springframework.boot</groupId> 43 <artifactId>spring-boot-starter-tomcat</artifactId> 44 <scope>provided</scope> 45 </dependency> 46 <dependency> 47 <groupId>org.springframework.boot</groupId> 48 <artifactId>spring-boot-starter-test</artifactId> 49 <scope>test</scope> 50 </dependency> 51 52 </dependencies> 53 54 <build> 55 <!-- 指定 jar 文件名 --> 56 <finalName>SpringbootWebDocker</finalName> 57 58 <!-- spring-boot-maven-plugin 插件代码 --> 59 <plugins> 60 <plugin> 61 <groupId>org.springframework.boot</groupId> 62 <artifactId>spring-boot-maven-plugin</artifactId> 63 <configuration> 64 <mainClass>com.example.App</mainClass> 65 </configuration> 66 <executions> 67 <execution> 68 <goals> 69 <goal>repackage</goal> 70 </goals> 71 </execution> 72 </executions> 73 </plugin> 74 </plugins> 75 76 ... 77 78 </build> 79 </project>
2) 修改 src/main/resources/application.properties 文件
spring.main.banner-mode=off
# Web server
server.display-name=SpringBootWebDocker-Test
#server.address=localhost
server.port=9090
# Logging
logging.file.path=/home/docker/logs
注:不要设置 server.address。
3) 修改 src/main/java/com/example/controller/IndexController.java 文件
1 package com.example.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.ResponseBody; 6 7 @Controller 8 public class IndexController { 9 @ResponseBody 10 @RequestMapping("/hello") 11 public String hello() { 12 return "Hello Page - SpringBoot Web Docker"; 13 } 14 }
2. Jar 打包
菜单 View -> Tool Windows -> Maven -> SpringbootWebDocker -> Lifecycle -> Clean & Package
jar 包生成在目录 target/ 里
SpringbootWebDocker.jar
SpringbootWebDocker.jar.original
点击 IDEA 底部 Terminal 标签页,执行如下命令。
java -jar target/SpringbootWebDocker.jar
...
Spring boot web project
访问 http://localhost:9090/hello,页面显示:
Hello Page - SpringBoot Web Docker
注:SpringbootWebDocker.jar 包含依赖包,可以直接运行。SpringbootWebDocker.jar.original 里不包含依赖的包(要手动配置依赖环境),运行前要把文件名上的 “.original” 去掉。
打包的具体步骤可以参考 SpringbootWeb 项目的打包过程。
3. 部署 Jar 包
1) 部署环境
IP 地址(本地测试环境):192.168.0.10
操作系统:Linux CentOS 7.9
Linux 用户:创建 Linux 用户 docker 来完成下文的部署工作 (Root 权限或 Sudo 权限,用户目录 /home/docker)
Docker 版本:
$ docker version
Client: Docker Engine - Community
Version: 20.10.7
API version: 1.41
Go version: go1.13.15
Git commit: f0df350
Built: Wed Jun 2 11:58:10 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:56:35 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.7
GitCommit: 0197261a30bf81f1ee8e6a4dd2dea0ef95d67ccb
runc:
Version: 1.1.3
GitCommit: v1.1.3-0-g6724737
docker-init:
Version: 0.19.0
GitCommit: de40ad0
注:搭建 Docker 环境可以参考 “Docker基础知识 (1) - Docker 架构、Docker 安装、Docker 镜像加速”。
CentOS 7.9 下不需要安装 Java 环境。
2) 创建 Dockerfile
创建 /home/docker 目录,把 SpringbootWebDocker.jar 上传到该目录。
创建 /home/docker/logs 文件夹存放日志文件,该路径与 SpringBoot 项目中 logging.file.path 设置的一致。
创建 home/docker/Dockerfile 文件,内容如下:
# 指定基础镜像
FROM java:8
# 维护者
MAINTAINER Tester
# 将文件添加到容器中,并更名为 webdocker.jar,这里也可使用 COPY 命令
ADD SpringbootWebDocker.jar /home/docker/webdocker.jar
#COPY SpringbootWebDocker.jar /home/docker/webdocker.jar
# 指定端口,与 SpringBoot 项目配置文件中的端口一致
EXPOSE 9090
# 容器启动时,运行该程序
ENTRYPOINT ["java", "-jar", "/home/docker/webdocker.jar"]
注:这里使用 Java 8 基础镜像来演示,建议实际应用中使用较新的 Java 版本,可以访问 https://hub.docker.com/_/openjdk/tags 查询。
3) 构建镜像
$ cd /home/docker
$ sudo docker build -t webdocker .
Sending build context to Docker daemon 17.54MB
Step 1/5 : FROM java:8
8: Pulling from library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete
e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Step 1/5 : FROM java:8
---> d23bdf5b1b1b
Step 2/5 : MAINTAINER Tester
---> Running in f12730dd28fe
Removing intermediate container f12730dd28fe
---> 8c88f5dad7c2
Step 3/5 : ADD SpringbootWebDocker.jar /home/docker/webdocker.jar
---> f31ac4ee62de
Step 4/5 : EXPOSE 9090
---> Running in b686d8eba638
Removing intermediate container b686d8eba638
---> 43590b39f0be
Step 5/5 : ENTRYPOINT ["java", "-jar", "/home/docker/webdocker.jar"]
---> Running in 6ce28cff21e0
Removing intermediate container 6ce28cff21e0
---> 210d3e763d71
Successfully built 210d3e763d71
Successfully tagged webdocker:latest
注:运行命令时,注意最后的 “.”,不要遗漏。
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
webdocker latest 210d3e763d71 33 seconds ago 661MB
java 8 d23bdf5b1b1b 5 years ago 643MB
...
4) 创建并启动容器
$ sudo docker run -d -p 9090:9090 webdocker # 只指定端口
$ sudo docker run -d -p 9090:9090 --name webdocker -v /home/docker/logs:/home/docker/logs webdocker # 指定端口、容器名、参数等
6eda5554156b1bcc459d888ca92af844e164382e02f7f97edb81c7743f1b19ab
$ sudo docker ps # 查看容器
CONTAINER ID IMAGE COMMAND ... PORTS NAMES 6eda5554156b webdocker "java -jar /home/doc…" 0.0.0.0:9090->9090/tcp webdocker ...
$ sudo docker exec -it webdocker /bin/bash # 进入容器
root@6eda5554156b:/# cd /home/docker root@6eda5554156b:/home/docker# ls logs webdocker.jar root@6eda5554156b:/home/docker# cd logs root@6eda5554156b:/home/docker/logs# ls -la total 8 drwxr-xr-x 2 root root 58 Aug 31 01:55 . drwxr-xr-x 1 root root 18 Aug 30 23:58 .. -rw-r--r-- 1 root root 438 Aug 31 01:55 spring.log -rw-r--r-- 1 root root 1190 Aug 31 01:55 spring.log.2022-08-30.0.gz
$ ls -la /home/docker/logs # 在宿主主机上查看 log
total 8 drwxr-xr-x 2 root root 58 Aug 30 21:55 . drwxr-xr-x 3 root root 18 Aug 30 04:43 .. -rw-r--r-- 1 root root 438 Aug 30 21:55 spring.log -rw-r--r-- 1 root root 1190 Aug 30 21:55 spring.log.2022-08-30.0.gz
5) 页面访问
浏览器访问 http://192.168.0.10:9090/hello,显示如下内容:
Hello Page - SpringBoot Web Docker