Skip to content

Docker镜像之定制应用容器

之前用alpine镜像制作过一期体积最小镜像,其中的jdk用的是来自阿里的Dragonwell8,还是自己阉割的版本,但这次阿里官方出了Alpine版本的Dragonwell,这样我们就不需要在Alpine中自编译GLIBC了。但是唯一美中不足之处是,支持Alpine的最小版本从Dragonwell11开始,由于JDK是高版本向下兼容低版本,那么这期目的就很明确了

Dragonwell11

https://dragonwell-jdk.io/#/index100.png

基础镜像信息

镜像名称镜像大小(MB)备注
centos:centos7.9.2009204常用系统基础镜像
alpine:3.18.27.33本次实验所用系统

springboot:moira-jdk11镜像制作

那为啥叫moira-jdk11呢,因为最近我写的快速开发框架的名称叫moira,没啥其他的含义

dockerfile

text
FROM alpine:3.18.2
MAINTAINER odboy "tianjun@odboy.cn"
ENV JAVA_HOME=/usr/local/dragonwell11
ENV CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$PATH:$JAVA_HOME/bin
WORKDIR /home/apps
ADD Alibaba_Dragonwell_Standard_11.0.19.15.7_x64_alpine-linux.tar.gz ./
RUN apk add bash && \
apk add bash-doc && \
apk add bash-completion && \
mv dragonwell-11.0.19.15+7-GA /usr/local/dragonwell11 && \
chmod +x /usr/local/dragonwell11/bin/*

build.sh

shell
ImageTagName=springboot:alpine-moira-jdk11
ContainerName=springboot-alpine-moira-jdk11-test
#容器ID
ContainerId=$(docker ps -a |grep $ContainerName |awk '{print $1}')
#镜像ID
ImageId=$(docker images| awk '{print $1":"$2"\t"$3}'| grep $ImageTagName| awk '{print $2}')
echo ContainerId=$ContainerId
echo ContainerName=$ContainerName
echo ImageId=$ImageId
echo ImageTagName=$ImageTagName
#停止容器
docker stop $ContainerId
#删除容器
docker rm $ContainerId
#删除镜像
docker rmi $ImageId
#重构镜像
docker build -t $ImageTagName .
#测试镜像
echo "RunCommand: docker run --name $ContainerName -it $ImageTagName bash"

基础镜像测试

shell
docker run --name springboot:alpine-moira-jdk11-test -it springboot:alpine-moira-jdk11 bash

101.png

text
但是吧,alpine的时区是UTC不+8的

102.png

调整基础镜像时区, dockerfile调整如下

text
FROM alpine:3.18.2
MAINTAINER odboy "tianjun@odboy.cn"
ENV JAVA_HOME=/usr/local/dragonwell11
ENV CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$PATH:$JAVA_HOME/bin
ENV TZ Asia/Shanghai
WORKDIR /home/apps
ADD Alibaba_Dragonwell_Standard_11.0.19.15.7_x64_alpine-linux.tar.gz ./
RUN apk add --no-cache bash && \
apk add --no-cache bash-doc && \
apk add --no-cache bash-completion && \
apk add --no-cache tzdata && \
mv dragonwell-11.0.19.15+7-GA /usr/local/dragonwell11 && \
chmod +x /usr/local/dragonwell11/bin/*

重新跑一次build.sh,然后尝试执行date命令

shell
docker run --name springboot:alpine-moira-jdk11-test -it springboot:alpine-moira-jdk11 bash

刚好差8小时,简直美得不要不要的

还有一个最重要的,同时也是最最蛋疼的问题:字符集编码 docker logs 容器id,编码显示正常。那是不是说明在3.18.2版本,已经解决了字符乱码的问题呢 实践出真理,撸起袖子就是干,先随便clone一个项目下来,一看时区是否UTC8,二看编码是否支持中文

shell
git clone https://gitee.com/elunez/eladmin-mp.git

主要文件和路径

text
eladmin-mp/build.sh
eladmin-mp/docker-compose.yml
eladmin-mp/sql/Dockerfile
eladmin-mp/redis/Dockerfile
eladmin-mp/eladmin/eladmin-system/Dockerfile

打包下载

字符编码测试

就是把前端跑起来看看, 结果如下:编码没问题,时间也很准

103.png

Alpine与CentOS7基于dragonwell11基础镜像(测试后对比)

镜像名称基础镜像JDK大小(MB)
springboot:alpine-moira-jdk11alpine:3.18.2Alibaba_Dragonwell_Standard_11.0.19.15.7_x64_alpine-linux680
springboot:centos7-moira-jdk11centos:centos7.9.2009Alibaba_Dragonwell_Standard_11.0.19.15.7_x64_linux1080

Alpine与CentOS7基于dragonwell11应用镜像(测试后对比)

基础镜像名称基础镜像大小应用大小应用容器大小UTF-8UTC+8
springboot:alpine-moira-jdk11680MB118MB804MB支持支持
springboot:centos7-moira-jdk111.08GB118MB1.2GB支持支持