我们在使用docker镜像的时候会发现一些镜像运行的话会非常的大,占用系统资源,那么我们其实是可以通过优化来解决这样的问题的

镜像的优化准则:

  1. 选择最精简的基础镜像
  2. 减少镜像的层数
  3. 清理镜像构建的中间产物
  4. 注意优化网络请求
  5. 尽量去用构建缓存
  6. 使用多阶段构建镜像

那么接下来我们以为rhel7镜像nginx的源码安装为例来做优化
1.首先获得一个nginx的源码包

[root@server1 docker]# ls
Dockerfile  nginx-1.15.8.tar.gz  web  yum.repo
[root@server1 docker]#

2.编写Dockerfile文件

[root@server1 docker]# cat Dockerfile
FROM rhel7
COPY yum.repo /etc/yum.repos.d/yum.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

3.构建镜像


[root@server1 docker]# docker images nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 af236e3138f9 About a minute ago 276MB
nginx latest 53f3fd8007f7 3 weeks ago 109MB
我们可以很容易的看到我构建的镜像的大小有276MB,比官方的nginx大了很多,那么我们就要开始对其进行优化
在优化前我们先尝试一下我们的nginx是否成功了

[root@server1 docker]# docker run -d --name nginx nginx:v1
b098b2a4bf0f3478e7156663a6e97d19424331e094ce06922b26a902de53bc34



上面的目录为nginx容器默认发布界面的在物理机目录
4.开始优化;
第一次优化:将不想看到的输出都导入到垃圾箱

[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM rhel7
COPY yum.repo /etc/yum.repos.d/yum.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && yum clean all
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx
RUN make &> /dev/null
RUN make install &> /dev/null
RUN rm -fr /mnt/nginx-1.15.8
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]



然后我们再比较,发现大小有变化。
第二次优化:把run全部放在一行,这样减少层数,但是效果不是很好,减少的比较少,这里就不做具体说明了
第三次优化:使用多阶段构建

[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM rhel7 as build
COPY yum.repo /etc/yum.repos.d/yum.repo
ADD nginx-1.15.8.tar.gz /mnt
WORKDIR /mnt/nginx-1.15.8
RUN rpmdb --rebuilddb && yum install -y gcc make zlib-devel pcre-devel && yum clean all &&sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -rf /mnt/nginx-1.15.8FROM rhel7
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

其实这样就类似与我们在一台主机上安装了nginx,但是我们只需要将这台主机上的nginx拷贝到另一台主机上,这样,第二台主机就只有nginx,而没有了之前的那么多东西

重构镜像

[root@server1 docker]# docker build -t nginx:v3 .



我们可以发现以下减少了快一半
我们来测试一下是否可用

[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v3
595ab7b2d3db839ba43f595030df0e7f5373ef5c7c478dbe3e3333b5becfa57c


我们看到是完全可用的
第四次优化:使用最精简的镜像
因为nginx服务,不是用到了所有的数据。所以我们选择使用最精简的镜像来重构镜像

[root@server1 ~]# docker load -i distroless.tar
668afdbd4462: Loading layer  18.39MB/18.39MB
Loaded image: gcr.io/distroless/base:latest
[root@server1 ~]# docker images gcr.io/distroless/base
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
gcr.io/distroless/base   latest              9a255d5fe262        49 years ago        16.8MB

我们可以看到这个镜像同rhel7的大小小了太多,但是镜像小,也就代表了需要我们的操作就会更多,因为很多东西还没有构建,关于distroless镜像的使用大家可以自己百度,这里就不做过多说明了

我们来重新编写Dockerfile

[root@server1 ~]# cd /tmp/docker/
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# 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/baseCOPY --from=base /opt /EXPOSE 80ENTRYPOINT ["nginx", "-g", "daemon off;"]

其实这就像我们在一张白纸上书写了我们所需要的东西。
重构镜像

[root@server1 docker]# docker rm -f nginx
nginx
[root@server1 docker]# docker build -t nginx:v4 .



我们可以发现其仅仅只有20多MB
测试nginx是否正常

[root@server1 docker]# docker run -d --name nginx -p 80:80 nginx:v4
ce0702ce569c8c5bfe4199dfae880a865f1bb8f146f8bbc70962c5a8b2443748

Docker镜像的优化相关推荐

  1. 前端 Docker 镜像体积优化

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

  2. Docker镜像压缩与优化

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

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

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

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

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

  5. 深入剖析Docker镜像

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

  6. Docker镜像优化

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

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

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

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

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

  9. docker镜像创建与优化

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

最新文章

  1. ShardingSphere-Proxy分库分表以及多租户安装使用
  2. 动力节点的课堂笔记_男孩把历史笔记画成“漫画”,同学成小粉丝,网友:别人家的孩子...
  3. LC31 Next Permutation
  4. Nosql and Mongodb 介绍
  5. DIY Ruby CPU 分析——Part III
  6. UA OPTI501 电磁波8 麦克斯韦方程边界条件的推导
  7. 如何判断SAP CDS view的association是inner join还是outer join实现的
  8. SpringBoot项目如何部署到独立的tomcat上
  9. 正常的vite创建项目并且安装vue router,vant的代码示例
  10. 新一代国际视频编解码标准正式出炉,腾讯超100项提案获标准采纳
  11. 掌握 cinder-scheduler 调度逻辑 - 每天5分钟玩转 OpenStack(48)
  12. Java 随机数,可变参数,JDBC,访问控制
  13. 百度人脸识别技术应用002---百度云上创建人脸库_分组_以及通过网页上传人脸照片到人脸分组
  14. 微信电脑客户端可以刷朋友圈啦
  15. 使用laravel-wechat微信支付
  16. 点灯科技Arduino开发环境搭建
  17. Linux生成校验文件asc,使用 GnuPG 加密签名来验证下载文件的可靠性和完整性
  18. qt获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址
  19. [TL-WR841N V5~V9] 无线桥接(WDS)如何设置?
  20. EMNLP2021论文:元学习大规模多标签文本分类

热门文章

  1. 程序框图与计算机程序,深度解析算法与程序框图.pdf
  2. Android6.0 源码修改之Settings音量调节界面增加通话音量调节
  3. 383计算机毕业设计
  4. 5年内禁用支付宝和微信支付!多地公安出手:这些人摊上大事了
  5. 台式计算机清洁除尘内容,台式电脑除尘法, 需要的赶紧收藏
  6. 计蒜客习题:骑车比赛
  7. Audition 入门系列(合集)_MediaTea的博客-CSDN博客
  8. Cognos 配置启动错误
  9. Spring MVC ModelAndView 简述
  10. 相机内参模型Mei/omni-directional详解