c4rt1y

容器镜像优化指南-kafkamanager

0x01 介绍

本文简要介绍下,容器化下,如何精简镜像的一些方案~

0x02 内容

随着业务的发展,网络也逐渐成为了一个问题,同步传输镜像的情况下,时间逐步增加,因此镜像的优化也是一个整改因素。针对于镜像,目前业界有如下几种方案:
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段,简直是上天了,花了好久时间~

0x04 资料来源

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
GoTop