# Docker镜像之定制应用容器

作者:Odboy (opens new window)

本站地址:https://blog.odboy.cn (opens new window)

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

# Dragonwell11

https://dragonwell-jdk.io/#/index 100.png

# 基础镜像信息

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

# springboot:moira-jdk11镜像制作

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

# dockerfile

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/*
1
2
3
4
5
6
7
8
9
10
11
12

# build.sh

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"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 基础镜像测试

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

101.png

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

102.png

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

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/*
1
2
3
4
5
6
7
8
9
10
11
12
13
14

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

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

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

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

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

# 主要文件和路径

eladmin-mp/build.sh
eladmin-mp/docker-compose.yml
eladmin-mp/sql/Dockerfile
eladmin-mp/redis/Dockerfile
eladmin-mp/eladmin/eladmin-system/Dockerfile
1
2
3
4
5

打包下载

# 字符编码测试

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

103.png

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

镜像名称 基础镜像 JDK 大小(MB)
springboot:alpine-moira-jdk11 alpine:3.18.2 Alibaba_Dragonwell_Standard_11.0.19.15.7_x64_alpine-linux 680
springboot:centos7-moira-jdk11 centos:centos7.9.2009 Alibaba_Dragonwell_Standard_11.0.19.15.7_x64_linux 1080

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

基础镜像名称 基础镜像大小 应用大小 应用容器大小 UTF-8 UTC+8
springboot:alpine-moira-jdk11 680MB 118MB 804MB 支持 支持
springboot:centos7-moira-jdk11 1.08GB 118MB 1.2GB 支持 支持
最近更新: 2024-10-11
2017 - 武林秘籍   |