一、前言
Alpine Linux 网站首页的注明“Small!Simple!Secure!Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.”
Alpine Linux 是一个社区开发的面向安全应用的轻量级 Linux 发行版,有以下特点:
- 小巧:基于musl libc和busybox,和busybox一样小巧,最小的Docker镜像只有5MB;
- 安全:面向安全的轻量发行版;
- 简单:提供APK包管理工具,软件的搜索、安装、删除、升级都非常方便;
- 适合容器使用:由于小巧、功能完备,非常适合作为容器的基础镜像。
二、JRE的准备
下载JRE,网址 https://www.java.com/en/download/manual.jsp,下载后解压,查看目录下文件占用大小为228M
[root@localhost alpine]# du -sh jre1.8.0_251
228M jre1.8.0_251
删除不用的文件
# 删除文本文件
rm -rf COPYRIGHT LICENSE README release THIRDPARTYLICENSEREADME-JAVAFX.txtTHIRDPARTYLICENSEREADME.txt Welcome.html
# 删除其他无用文件
rm -rf lib/plugin.jar \
lib/ext/jfxrt.jar \
bin/javaws \
lib/javaws.jar \
lib/desktop \
plugin \
lib/deploy* \
lib/*javafx* \
lib/*jfx* \
lib/amd64/libdecora_sse.so \
lib/amd64/libprism_*.so \
lib/amd64/libfxplugins.so \
lib/amd64/libglass.so \
lib/amd64/libgstreamer-lite.so \
lib/amd64/libjavafx*.so \
lib/amd64/libjfx*.so
再次查看目录下文件占用大小为112M左右
# 删除了116M左右的JRE文件
[root@localhost alpine]# du -sh jre1.8.0_251
112M jre1.8.0_251
三、其他文件的准备
- anron.jar 自己的应用,监听3000端口,只有一个api接口"/hi"
- glibc 三个文件的下载网址 https://github.com/sgerrand/alpine-pkg-glibc
- sgerrand.rsa.pub 下载网址 https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
[root@localhost alpine]# pwd
/ljh/alpine
[root@localhost alpine]# ll
total 115536
-rw-r--r--. 1 root root 17614937 Jun 3 04:54 anron.jar
-rw-r--r--. 1 root root 1282 Jun 3 05:40 Dockerfile
-rw-r--r--. 1 root root 4412098 Jun 3 05:15 glibc-2.31-r0.apk
-rw-r--r--. 1 root root 1007404 Jun 3 05:15 glibc-bin-2.31-r0.apk
-rw-r--r--. 1 root root 7713411 Jun 3 05:15 glibc-i18n-2.31-r0.apk
drwxr-xr-x. 5 10143 10143 116 Jun 3 04:46 jre1.8.0_251
-rw-r--r--. 1 root root 87543611 Jun 3 04:27 jre-8u251-linux-x64.tar.gz
-rw-r--r--. 1 root root 451 Jan 11 2018 sgerrand.rsa.pub
Dockerfile文件的内容
FROM alpine:latest
MAINTAINER anron
# 下面RUN执行时的目录
WORKDIR /usr/local/soft/jre
# JRE下载地址 https://www.java.com/en/download/manual.jsp,下载后解压删除不用的文件
COPY jre1.8.0_251 /usr/local/soft/jre
# 应用
COPY anron.jar /app/anron.jar
# glibc下载网址 https://github.com/sgerrand/alpine-pkg-glibc
COPY glibc-2.31-r0.apk /usr/local/soft/jre
COPY glibc-bin-2.31-r0.apk /usr/local/soft/jre
COPY glibc-i18n-2.31-r0.apk /usr/local/soft/jre
# sgerrand.rsa.pub下载网址 https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
COPY sgerrand.rsa.pub /etc/apk/keys/
ENV JAVA_HOME=/usr/local/soft/jre
ENV PARAMS="-Xms2048M -Xmx2048M -XX:NewSize=512m -XX:MaxNewSize=512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8"
ENV PATH=$JAVA_HOME/bin:$PATH
# 更新Alpine的软件源为阿里云/etc/apk/repositories
# apk类似于ubuntu的apt-get,centos的yum,语法如下:apk add bash wget curl git vim
# ca-certificates证书服务,是安装glibc前置依赖
RUN echo http://mirrors.aliyun.com/alpine/v3.10/main/ > /etc/apk/repositories \
&& echo http://mirrors.aliyun.com/alpine/v3.10/community/ >> /etc/apk/repositories \
&& apk update && apk upgrade \
&& apk --no-cache add ca-certificates \
&& apk add glibc-2.31-r0.apk glibc-bin-2.31-r0.apk glibc-i18n-2.31-r0.apk \
&& rm -rf /var/cache/apk/* glibc-2.31-r0.apk glibc-bin-2.31-r0.apk glibc-i18n-2.31-r0.apk
EXPOSE 3000
CMD ["/bin/sh","-c","java -jar /app/anron.jar $PARAMS"]
四、生成镜像
docker build -t apjre .
生产的镜像大小为190M左右
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
apjre latest 8cc9aec2b0cb 20 hours ago 190MB
fetch http://mirrors.aliyun.com/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
ERROR: http://mirrors.aliyun.com/alpine/v3.10/main/: temporary error (try again later)
WARNING: Ignoring APKINDEX.f4152a6c.tar.gz: No such file or directory
fetch http://mirrors.aliyun.com/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
2 errors; 14 distinct packages available
ERROR: http://mirrors.aliyun.com/alpine/v3.10/community/: temporary error (try again later)
WARNING: Ignoring APKINDEX.d5bb4c05.tar.gz: No such file or directory
如出现以上错误,在build命令中加上--network=host参数
docker build -t apjre . --network=host
五、测试
# 用Dockerfile中默认的CMD
[root@localhost ~]# docker run -p 8081:3000 -itd --name jar1 apjre
# 替换Dockerfile中的CMD为/bin/sh -c 'java -jar /app/anron.jar --spring.profiles.active=prod'
[root@localhost ~]# docker run -p 8082:3000 -itd --name jar2 apjre /bin/sh -c 'java -jar /app/anron.jar --spring.profiles.active=prod'
[root@localhost ~]# docker exec -it jar1 /bin/sh
/usr/local/soft/jre # ps -ef
PID USER TIME COMMAND
1 root 0:05 java -jar /app/anron.jar -Xms2048M -Xmx2048M -XX:NewSize=512m -XX:MaxNewSize=512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -Dfile.encoding=UTF-8
35 root 0:00 /bin/sh
40 root 0:00 ps -ef
/usr/local/soft/jre # exit
[root@localhost ~]# docker exec -it jar2 /bin/sh
/usr/local/soft/jre # ps -ef
PID USER TIME COMMAND
1 root 0:04 java -jar /app/anron.jar --spring.profiles.active=prod
35 root 0:00 /bin/sh
40 root 0:00 ps -ef