天天看點

Docker新手入門——————鏡像優化1. 鏡像優化要求

文章目錄

  • 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 -
           

選擇精簡鏡像層,就能更好的優化容器。