# Docker镜像之定制应用容器
之前用alpine镜像制作过一期体积最小镜像,其中的jdk用的是来自阿里的Dragonwell8,还是自己阉割的版本,但这次阿里官方出了Alpine版本的Dragonwell,这样我们就不需要在Alpine中自编译GLIBC了。但是唯一美中不足之处是,支持Alpine的最小版本从Dragonwell11开始,由于JDK是高版本向下兼容低版本,那么这期目的就很明确了
# Dragonwell11
https://dragonwell-jdk.io/#/index
# 基础镜像信息
镜像名称 | 镜像大小(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
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
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
但是吧,alpine的时区是UTC不+8的
1
# 调整基础镜像时区, 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
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
2
3
4
5
# 字符编码测试
就是把前端跑起来看看, 结果如下:编码没问题,时间也很准
# 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 | 支持 | 支持 |