本文简要介绍下,容器化下,如何精简镜像的一些方案~
随着业务的发展,网络也逐渐成为了一个问题,同步传输镜像的情况下,时间逐步增加,因此镜像的优化也是一个整改因素。针对于镜像,目前业界有如下几种方案:
1、精简layout层
2、使用较小的镜像
3、使用build简化镜像
安装一个kafka-manager为例,版本为2.0.0.2,大小为92M
-rw-r--r--@ 1 coco staff 92M Sep 1 17:57 kafka-manager-2.0.0.2.zip
为了测试,首先下载下一个镜像
docker pull openjdk:8-jdk
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
openjdk 8-jdk 08121337b7a4 13 days ago 526MB
编写dockerfile
cat Dockerfile
FROM openjdk:8-jdk
LABEL maintainer="c4rt1y"
ENV KAFKA_MANAGER_VERSION=2.0.0.2
ENV ZK_HOSTS=localhost:2181
ENV KAFKA_MANAGER_AUTH_ENABLED=false
ENV KAFKA_MANAGER_USERNAME=admin
ENV KAFKA_MANAGER_PASSWORD=password
ENV APPLICATION_SECRET="^<csmm5Fx4d=r2HEX8pelM3iBkFVv?k[mc;IZE<_Qoq8EkX_/7@Zt6dP05Pzea3U"
ENV KAFKA_MANAGER_LDAP_ENABLED=false
ENV KAFKA_MANAGER_LDAP_SERVER=""
ENV KAFKA_MANAGER_LDAP_PORT=389
ENV KAFKA_MANAGER_LDAP_USERNAME=""
ENV KAFKA_MANAGER_LDAP_PASSWORD=""
ENV KAFKA_MANAGER_LDAP_SEARCH_BASE_DN=""
ENV KAFKA_MANAGER_LDAP_SEARCH_FILTER="(uid=$capturedLogin$)"
ENV KAFKA_MANAGER_LDAP_CONNECTION_POOL_SIZE=10
ENV KAFKA_MANAGER_LDAP_SSL=false
ENV KAFKA_MANAGER_EXTRA_PLAY_OPTS=""
ENV JAVA_OPTS=""
ADD kafka-manager-2.0.0.2.zip /opt/
RUN unzip -q /opt/kafka-manager-2.0.0.2.zip -d /opt/ && mv /opt/kafka-manager-2.0.0.2/ /opt/kafka-manager && rm -f /opt/kafka-manager-2.0.0.2.zip
EXPOSE 9000
EXPOSE 9443
WORKDIR /opt/kafka-manager
ENTRYPOINT ["/bin/bash","-c"]
CMD ["/opt/kafka-manager/bin/kafka-manager ${KAFKA_MANAGER_EXTRA_PLAY_OPTS}"]
# 生成镜像
docker build -t kafkamanager:openjdk-8-jdk .
#生成镜像大小
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kafkamanager openjdk-8-jdk d64b017663d8 17 hours ago 760MB
openjdk 8-jdk 08121337b7a4 13 days ago 526MB
# 修改镜像信息,使用8-jdk-alpine3.9版本
docker pull openjdk:8-jdk-alpine3.9
# 查看镜像大小,会发现小了很多很多
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kafkamanager openjdk-8-jdk d64b017663d8 17 hours ago 760MB
openjdk 8-jdk 08121337b7a4 13 days ago 526MB
openjdk 8-jdk-alpine3.9 a3562aa0b991 2 years ago 105MB
# 复制一份dockerfile,修改镜像位子
cat Dockerfile.apline
FROM openjdk:8-jdk-alpine3.9
LABEL maintainer="c4rt1y"
ENV KAFKA_MANAGER_VERSION=2.0.0.2
ENV ZK_HOSTS=localhost:2181
ENV KAFKA_MANAGER_AUTH_ENABLED=false
ENV KAFKA_MANAGER_USERNAME=admin
ENV KAFKA_MANAGER_PASSWORD=password
ENV APPLICATION_SECRET="^<csmm5Fx4d=r2HEX8pelM3iBkFVv?k[mc;IZE<_Qoq8EkX_/7@Zt6dP05Pzea3U"
ENV KAFKA_MANAGER_LDAP_ENABLED=false
ENV KAFKA_MANAGER_LDAP_SERVER=""
ENV KAFKA_MANAGER_LDAP_PORT=389
ENV KAFKA_MANAGER_LDAP_USERNAME=""
ENV KAFKA_MANAGER_LDAP_PASSWORD=""
ENV KAFKA_MANAGER_LDAP_SEARCH_BASE_DN=""
ENV KAFKA_MANAGER_LDAP_SEARCH_FILTER="(uid=$capturedLogin$)"
ENV KAFKA_MANAGER_LDAP_CONNECTION_POOL_SIZE=10
ENV KAFKA_MANAGER_LDAP_SSL=false
ENV KAFKA_MANAGER_EXTRA_PLAY_OPTS=""
ENV JAVA_OPTS=""
ADD kafka-manager-2.0.0.2.zip /root/
RUN apk add --no-cache bash && unzip -q /root/kafka-manager-2.0.0.2.zip -d /opt/ && mv /opt/kafka-manager-2.0.0.2/ /opt/kafka-manager
EXPOSE 9000
EXPOSE 9443
WORKDIR /opt/kafka-manager
ENTRYPOINT ["/bin/bash","-c"]
CMD ["/opt/kafka-manager/bin/kafka-manager ${KAFKA_MANAGER_EXTRA_PLAY_OPTS}"]
# 生成镜像
docker build -t kafkamanager:openjdk-8-jdk-alpine3.9-v1 -f Dockerfile.apline-v1 .
#生成镜像大小
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kafkamanager openjdk-8-jdk-alpine3.9-v1 60442b07ff49 17 hours ago 343MB
kafkamanager openjdk-8-jdk d64b017663d8 17 hours ago 760MB
openjdk 8-jdk 08121337b7a4 13 days ago 526MB
openjdk 8-jdk-alpine3.9 a3562aa0b991 2 years ago 105MB
# 这时候你会发现大小对比760M对比343M,小了一半左右
# 我们就考虑,压缩文件还在里面,因此可以删除压缩文件,是否会减去92M,测试一下
cat Dockerfile.apline.v1
FROM openjdk:8-jdk-alpine3.9
LABEL maintainer="c4rt1y"
ENV KAFKA_MANAGER_VERSION=2.0.0.2
ENV ZK_HOSTS=localhost:2181
ENV KAFKA_MANAGER_AUTH_ENABLED=false
ENV KAFKA_MANAGER_USERNAME=admin
ENV KAFKA_MANAGER_PASSWORD=password
ENV APPLICATION_SECRET="^<csmm5Fx4d=r2HEX8pelM3iBkFVv?k[mc;IZE<_Qoq8EkX_/7@Zt6dP05Pzea3U"
ENV KAFKA_MANAGER_LDAP_ENABLED=false
ENV KAFKA_MANAGER_LDAP_SERVER=""
ENV KAFKA_MANAGER_LDAP_PORT=389
ENV KAFKA_MANAGER_LDAP_USERNAME=""
ENV KAFKA_MANAGER_LDAP_PASSWORD=""
ENV KAFKA_MANAGER_LDAP_SEARCH_BASE_DN=""
ENV KAFKA_MANAGER_LDAP_SEARCH_FILTER="(uid=$capturedLogin$)"
ENV KAFKA_MANAGER_LDAP_CONNECTION_POOL_SIZE=10
ENV KAFKA_MANAGER_LDAP_SSL=false
ENV KAFKA_MANAGER_EXTRA_PLAY_OPTS=""
ENV JAVA_OPTS=""
ADD kafka-manager-2.0.0.2.zip /root/
RUN apk add --no-cache bash && unzip -q /root/kafka-manager-2.0.0.2.zip -d /opt/ && mv /opt/kafka-manager-2.0.0.2/ /opt/kafka-manager && rm -f /root/kafka-manager-2.0.0.2.zip
EXPOSE 9000
EXPOSE 9443
WORKDIR /opt/kafka-manager
ENTRYPOINT ["/bin/bash","-c"]
CMD ["/opt/kafka-manager/bin/kafka-manager ${KAFKA_MANAGER_EXTRA_PLAY_OPTS}"]
# 生成镜像
docker build -t kafkamanager:openjdk-8-jdk-alpine3.9-v2 -f Dockerfile.apline-v1 .
#生成镜像大小
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kafkamanager openjdk-8-jdk-alpine3.9-v2 60442b07ff49 17 hours ago 343MB
kafkamanager openjdk-8-jdk-alpine3.9-v1 60442b07ff49 17 hours ago 343MB
kafkamanager openjdk-8-jdk d64b017663d8 17 hours ago 760MB
openjdk 8-jdk 08121337b7a4 13 days ago 526MB
openjdk 8-jdk-alpine3.9 a3562aa0b991 2 years ago 105MB
# 会发现,删除操作没有任何效果,其实是增加了一层layout的原因,那么该怎么去解决这个问题,我们就可以引入build层,直接展示如下
cat Dockerfile.apline.v2
FROM openjdk:8-jdk-alpine3.9 AS build
ADD kafka-manager-2.0.0.2.zip /root/
RUN unzip -q /root/kafka-manager-2.0.0.2.zip -d /opt/
FROM openjdk:8-jdk-alpine3.9
LABEL maintainer="Delta Projects"
ENV KAFKA_MANAGER_VERSION=2.0.0.2
ENV ZK_HOSTS=localhost:2181
ENV KAFKA_MANAGER_AUTH_ENABLED=false
ENV KAFKA_MANAGER_USERNAME=admin
ENV KAFKA_MANAGER_PASSWORD=password
ENV APPLICATION_SECRET="^<csmm5Fx4d=r2HEX8pelM3iBkFVv?k[mc;IZE<_Qoq8EkX_/7@Zt6dP05Pzea3U"
ENV KAFKA_MANAGER_LDAP_ENABLED=false
ENV KAFKA_MANAGER_LDAP_SERVER=""
ENV KAFKA_MANAGER_LDAP_PORT=389
ENV KAFKA_MANAGER_LDAP_USERNAME=""
ENV KAFKA_MANAGER_LDAP_PASSWORD=""
ENV KAFKA_MANAGER_LDAP_SEARCH_BASE_DN=""
ENV KAFKA_MANAGER_LDAP_SEARCH_FILTER="(uid=$capturedLogin$)"
ENV KAFKA_MANAGER_LDAP_CONNECTION_POOL_SIZE=10
ENV KAFKA_MANAGER_LDAP_SSL=false
ENV KAFKA_MANAGER_EXTRA_PLAY_OPTS=""
ENV JAVA_OPTS=""
COPY --from=build /opt/kafka-manager-2.0.0.2 /opt/kafka-manager
RUN apk add --no-cache bash
EXPOSE 9000
EXPOSE 9443
WORKDIR /opt/kafka-manager
ENTRYPOINT ["/bin/bash","-c"]
CMD ["/opt/kafka-manager/bin/kafka-manager ${KAFKA_MANAGER_EXTRA_PLAY_OPTS}"]
# 生成镜像
docker build -t kafkamanager:openjdk-8-jdk-alpine3.9-v3 -f Dockerfile.apline-v1 .
#生成镜像大小
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kafkamanager openjdk-8-jdk-alpine3.9-v3 fe9e89afa316 17 hours ago 246MB
kafkamanager openjdk-8-jdk-alpine3.9-v2 60442b07ff49 17 hours ago 343MB
kafkamanager openjdk-8-jdk-alpine3.9-v1 60442b07ff49 17 hours ago 343MB
kafkamanager openjdk-8-jdk d64b017663d8 17 hours ago 760MB
openjdk 8-jdk 08121337b7a4 13 days ago 526MB
openjdk 8-jdk-alpine3.9 a3562aa0b991 2 years ago 105MB
kafkamanager/kafka-manager 2.0.0.2 6a508d0e11b2 2 years ago 438MB
# 会发现,使用build模式之后,体积明显变小,至此基本如是~
# ps:为什么我会重新打包kafkamanager,因为我对他爱的深沉。主要原因是,我发现用kafkamanager连接zookeeper集群的时候报错,我愣是没反应过来,以为是别人做的镜像有问题,结果最后发现,我们的网段是172段,docker默认的网段,也是172段,简直是上天了,花了好久时间~
https://hub.docker.com/r/kafkamanager/kafka-manager/tags
https://blog.wolfogre.com/posts/kafka-manager-download/
https://github.com/wolfogre/kafka-manager-docker/releases/download/2.0.0.2/kafka-manager-2.0.0.2.zip