Docker 部署 SpringBoot 项目
...大约 2 分钟
Docker 部署 SpringBoot 项目
一、将 SpringBoot 项目打成 Jar 包
修改项目 yml 对应配置:mysql 地址、用户名密码、redis 地址、密码、文件路径,然后打成 jar 包。
登录服务器,创建目录:
mkdir /usr/docker/java
将 jar 包上传到该文件夹内:
二、部署项目
2.1 创建 Dockerfile 文件
在 jar 包同级目录创建 Dockerfile 文件并写入内容:
# 基础镜像使用java 11
FROM java:11
# 作者
MAINTAINER fanxin
# VOLUME 指定临时文件目录为/tmp,会在主机/var/lib/docker目录下创建了一个临时目录并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为test1.jar
ADD test.jar /app/test1.jar
# 运行jar包
RUN bash -c 'touch /app/test1.jar'
ENTRYPOINT ["java","-jar","/app/test1.jar"]
#暴露8080端口
EXPOSE 8080
这里使用的是 jdk 11,由于官方仓库没有 jdk11,所以我们要自己做一个 java:11 的镜像。如果项目使用的是 jdk8,那么在 Dockerfile 中直接写 FROM java:8 即可。
2.2 打包成镜像
docker build -t test_springboot:0.1 .
打包好之后可以在本地看到镜像:
2.3 启动容器
docker run -d -p 8080:8080 --name springboot --restart=always test_springboot:0.1
问题记录
1. 日志中文显示问号
查看容器编码:
docker exec -it 容器名 /bin/bash
locale
彻底解决方式:修改 Dockerfile
加入以下命令后重新构建:(可以选择修改基础镜像 java11,然后全部重新构建)
ENV TZ 'Asia/Shanghai'
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
2. 项目日志看到报错
16:58:00.796 [http-nio-8080-exec-1] ERROR c.r.f.w.e.GlobalExceptionHandler - [handleException,80] - 请求地址'/captchaImage',发生系统异常.
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.UnsatisfiedLinkError: /soft/jdk/jdk-11.0.14/lib/libfontmanager.so: libfreetype.so.6: cannot open shared object file: No such file or directory
报错接口:请求验证码的接口,之前这里部署到 Linux 服务器之后踩过坑,是因为 Linux 字体配置的问题,需要安装 fontconfig。这里报错 libfontmanager.so: libfreetype.so.6
不存在,网上常见问题是 docker 中使用 openjdk 没有 libfontmanager
库,这里使用的 Oracle JDK,先安装 fontconfig 试试,直接在基础镜像 java:11 中安装。
在 Dockerfile 加入命令:
# 安装字体库
RUN yum install fontconfig -y
RUN yum install dejavu-sans-fonts fontconfig -y
然后重新构建基础镜像和依赖它的镜像,解决。
Powered by Waline v3.3.0