天天看点

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 -
           

选择精简镜像层,就能更好的优化容器。