Docker新手入门——————镜像优化

这篇博客介绍了Docker镜像优化的方法,包括选择最精简的基础镜像,减少镜像层数,清理构建过程中的中间产物,以及使用多阶段构建来优化镜像大小。通过实例演示了如何编写Dockerfile,以及如何通过合并RUN指令、删除不必要的文件和使用多阶段构建来实现镜像的高效优化。

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

1. 镜像优化要求

要求:

  • 选择最精简的镜像(重)
  • 减少镜像层数
  • 清理镜像构建的中间产物。
  • 注意优化网络请求(提高构建速度)
  • 尽量使用构建缓存
  • 使用多阶构建镜像(重)

1.1 直接建立

1)创建dockerfile:部署一个nginx镜像

[root@docker 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文件:

[root@docker docker]# vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.5.250/rhel7.3
gpgcheck=0

3)建立镜像:

[root@docker 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)再次构建:构建成功

[root@docker 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

[root@docker 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)构建镜像:

[root@docker docker]# docker build -t nginx-song:v2 .

Successfully built d4a998a59401
Successfully tagged nginx-song:v2

3)查看镜像大小:

[root@docker 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明显减少

[root@docker 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

[root@docker 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)再次构建:

[root@docker 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)查看大小:

[root@docker 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)查看镜像层:更少了

[root@docker 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 -

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值