文章目錄
- 1. 鏡像優化要求
-
- 1.1 直接建立
- 1.2 清理建構鏡像中間産物
- 1.3 使用多階段建構鏡像
1. 鏡像優化要求
要求:
- 選擇最精簡的鏡像(重)
- 減少鏡像層數
- 清理鏡像建構的中間産物。
- 注意優化網絡請求(提高建構速度)
- 盡量使用建構緩存
- 使用多階建構鏡像(重)
1.1 直接建立
1)建立dockerfile:部署一個nginx鏡像
[[email protected] docker]# vim dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/
RUN yum install -y gcc make pcre-devel zlib-devel
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
2)編寫yum檔案:
[[email protected] docker]# vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.5.250/rhel7.3
gpgcheck=0
3)建立鏡像:
[[email protected] docker]# docker build -t nginx-song:v1
Rpmdb checksum is invalid: dCDPT(pkg checksums): zlib-devel.x86_64 0:1.2.7-17.el7 - u
# 出現錯誤。
4)修改檔案:
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
5)再次建構:建構成功
[[email protected] docker]# docker build -t nginx-song:v1 .
Sending build context to Docker daemon 148.1MB
………………
Successfully built 19d878c879ee
Successfully tagged nginx-song:v1
6)檢視鏡像大小:296M
[[email protected] docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-song v1 19d878c879ee 2 minutes ago 296MB
1.2 清理建構鏡像中間産物
1)修改dockerfile:将多run合并,解決依賴後清空yum倉庫,安裝完成後删除安裝目錄:
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.9
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
2)建構鏡像:
[[email protected] docker]# docker build -t nginx-song:v2 .
Successfully built d4a998a59401
Successfully tagged nginx-song:v2
3)檢視鏡像大小:
[[email protected] docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-song v2 d4a998a59401 17 seconds ago 253MB
nginx-song v1 19d878c879ee 11 minutes ago 296MB
4)檢視v1與v2的層數:v2比v1明顯減少
[[email protected] docker]# docker history nginx-song:v1
IMAGE CREATED CREATED BY SIZE COMMENT
19d878c879ee 14 minutes ago /bin/sh -c #(nop) CMD ["/usr/local/nginx/sb… 0B
e029e309a7fb 14 minutes ago /bin/sh -c make install 3.86MB
9d5168b30df3 14 minutes ago /bin/sh -c make 12.3MB
9f64c46c3301 14 minutes ago /bin/sh -c ./configure --prefix=/usr/local/n… 71.6kB
124b3f3ae5b3 14 minutes ago /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9 0B
2010ad9b58e9 14 minutes ago /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd64… 6.2MB
97d38ee8f246 14 minutes ago /bin/sh -c yum install -y gcc make pcre-deve… 126MB
a9e3c381542b 15 minutes ago /bin/sh -c rpmdb --rebuilddb 6.64MB
e7ac104affae 17 minutes ago /bin/sh -c #(nop) COPY file:cdc4ff92626da754… 66B
3388ca3e91fd 17 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
0a3eb3fde7fd 6 years ago 140MB Imported from
[[email protected] docker]# docker history nginx-song:v2
IMAGE CREATED CREATED BY SIZE COMMENT
d4a998a59401 3 minutes ago /bin/sh -c #(nop) CMD ["/usr/local/nginx/sb… 0B
39f5803f66ea 3 minutes ago /bin/sh -c rpmdb --rebuilddb && yum install … 106MB
c613223d72b9 4 minutes ago /bin/sh -c #(nop) WORKDIR /mnt/nginx-1.15.9 0B
ef3f55eddaef 4 minutes ago /bin/sh -c #(nop) ADD file:a2cce44ecbad0bd64… 6.2MB
e7ac104affae 18 minutes ago /bin/sh -c #(nop) COPY file:cdc4ff92626da754… 66B
3388ca3e91fd 18 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
0a3eb3fde7fd 6 years ago 140MB Imported from -
1.3 使用多階段建構鏡像
其實我們需要的是最終編譯的二進制程式:
1)修改dockerfile:
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.15.9.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.9
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.9
FROM rhel7
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
2)再次建構:
[[email protected] docker]# docker build -t nginx-song:v3 .
Sending build context to Docker daemon 148.1MB
Step 1/11 : FROM rhel7 as build
---> 0a3eb3fde7fd
Step 2/11 : EXPOSE 80
---> Using cache
---> 3388ca3e91fd
Step 3/11 : COPY dvd.repo /etc/yum.repos.d/
---> Using cache
---> e7ac104affae
Step 4/11 : ADD nginx-1.15.9.tar.gz /mnt
---> Using cache
---> ef3f55eddaef
Step 5/11 : WORKDIR /mnt/nginx-1.15.9
---> Using cache
---> c613223d72b9
Step 6/11 : RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && yum clean all && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /mnt/nginx-1.15.9
---> Using cache
---> 39f5803f66ea
Step 7/11 : FROM rhel7
---> 0a3eb3fde7fd
Step 8/11 : EXPOSE 80
---> Using cache
---> 3388ca3e91fd
Step 9/11 : VOLUME ["/usr/local/nginx/html"]
---> Running in ea8a05e01b8e
Removing intermediate container ea8a05e01b8e
---> f673946d83bd
Step 10/11 : COPY --from=build /usr/local/nginx /usr/local/nginx
---> 8e8912902f04
Step 11/11 : CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
---> Running in 5a12b5ad7daa
Removing intermediate container 5a12b5ad7daa
---> b73caec5d60e
Successfully built b73caec5d60e
Successfully tagged nginx-song:v3
3)檢視大小:
[[email protected] docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-song v3 b73caec5d60e 57 seconds ago 144MB
nginx-song v2 d4a998a59401 12 minutes ago 253MB
nginx-song v1 19d878c879ee 24 minutes ago 296MB
4)檢視鏡像層:更少了
[[email protected] docker]# docker history nginx-song:v3
IMAGE CREATED CREATED BY SIZE COMMENT
b73caec5d60e About a minute ago /bin/sh -c #(nop) CMD ["/usr/local/nginx/sb… 0B
8e8912902f04 About a minute ago /bin/sh -c #(nop) COPY dir:291cafd9a03367f03… 3.86MB
f673946d83bd 2 minutes ago /bin/sh -c #(nop) VOLUME [/usr/local/nginx/… 0B
3388ca3e91fd 28 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
0a3eb3fde7fd 6 years ago 140MB Imported from -
選擇精簡鏡像層,就能更好的優化容器。