Linux之Dockerfile封装镜像后的优化

本文详细介绍了如何使用Dockerfile构建Nginx镜像,并通过多阶段构建、清理中间产物及使用精简基础镜像等方式进行镜像优化,显著减少了镜像大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Dockerfile封装Nginx

实验准备:docker环境、宿主机yum源、docker容器内的yum源、nginx-1.15.8.tar.gz、rhel7镜像

删除占用端口80的容器进程

1. 编写Dockerfile

vim /root/docker/Dockerfile
FROM rhel7
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.15.8.tar.gz /mnt
EXPOSE 80
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

2. 构建镜像

cd /root/docker
docker build -t rhel7:nginx .

3. 创建并运行容器

docker run -d --name vm1 -p 80:80 rhel7:nginx
docker ps
docker images

我们可以看到基础镜像只有140M,但是,构建好的镜像却比之前增加了126M。

4. 测试

注意清理浏览器中的缓存,避免影响实验效果

http://172.25.65.1    

二、Nginx镜像的优化

减少镜像的层数、清理镜像构建的中间产物、使用多阶段构建镜像

1. 编写Dockerfile文件

vim /root/docker/Dockerfile
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.15.8.tar.gz /mnt
EXPOSE 80
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && rm -fr /var/cache/yum && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-*

FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

2. 构建镜像并运行相应容器

docker rm -f vm1
docker build -t rhel7:v1 .
docker run -d --name vm1 -p 80:80 rhel7:v1
docker images rhel7

经过清理中间产物和多阶段构建和减少分层等方法,我们可以看到在基础镜像140M的基础上,构建的镜像只有1M

三、Nginx镜像的优化——使用最精简的基础镜像

实验准备:下载distroless.tar和nginx.tar镜像

1. 导入镜像到容器中

docker load -i distorless.tar
docker load -i nginx.tar
docker images

2. 编写Dockerfile

vim /root/docker/Dockerfile
FROM nginx:1.16 as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG Asia/Shanghai

RUN mkdir -p /opt/var/cache/nginx && \
    cp -a --parents /usr/lib/nginx /opt && \
    cp -a --parents /usr/share/nginx /opt && \
    cp -a --parents /var/log/nginx /opt && \
    cp -aL --parents /var/run /opt && \
    cp -a --parents /etc/nginx /opt && \
    cp -a --parents /etc/passwd /opt && \
    cp -a --parents /etc/group /opt && \
    cp -a --parents /usr/sbin/nginx /opt && \
    cp -a --parents /usr/sbin/nginx-debug /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
    cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
    cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
    cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime

FROM gcr.io/distroless/base
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]

3. 构建镜像

cd /root/docker
docker build -t rhel7:v2 .
docker images rhel7

使用最精简的基础镜像(16.8M)进行搭建,最后构建的镜像只有25.1M

4. 运行容器并手动挂载

docker rm -f vm1
docker run -d --name vm1 -p 80:80 -v /webdata:/usr/share/nginx/html rhel7:v2
cd /webdata
vim index.html
www.westos.org
www.westos.org
www.westos.org

5. 测试

http://172.25.65.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值