本文将完全复制 “ 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 环境可以参考 “Linux基础知识(2)- Docker (一) | Docker 架构、Docker 安装、Docker 镜像加速”。
CentOS 7.9 下不需要安装 Java 环境。
2) 创建 Dockerfile
创建 /home/docker/webdocker 目录,把 SpringbootWebDocker.jar 上传到该目录。
创建 /home/docker/logs 文件夹存放日志文件,该路径与 SpringBoot 项目中 logging.file.path 设置的一致。
创建 home/docker/webdocker/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"]
3) 构建镜像
$ cd /home/docker/webdocker
$ 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