摘要
本方法主要是基于某个项目进行一些简单处理,
加快交付效率, 避免浪费过多的磁盘和空间.
增加最佳时间避免出现一些性能问题时无法处理.
思路
分层构建:
1. 基于OpenJDK的基础镜像进行部分操作:
增加字体,
增加语言,
增加时区设置.
2. 基于第一步制作的镜像进行第二步镜像处理.
删除盘里面自带的jdk
精简文件
前后端分离
修改启动脚本
打包镜像
第一层镜像的打包处理
编写一个简单的dockerfile文件进行处理
需要注意这一块需要 字体和语言的原始文件, 便于处理
语言是为了解决日志的中文显示.
字体是为了解决打印的问题.
时区是为了便于处理时间相关的问题.
mkdir -p docker_openjdk/
cat > docker_openjdk/dockerfile <<EOF
FROM adoptopenjdk:8u222-b10-jdk-hotspot
RUN apt-get update && apt-get -y install fontconfig && apt-get install -y locales && rm -rf var/lib/apt/lists/* \ && localedef -i zh_CN -c -f UTF-8 -A usr/share/locale/locale.alias zh_CN.UTF-8
WORKDIR usr/share/fonts/
ADD myfonts.tar.gz usr/share/fonts/
RUN fc-cache
ADD zh.tar.gz usr/lib/locale
ENV LANG zh_CN.utf8
ENV TZ=Asia/Shanghai
RUN ln -snf usr/share/zoneinfo/$TZ etc/localtime && echo '$TZ' > etc/timezone
EOF
注意 可以选择多中OpenJDK的基础镜像:
比如一个比较新的:adoptopenjdk:8u292-b10-jdk-hotspot
docker build . -t openjdk_8_222_withfonts:1.0
验证一下对应的版本
docker run -it openjdk_8_222_withfonts:1.0 bash
查看信息为:
root@4944854efb97:/app# uname -a
Linux 4944854efb97 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
root@4944854efb97:/app# cat etc/os-release
NAME="Ubuntu"
VERSION="18.04.3 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.3 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
root@4944854efb97:/app# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.222-b10, mixed mode)
需要注意的是 openJdk 292 的操作系统是
ubuntu2004 lts
基于产品盘第二步构建
创建一套新的 dockerfile
mkdir docker_app/
cat >/docker_app/dockerfile <<EOF
FROM openjdk_8_222_withfonts:1.0
WORKDIR app
COPY app app
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dloader.path=./server/runtime/3rd,./server/runtime/libs","-Dparallel.startup=true","-Dserver.runtime.path.name=server","-XX:-DisableExplicitGC","-XX:+PrintGC","-XX:+PrintGCDateStamps","-XX:+PrintGCDetails","-XX:+PrintGCTimeStamps","-Xloggc:/app/dump/gclog","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=/app/dump","-jar","./server/runtime/caf-bootstrap.jar","--spring.config.location=./server/runtime/"]
EOF
需要注意的话 还可以增加 .dockerignor 进行进一步的处理.
也可以通过删除文件的方式进行.
打包
docker build . -t app:01
完成相关动作
具体大小信息:
adoptopenjdk:8u222-b10-jdk-hotspot 300M
openjdk_8_222_withfonts:1.0 371M
app:1.0 1.68GB
保证能够进行jinfo等操作
docker run -d --security-opt seccomp:unconfined -p 15201:5201 --name openjdkmyapp myappsdhj:01
docker exec -it openjdkmyapp bash
jinfo 1 即可.
优化java的启动脚本
修改一个新的 dockerfile
修改为:
FROM openjdk_8_292_withfonts:1.0
WORKDIR app
COPY myapp app
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dloader.path=./server/runtime/3rd,./server/runtime/libs","-Dparallel.startup=true","-Dserver.runtime.path.name=server","-XX:+UseContainerSupport","-XX:MaxRAMPercentage=75.0","-XX:InitialRAMPercentage=75.0","-XX:MinRAMPercentage=75.0","-XX:-DisableExplicitGC","-XX:+PrintGC","-XX:+PrintGCDateStamps","-XX:+PrintGCDetails","-XX:+PrintGCTimeStamps","-Xloggc:/app/dump/gclog","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=/app/dump","-jar","./server/runtime/caf-bootstrap.jar","--spring.config.location=./server/runtime/"]
# 重新打包进行jinfo验证
# 注意必须使用 75.0 这样的配置 不能使用inter 必须使用 float的模式.
优化后的启动脚本的情况
使用如下命令启动服务:
docker run -d --security-opt seccomp:unconfined -p 15207:5201 --name openjdkmyapp0x -m 16g -c 16 myappsdhj:0x
不采用容器支持的情况:
-XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431633920
-XX:NewSize=89456640 -XX:OldSize=178978816
默认堆区是 内存限制的64分之一. 最大堆区是4分之一.
默认的young区域是最小heap的三分之二, 老年代是三分之一.
采用容器支持的情况
-XX:InitialHeapSize=12884901888 -XX:InitialRAMPercentage=null -XX:MaxHeapSize=12884901888
-XX:MaxNewSize=4294967296 -XX:MaxRAMPercentage=null -XX:MinHeapDeltaBytes=196608
-XX:MinRAMPercentage=null -XX:NewSize=4294967296 -XX:OldSize=8589934592
最大堆区是 -m 限制内存的 四分之三.
然后其他的都是等比率设置的
理论上这样是更加优秀一些.
文章转载自济南小老虎,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




