镜像的优化,可以参考以下的这些思路和方法

• 选择最精简的基础镜像

• 减少镜像的层数

• 清理镜像构建的中间产物

• 注意优化网络请求

• 尽量去用构建缓存

• 使用多阶段构建镜

实例分析

1. 先用Dockerfile的方式构建完整的镜像

[root@vm2 demo]# vim Dockerfile
FROM centos:7
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN yum install -y gcc
RUN yum install -y make
RUN yum install -y pcre-devel
RUN yum install -y openssl-devel
RUN ./configure --with-http_stub_status_module --with-http_ssl_module
RUN make
RUN make install
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

1.2 构建镜像

[root@vm2 demo]# docker build -t nginx:v1 .
Sending build context to Docker daemon  1.077MB
Step 1/12 : FROM centos:7---> eeb6ee3f44bd
Step 2/12 : ADD nginx-1.21.6.tar.gz /mnt---> Using cache---> c2400bf7d847
Step 3/12 : WORKDIR /mnt/nginx-1.21.6---> Using cache---> 77fd90fc9682
......

1.3  查看原始镜像的大小

[root@vm2 demo]# docker images
REPOSITORY                                                   TAG       IMAGE ID       CREATED          SIZE
nginx                                                        v1        76f4a58cb1cd   24 seconds ago   1GB

1.4 试运行nginx看镜像是否构建成功

[root@vm2 demo]# docker run -d --name demo nginx:v1
8015488c833e32393afa80d99442c795495ca9b3c9ced4a09af9a03b4d527151
[root@vm2 demo]# docker inspect demo
......"Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Adress": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null
......
[root@vm2 demo]# curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

2. 开始优化镜像

2.1 减少镜像层数

2.1.1 编辑Dockerfle文件

[root@vm2 demo]# cat Dockerfile
FROM centos:7
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN yum install -y gcc make pcre-devel openssl-devel
RUN ./configure --with-http_stub_status_module --with-http_ssl_module
RUN make && make install
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

2.1.2  构建镜像

[root@vm2 demo]# docker build -t nginx:v2 .
Sending build context to Docker daemon  1.077MB
Step 1/8 : FROM centos:7---> eeb6ee3f44bd
Step 2/8 : ADD nginx-1.21.6.tar.gz /mnt---> Using cache---> c2400bf7d847
Step 3/8 : WORKDIR /mnt/nginx-1.21.6---> Using cache---> 77fd90fc9682
Step 4/8 : RUN yum install -y gcc make pcre-devel openssl-devel---> Running in 56bc0dc1e0e0
......

2.1.3  查看优化后镜像大小,从1G优化到了489MB

[root@vm2 demo]# docker images
REPOSITORY                                                   TAG       IMAGE ID       CREATED          SIZE
nginx                                                        v2        88b6db3d846c   2 minutes ago    489MB
nginx                                                        v1        76f4a58cb1cd   30 minutes ago   1GB

2.2 清理镜像构建的中间产物

2.2.1  编辑Dockerfile文件

[root@vm2 demo]# vim Dockerfile
[root@vm2 demo]# cat Dockerfile
FROM centos:7
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN yum install -y gcc make pcre-devel openssl-devel && yum clean all
RUN ./configure --with-http_stub_status_module --with-http_ssl_module && make && make install && rm -rf nginx-1.21.6
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

2.2.2  构建镜像

[root@vm2 demo]# docker build -t nginx:v3 .
Sending build context to Docker daemon  1.077MB
Step 1/7 : FROM centos:7---> eeb6ee3f44bd
Step 2/7 : ADD nginx-1.21.6.tar.gz /mnt---> Using cache---> c2400bf7d847
Step 3/7 : WORKDIR /mnt/nginx-1.21.6---> Using cache---> 77fd90fc9682
.......

2.2.3  查看优化后镜像大小,从优化489MB到了343MB

[root@vm2 demo]# docker images
REPOSITORY                                                   TAG       IMAGE ID       CREATED          SIZE
nginx                                                        v3        5f3ea7feb686   31 seconds ago   343MB
nginx                                                        v2        88b6db3d846c   14 minutes ago   489MB
nginx                                                        v1        76f4a58cb1cd   41 minutes ago   1GB

2.3 使用多阶段构建镜像

2.3.1  编辑Dockerfile文件

[root@vm2 demo]# cat Dockerfile
FROM centos:7 as build
ADD nginx-1.21.6.tar.gz /mnt
WORKDIR /mnt/nginx-1.21.6
RUN yum install -y gcc pcre-devel openssl-devel make && sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_stub_status_module --with-http_ssl_module && make && make install && rm -fr /mnt/nginx-1.21.6 &&  yum remove -y gcc make && yum clean allFROM ubuntu
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]

2.3.2  构建镜像

[root@vm2 demo]# docker build -t nginx:v4 .
Sending build context to Docker daemon  1.077MB
Step 1/8 : FROM centos:7 as build---> eeb6ee3f44bd
Step 2/8 : ADD nginx-1.21.6.tar.gz /mnt---> Using cache---> c2400bf7d847
Step 3/8 : WORKDIR /mnt/nginx-1.21.6---> Using cache---> 77fd90fc9682
......

2.2.3  查看优化后镜像大小,从优化343MB到了73.8MB

[root@vm2 demo]# docker images
REPOSITORY                                                   TAG       IMAGE ID       CREATED             SIZE
nginx                                                        v4        bebb7b749f15   42 seconds ago      73.8MB
nginx                                                        v3        5f3ea7feb686   56 minutes ago      343MB
nginx                                                        v2        88b6db3d846c   About an hour ago   489MB
nginx                                                        v1        76f4a58cb1cd   2 hours ago         1GB

2.4  选择最精简的基础镜像

[root@vm2 docker]# docker load -i base-debian11.tar
5b1fa8e3e100: Loading layer  3.697MB/3.697MB
0b3d0512394d: Loading layer  18.28MB/18.28MB
Loaded image: gcr.io/distroless/base-debian11:latest
[root@vm2 demo]# docker images
REPOSITORY                                                   TAG       IMAGE ID       CREATED             SIZE
nginx                                                        v4        bebb7b749f15   9 minutes ago       73.8MB
nginx                                                        v3        5f3ea7feb686   About an hour ago   343MB
nginx                                                        v2        88b6db3d846c   About an hour ago   489MB
nginx                                                        v1        76f4a58cb1cd   2 hours ago         1GB
gcr.io/distroless/base-debian11                              latest    24787c1cd2e4   52 years ago        20.3MB

2.4.1  编辑Dockerfile文件

[root@vm2 demo]# cat Dockerfile
FROM nginx as base# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG Asia/ShanghaiRUN 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 /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.so.* /opt && \cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /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/localtimeFROM gcr.io/distroless/base-debian11COPY --from=base /opt /EXPOSE 80 443ENTRYPOINT ["nginx", "-g", "daemon off;"]

2.4.2  构建镜像

[root@vm2 demo]# docker build -t nginx:v5 .
Sending build context to Docker daemon  1.078MB
Step 1/7 : FROM nginx as base---> 605c77e624dd
Step 2/7 : ARG Asia/Shanghai---> Running in cfe1693ba0b5
Removing intermediate container cfe1693ba0b5---> 85e91536c15f
Step 3/7 : RUN mkdir -p /opt/var/cache/nginx &&     cp -a --parents /usr/lib/nginx /opt
.......

2.4.3  查看优化后镜像大小,只有29.8MB

[root@vm2 demo]# docker images
REPOSITORY                                                   TAG       IMAGE ID       CREATED             SIZE
nginx                                                        v5        343b2be8341c   36 seconds ago      29.8MB
nginx                                                        v4        bebb7b749f15   13 minutes ago      73.8MB
nginx                                                        v3        5f3ea7feb686   About an hour ago   343MB
nginx                                                        v2        88b6db3d846c   About an hour ago   489MB
nginx                                                        v1        76f4a58cb1cd   2 hours ago         1GB

可以看到这个最后构建出来的最精简的基础镜像,大小只有29.8MB。但是镜像小,也就意味着我们的操作空间会变大,可以根据自己的需求来添加所需要的功能,这样就大大减少了镜像所占有的系统资源,做到了优化镜像的目的。

Docker-镜像的优化相关推荐

  1. 前端 Docker 镜像体积优化

    如果 2019 年技术圈有十大流行词,容器化肯定占有一席之地,随着 Docker 的风靡,前端领域应用到 Docker 的场景也越来越多,本文主要来讲述下开源的分布式图数据库 Nebula Graph ...

  2. Docker镜像的优化

    我们在使用docker镜像的时候会发现一些镜像运行的话会非常的大,占用系统资源,那么我们其实是可以通过优化来解决这样的问题的 镜像的优化准则: 选择最精简的基础镜像 减少镜像的层数 清理镜像构建的中间 ...

  3. Docker镜像压缩与优化

    现如今docker如此受人追捧,主要是因为它的轻量化.可以快速部署以及资源的利用.但是一个docker images质量的好与坏,主要取决于Dockerfile编写的质量.同样功能的镜像,但是不同的D ...

  4. Docker最全总结,DockerFile,Docker编排容器,Docker镜像,Docker-compose构建

    文章目录 Docker 简介 为什么使用docker: Docker引擎: Docker系统镜像: Docker容器: Docker仓库: ubuntu安装docker: ubuntu脚本自动安装: ...

  5. python docker 镜像过大_Docker镜像压缩与优化操作

    现如今docker如此受人追捧,主要是因为它的轻量化.可以快速部署以及资源的利用.但是一个docker images质量的好与坏,主要取决于dockerfile编写的质量.同样功能的镜像,但是不同的d ...

  6. 深入剖析Docker镜像

    作者:乔克 公众号:运维开发故事 知乎:乔克叔叔 ​ 大家好,我是乔克,一名一线运维实践者. ​ 镜像对于YAML工程师来说都不陌生,每天都在和他打交道,编写.构建.发布,重复而有趣. ​ 在我们编写 ...

  7. Docker镜像优化

    Docker镜像优化 原文:Docker镜像优化 前言 上篇博文说到使用Visual Studio Tools for Docker帮助我们生成Dockerfile,现在我们讨论下生成的Dockerf ...

  8. Docker 镜像优化:从 1.16GB 到 22.4MB

    作者 | The Agile Crafter Docker 是一个供软件开发人员和系统管理员使用容器构建.运行和与分享应用程序的平台.容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统 ...

  9. 优化 ASP.NET Core Docker 镜像的大小

    在这容器化的世界里,我们已经很少直接通过文件发布来运行asp.net core程序了.现在大多数情况下,我们都会使用docker来运行程序.在使用docker之前,我们往往需要打包我们的应用程序.as ...

  10. docker镜像创建与优化

    1 . 创建镜像 有两种方法构建镜像: docker commit :将运行的容器保存成镜像 Dockerfile:自动构建 使用docker commit 创建镜像分为三步: 运行容器 修改容器 将 ...

最新文章

  1. Sublime Text 3搭建前端环境
  2. VA01创建SO的增强点MV45AFZZ的几点实际应用总结
  3. 经典问题:微服务和分布式的区别
  4. SAP中国研究院再次荣获年度中国最佳雇主,国际友人纷纷发来贺电
  5. PHP yii 框架源码阅读(一)
  6. win8配置_《FIFA 20》PC配置公布 最低仅需i3+GTX660
  7. mysql 安全删除_mysql的binlog安全删除的一种方法
  8. 第二天——hibernate讲完了
  9. 施工部署主要不包括_施工部署是什么?准备工作是什么?
  10. 国庆通知:地球不爆炸,CSDN 不放假!
  11. 417.太平洋大西洋水流问题(力扣leetcode) 博主可答疑该问题
  12. godot 编译失败
  13. 如何用命令行去修改视频文件格式
  14. java类加载器不同导致SPI 报错 not a subtype
  15. DIV+CSS排版技巧
  16. 二维码签到的几大优势,你了解几个?
  17. 更改Pycharm的配置文件的存放路径
  18. 职场新人应该如何培养项目管理的能力?
  19. 【C++】Boost库简介
  20. Day28 49. 丑数

热门文章

  1. Android 音频源码分析——音量调节流程
  2. 软件开发生命周期中的设计阶段_软件的生命周期——测试人员必须了解的事
  3. SSM公司企业OA管理系统
  4. b500k电位器引脚接法_6脚电位器B50K,引脚怎么接呢
  5. Qcom平台 Camera 之常见错误和问题
  6. LTE中物理资源块的进一步认识
  7. 【科普】USDT的三种链类型(Omni、ERC20、TRC20)
  8. c语言报错spawning 插1,Visual C++中error spawning cl.exe错误的两种解决方法.
  9. Java Web前后端分离项目—后端servlet实例
  10. 对称、群论与魔术(九)——魔术《五边形的奇迹》