一:制作小体积的docker镜像
如果直接习惯性的基于centos系统镜像构建其他应用镜像,那么构建出来的应用镜像通常会比较大。因为centos系统镜像本身就已经很大了。
而且你还会直接docker run启动一个镜像,安装完所有包进行docker commit ,这样出来的镜像体积非常大。下面手把手教你制作小体积的镜像
1.1 基于Centos的Dockerfile
dockerfile
FROM centos:7
RUN yum install -y gcc zlib-devel pcre-devel make wget && \
wget -c http://nginx.org/download/nginx-1.22.0.tar.gz && \
tar xf nginx-1.22.0.tar.gz && \
cd nginx-1.22.0 && \
./configure --prefix=/usr/local/nginx && \
make && \
make install && \
cd ../ && \
rm -rf nginx-1.22.0*
EXPOSE 80
ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
上面这个例子打出来的镜像大概有452MB
看下镜像大小:
[root@node1 k8s-master]# docker images | grep "centos_nginx"
centos_nginx v1 f519c23e2458 18 minutes ago 452MB
所以,如果想构建体积比较小的镜像,除了减少构建层外,最重要的还是使用自身体积小的基础镜像
1.2 利用Apline的Dockerfile
dockerfile
FROM alpine:3.14
RUN yum install -y gcc zlib-devel pcre-devel make wget && \
wget -c http://nginx.org/download/nginx-1.22.0.tar.gz && \
tar xf nginx-1.22.0.tar.gz && \
cd nginx-1.22.0 && \
./configure --prefix=/usr/local/nginx && \
make && \
make install && \
cd ../ && \
rm -rf nginx-1.22.0*
EXPOSE 80
ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
上面这个例子打出来的镜像大概有300MB
bash
看下镜像大小:
[root@node1 k8s-master]# docker images | grep "centos_nginx"
centos_nginx v1 f519c23e2458 18 minutes ago 300MB
1.3 终极大招,利用Apline加多阶段构建
dockerfile
FROM alpine:3.14 as relay_nginx
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories && \
apk add gcc libgcc libc-dev zlib-dev pcre-dev wget make && \
wget -c http://nginx.org/download/nginx-1.22.0.tar.gz && \
tar xf nginx-1.22.0.tar.gz && \
cd nginx-1.22.0 && \
./configure --prefix=/usr/local/nginx && \
make && \
make install && \
cd ../ && \
rm -rf nginx-1.22.0* /var/cache/apk/*
FROM alpine:3.14 as alpine_nginx
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories && \
apk add zlib-dev pcre-dev && \
rm -rf /var/cache/apk/*
COPY --from=relay_nginx /usr/local/nginx /usr/local/nginx
EXPOSE 80
ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
docker build -t alpine_nginx:v1 .
对比镜像大小
bash
[root@node1 k8s-master]# docker images | egrep "alpine_nginx|centos_nginx"
centos_nginx v1 f519c23e2458 18 minutes ago 452MB
alpine_nginx v1 675ff100541a 10 minutes ago 14.8MB
下面讲解一下为什么镜像这么小
对比单阶段构建,上述案例的最终镜像有明显优势:
体积极致小:最终镜像基于alpine:3.18(约 5MB),总体积通常 < 30MB;
部署速度快:小体积镜像拉取时间短,尤其在云环境或边缘节点部署时更明显。
安全性高:不含编译器、源代码等冗余文件,攻击面大幅减少。