docker容器(二)鏡像大小優化
- 1、部署有nginx的rhel7系統的鏡像
- 2、鏡像優化
前言:本文是在上一篇的基礎上攥寫,所以yum源已配好
1、部署有nginx的rhel7系統的鏡像
docker commit 構建新鏡像三部曲:
1運行容器
2修改容器
3將容器保存為新的鏡像
提前準備rhel7.tar和nginx-1.20.1.tar.gz安裝包
[root@server1 mnt]# mkdir /root/docker #創建目錄
[root@server1 mnt]# cd /root/docker/
[root@server1 docker]# cat Dockerfile #撰寫Dockerfile檔案
FROM rhel7
EXPOSE 80 #如果容器中運行應用服務,暴露服務埠為80出去
VOLUME ["/usr/local/nginx/html"] #掛載實際目錄,資料存在于真實主機
COPY dvd.repo /etc/yum.repos.d/ #拷貝軟體倉庫檔案
ADD nginx-1.20.1.tar.gz /mnt #解壓縮到指定目錄
RUN rpmdb --rebuilddb #倉庫記錄清理
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.20.1
RUN ./configure &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
[root@server1 docker]# docker build -t rhel7:v1 . #創建新鏡像(執行dockerfile)
[root@server1 docker]# docker run -d --name demo rhel7:v1 #使用rhel7:v1鏡像運行容器名為demo
[root@server1 docker]# docker inspect demo #查看容器詳細資訊,可以查看到ip地址

curl 172.17.0.2測驗,會出現 403錯誤,因為資料掛載在真實主機路徑上,真實路徑上沒有資料,無法訪問到內容

cd /var/lib/docker/volumes/d2a5343235da301cb0ced6fa9ab6f990f1c5fb2a8f68d15592b139b1bcd34855/_data
echo www.westos.org > index.html
再次 curl 172.17.0.2,就可以看到發布頁面

docker images查看鏡像,發現rhel7:v1大小是303M,太大了,

2、鏡像優化
下面就來優化鏡像的大小,主要有下面幾種辦法:
1、選擇最精簡的基礎鏡像
2、減少鏡像的層數
3、清理鏡像構建的中間產物
4、注意優化網路請求
5、盡量去用構建快取
6、使用多階段構建鏡像
接下來,就優化dockerfile這個檔案的撰寫,使其正常部署ngnix并且盡量簡短,
首先,幾個RUN執行陳述句可以合并到一起,關閉nginx編譯debug模塊,清除系統快取及nginx編譯目錄
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -rf /mnt/nginx-1.20.1 /var/cache/*
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
修改完成后,docker build -t rhel7:v2 .生成新的鏡像rhel7:v2,此時再次查看大小為255M,有一定的優化,但是還不夠,

接下來,上面不僅產生了我們想要的ngnix還生成了相對應的編譯環境,然而我們并不需要這個環境,還占用記憶體,所以使用多階段構建鏡像,先用基礎模塊產生ngnix等一系列產物,然后只把這個基礎模塊中的 /usr/local/nginx目錄復制給第二個模塊,我們只需要拿第二個模塊的東西,這樣可以大大縮小size
FROM rhel7 as build
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.20.1.tar.gz /mnt
WORKDIR /mnt/nginx-1.20.1
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -rf /mnt/nginx-1.20.1 /var/cache/*
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
修改完成后,docker build -t rhel7:v3 .生成新的鏡像rhel7:v3,此時再次查看大小為141M,又有一定的優化,但是還不夠極致,

為了進一步壓縮,考慮到rhel7中組件過多,很多東西用不上,還占空間,所以想要更換輕量級源鏡像,但是不能光圖輕量級,我們還需要給他安裝nignx所需要的函式庫,如下

繼續修改dockerfile檔案,給ngnix最基本的函式庫,使用最基本的鏡像base-debian10
FROM nginx:latest as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG TIME_ZONE
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/ld-* /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* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /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-debian10
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx", "-g", "daemon off;"]
修改完成后,docker build -t rhel7:v4 .生成新的鏡像rhel7:v4,此時再次查看大小為31M,對比最開始,鏡像大小縮小了很多,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/289540.html
標籤:其他
上一篇:那些你不得不知道的網路協議——DHCP、DHCP中繼、VRRP
下一篇:UniApp+Vue實作直播功能
