原本使用docker部署jar包时,将jar包打包成一个镜像进行部署。
最近进行调整,想避免反复制作镜像浪费时间。
大体思路是镜像仅设置java环境以及一些启动参数。
将容器启动时命令指向的jar包目录挂载的宿主机的目录上。
更新jar包时只需要更新宿主机目录下的jar包然后重启容器就可以了。

镜像配置

# 基础镜像使用java
FROM openjdk:8-jre-alpine
#设置字符集
ENV LANG en_US.UTF-8
#启动端口
EXPOSE 8080
#启动命令
ENTRYPOINT ["java","-XX:+UnlockExperimentalVMOptions","-XX:+UseCGroupMemoryLimitForHeap","-jar","-Duser.timezone=Asia/Shanghai","/data/xxxx.jar"]

其中UnlockExperimentalVMOptions以及UseCGroupMemoryLimitForHeap是动态指定容器运行是jvm占用的内存大小,仅java8较新的版本才支持。
Duser.timezone=Asia/Shanghai指定容器运行时区,避免部分jdk的时区设置不一致。

制作镜像

docker build -t 你的镜像名 .
注意最后有个.

启动容器

然后启动时将容器中启动的目录"/data/xxxx.jar"指向宿主机的物理路径。

docker run -m 800m --name 你的容器名 -it -v /usr/local/project/htserver:/data -d -p 8080:8080你的镜像

限制容器使用内存:-m 800m ,根据实际情况调整。
目录挂载:v /usr/local/project/xxxx:/data将容器中的/data挂载到了实际宿主机的目录/usr/local/project/xxxx
需要更新jar包时,将jar包直接放在/usr/local/project/xxxx下,重启容器即可。

推荐一个linux下快速管理文件的镜像filebrowser,可以部署起来,占用内存很小只有10来m,上传、更新服务器上的文件非常方便。

其他问题1

使用alpine的jdk环境部署,缺少字体文件,如果你的项目中某些组件使用了相关的文件,会报错:

java.lang.NullPointerException at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)

解决方法:
在docker构建文件中添加

#安装字体软件,完成字体配置
RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/*

重新构建镜像,部署即可。

其他问题2

在某些系统(我是在国产化uos遇到的)中,docker启动时,如果指定的内存稍微大一点儿,启动会报错:

library initialization failed - unable to allocate file descriptor table - out of memoryAborte

解决方法1:

在启动命令后面追加:

#原来的启动命令# --ulimit nofile=65535:65535 --ulimit nproc=65535:65535

出处:https://www.cnblogs.com/exmyth/p/17511915.html

解决方法2:

修改系统设置/etc/systemd/system/docker.service 文件中的 LimitNOFILE、LimitNPROC和LimitCORE配置为65535固定值,原先配置中这三个参数都设置为了infinity导致不起作用:

LimitNOFILE=65535
LimitNPROC=65535
LimitCORE=65535

再次启动即可。
出处:https://blog.csdn.net/aiguoba/article/details/136733979