一、项目改造
1.1、pom.xml 改造
<!-- 一、命名docker镜像名称-->
<properties>
<docker.image.prefix>fabric-contract-api</docker.image.prefix>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.example.fabriccontractapi.FabricContractApiApplication
</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 二、添加docker-maven-plugin 配置 -->
<!-- Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>
1.2、配置Dockerfile
# 上面pom.xml中配置如:<dockerDirectory>src/main/docker</dockerDirectory>
# 在src/main目录下创建docker文件夹,并创建Dockerfile,加入以下内容
# ***************************************
#FROM openjdk:8-jdk-alpine
FROM java:8u111
# 设置工作目录
WORKDIR /app
# 拷贝文件并重命名
ADD fabric-contract-api-0.0.1-SNAPSHOT.jar fabric-contract-api.jar
# 将主机上的crypto-config目录挂载到容器中的/app/src/main/resources/crypto-config目录
VOLUME /app/src/main/resources/crypto-config
# 设置启动命令
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/fabric-contract-api.jar"]
# ***************************************
二、构建打包环境
2.1 安装docker
*****************************docker*****************************
# 安装docker
ds@ds-virtual-machine: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 将当前用户加入到用户组
ds@ds-virtual-machine: sudo usermod -aG docker $USER
# 查看docker版本
ds@ds-virtual-machine:~$ docker --version
Docker version 24.0.7, build afdd53b
# 镜像加速
ds@ds-virtual-machine:~$ sudo vim /etc/docker/daemon.json
# 选择国内的163镜像站,粘贴该内容到daemon.json,并保存
{"registry-mirrors":["https://hub-mirror.c.163.com/"]}
#启动 docker
ds@ds-virtual-machine:~$ systemctl start docker
#查看 docker 状态
ds@ds-virtual-machine:~$ systemctl status docker
# 安装docker-compose
ds@ds-virtual-machine:~$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 为docker-compose 增加可执行权限
ds@ds-virtual-machine:~$ sudo chmod +x /usr/local/bin/docker-compose
2.2 安装 jdk
# 安装
sudo apt install openjdk-8-jdk
ds@ds-virtual-machine:/usr/lib/jvm$ cd /etc/profile.d/
ds@ds-virtual-machine:/etc/profile.d$ sudo vi jdk8.sh
# 加入如下内容,并保存;
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin
ds@ds-virtual-machine:~$ java -version
openjdk version "1.8.0_382"
OpenJDK Runtime Environment (build 1.8.0_382-8u382-ga-1~22.04.1-b05)
OpenJDK 64-Bit Server VM (build 25.382-b05, mixed mode)
# 查看
ds@ds-virtual-machine:/etc/profile.d$ source /etc/profile
ds@ds-virtual-machine:/etc/profile.d$ echo $JAVA_HOME
/usr/lib/jvm/java-8-openjdk-amd64
2.3 安装 maven
# 安装
ds@ds-virtual-machine:~$ sudo apt install maven
ds@ds-virtual-machine:/usr/lib/jvm$ cd /etc/profile.d/
ds@ds-virtual-machine:/etc/profile.d$ sudo vi maven.sh
# 加入如下内容,并保存;
MAVEN_HOME=/usr/share/maven
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin
# 查看
ds@ds-virtual-machine:/etc/profile.d$ source /etc/profile
ds@ds-virtual-machine:/etc/profile.d$ echo $MAVEN_HOME
/usr/share/maven
三、docker部署springboot项目
# 拉取jdk镜像
ds@ds-virtual-machine:~/raft-test/java/fabric-contract-api/fabric-contract-api$ docker pull java:8u111
# 将项目拷贝到服务器
ds@ds-virtual-machine:~/raft-test/java/fabric-contract-api$ ls
fabric-contract-api
# maven打包项目
ds@ds-virtual-machine:~/raft-test/java/fabric-contract-api/fabric-contract-api$ mvn clean package
# 打包成功
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19:17 min
[INFO] Finished at: 2023-11-13T21:52:07-05:00
[INFO] ------------------------------------------------------------------------
# 启动项目
ds@ds-virtual-machine:~/raft-test/java/fabric-contract-api/fabric-contract-api$ java -jar target/fabric-contract-api-0.0.1-SNAPSHOT.jar
# 程序正常运行
lication in 5.729 seconds (JVM running for 6.711)
ServletInitializer 启动:fabric-contract-api
----------------------------------------------------------
http://127.0.1.1:8999
http://127.0.1.1:8999/doc.html
----------------------------------------------------------
# 使用dockerfile 构建镜像
ds@ds-virtual-machine:~/raft-test/java/fabric-contract-api/fabric-contract-api$ mvn package docker:build
Step 1/5 : FROM java:8u111
---> a3562aa0b991
Step 2/5 : WORKDIR /app
---> Running in 337c281cad3b
Removing intermediate container 337c281cad3b
---> 4c9b85376bb4
Step 3/5 : ADD fabric-contract-api-0.0.1-SNAPSHOT.jar fabric-contract-api.jar
---> dedadb53efc1
Step 4/5 : VOLUME /app/src/main/resources/crypto-config
---> Running in 4ca33d6acb77
Removing intermediate container 4ca33d6acb77
---> bf6394f2d106
Step 5/5 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app/fabric-contract-api.jar"]
---> Running in af2b7e0fbca2
Removing intermediate container af2b7e0fbca2
---> 50c2146f268f
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built 50c2146f268f
Successfully tagged fabric-contract-api/fabric-contract-api:latest
[INFO] Built fabric-contract-api/fabric-contract-api
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 29.603 s
[INFO] Finished at: 2023-11-14T01:56:15-05:00
[INFO] ------------------------------------------------------------------------
# 查看镜像
ds@ds-virtual-machine:~/raft-test/java/fabric-contract-api/fabric-contract-api$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fabric-contract-api/fabric-contract-api latest b6d0e3c18535 About a minute ago 709MB
# 运行镜像
docker run -d -p 8999:8999 -v /home/ds/raft-test/java/fabric-contract-api/src/main/resources/crypto-config:/app/src/main/resources/crypto-config fabric-contract-api/fabric-contract-api
# 查看日志
ds@ds-virtual-machine:~/raft-test/java/fabric-contract-api$ docker logs -f 3c5a336234fabc20c55f054b8231ebe40a8d279df22251e132ebdd549c6a7336
2023-11-14 17:12:01.511 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8999 (http) with context path ''
2023-11-14 17:12:01.530 INFO 1 --- [ main] c.e.f.FabricContractApiApplication : Started FabricContractApiApplication in 6.121 seconds (JVM running for 8.055)
ServletInitializer 启动:fabric-contract-api
----------------------------------------------------------
http://172.17.0.2:8999
http://172.17.0.2:8999/doc.html
----------------------------------------------------------
遇到问题:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x0000000000003efe, pid=1, tid=0x00007f1943266b10
#
# JRE version: OpenJDK Runtime Environment (8.0_212-b04) (build 1.8.0_212-b04)
# Java VM: OpenJDK 64-Bit Server VM (25.212-b04 mixed mode linux-amd64 compressed oops)
# Derivative: IcedTea 3.12.0
# Distribution: Custom build (Sat May 4 17:33:35 UTC 2019)
# Problematic frame:
# C 0x0000000000003efe
#
# Core dump written. Default location: /app/core or core.1
#
# An error report file with more information is saved as:
# /app/hs_err_pid1.log
#
# If you would like to submit a bug report, please include
# instructions on how to reproduce the bug and visit:
# https://icedtea.classpath.org/bugzilla
#
1、拉取这个版本的jdk镜像
docker pull java:8u111
# Dockerfile中的 jdk镜像来源改为 :openjdk:8-jdk-alpine 修改为 java:8u111
#FROM openjdk:8-jdk-alpine
FROM java:8u111
参考:
https://www.jianshu.com/p/026f4b9224f5