前言

镜像的优化注意几条:

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

接下来我们以rhel7镜像构建容器,并在容器中安装nginx的源码包。以此容器构建新的镜像并做做优化

1.软件准备

[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# ls
nginx-1.15.9.tar.gz  rhel7.tar

2.导入rhel7镜像

[root@server1 ~]# docker load -i rhel7.tar

3.编写Dockerfile

[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# vim Dockerfile
FROM rhel7
COPY yum.repo /etc/yum.repos.d/yum.repo
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make
ADD nginx-1.15.9.tar.gz /mnt   ##ADD比COPY更强大,如果文件是可识别的压缩文件,会帮忙解压
WORKDIR /mnt/nginx-1.15.9
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc     ##关闭debug日志
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;"]


4.构建镜像

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



5.创建容器,并测试是否能正常访问

[root@server1 docker]# docker run -d --name nginx nginx:v1
096c2d2020638963e877e07a850589ff30e5f5af45278e33f8a859fed35dc81d
[root@server1 docker]#
[root@server1 docker]# docker inspect nginx
"Source": "/var/lib/docker/volumes/7a9f496f3b9d16fa9725ca107c39fa8b9d782c18f0dd3f8d04ea17022b72905a/_data",
"IPAddress": "172.17.0.2",[root@server1 docker]# cd /var/lib/docker/volumes/7a9f496f3b9d16fa9725ca107c39fa8b9d782c18f0dd3f8d04ea17022b72905a/_data
[root@server1 _data]# ls
50x.html  index.html
[root@server1 _data]# echo  "hello world" > index.html
[root@server1 _data]#
[root@server1 _data]# cat index.html
hello world
[root@server1 _data]#
[root@server1 _data]# curl 172.17.0.2
hello world


6.查看镜像大小,优化前大小为276M

[root@server1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v1                  c3370bb3788a        6 minutes ago       276MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

第一次优化:

优化思路:将不想看到的输出都导入到垃圾箱,例如刚刚封装时编译过程,如下图

1.重新编写Dockerfile

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

2.重新封装镜像

[root@server1 docker]# pwd
/tmp/docker
[root@server1 docker]# docker build -t nginx:v2 .


3.再次查看镜像大小,与之前做比较,仅仅少了4M,效果不佳

[root@server1 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
nginx               v2                  e47941468af7        About a minute ago   252MB
nginx               v1                  c3370bb3788a        16 minutes ago       276MB
rhel7               latest              0a3eb3fde7fd        5 years ago          140MB

第二次优化:

优化思路:将RUN都放在一行,减少镜像层数

1.Dockerfile如下

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


2.构建镜像并查看镜像大小

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

[root@server1 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v3                  cbda333c4f7d        30 seconds ago      250MB
nginx               v2                  e47941468af7        14 minutes ago      252MB
nginx               v1                  c3370bb3788a        29 minutes ago      276MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

优化后镜像减少了2M,效果仍然不佳

第三次优化:

优化思路:使用多阶段构建

1.Dokcerfile如下

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


2.构建镜像并查看镜像大小

[root@server1 docker]# docker build -t nginx:v4 .
[root@server1 docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               v4                  51d0075d7486        23 seconds ago      141MB
nginx               v3                  cbda333c4f7d        4 minutes ago       250MB
nginx               v2                  e47941468af7        18 minutes ago      252MB
nginx               v1                  c3370bb3788a        33 minutes ago      276MB
rhel7               latest              0a3eb3fde7fd        5 years ago         140MB

优化后效果明显镜像减小到150M

第四次优化:究极优化

优化思路:从底层优化

1.首先我们需要导入一个distroless和nginx镜像

distroless”镜像只包含应用程序及其运行时依赖项,不包含程序包管理器、shell以及在标准Linux发行版中可以找到的任何其他程序。
用distroless去除容器中所有不必要的东西

[root@server1 docker]# docker load -i distroless.tar
668afdbd4462: Loading layer [==================================================>]  18.39MB/18.39MB
Loaded image: gcr.io/distroless/base:latest[root@server1 docker]# docker load -i nginx.tar
014cf8bfcb2d: Loading layer [==================================================>]  58.46MB/58.46MB
832a3ae4ac84: Loading layer [==================================================>]  53.91MB/53.91MB
e89b70d28795: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: nginx:latest

2.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;"]

2.构建镜像并查看镜像大小

显而易见,镜像大大减小为23.2M,效果明显

[root@server1 docker]# docker build -t nginx:v5 .
[root@server1 docker]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED              SIZE
nginx                    v5                  ea590f5d522f        About a minute ago   23.2MB
nginx                    v4                  51d0075d7486        20 minutes ago       141MB
nginx                    v3                  cbda333c4f7d        25 minutes ago       250MB
nginx                    v2                  e47941468af7        39 minutes ago       252MB
nginx                    v1                  c3370bb3788a        About an hour ago    276MB

3.构建容器并测试

[root@server1 docker]# docker run -d --name vm1 nginx:v5
50a7f5cf1617d57df98659a99424e327ee529dab1e8b16f2ba222014b64e457a

查看IP

[root@server1 docker]# docker inspect vm1

[root@server1 docker]# curl  172.17.0.3

能正常访问到Nginx默认发布页,证明容器镜像可以正常使用

Dockerfile镜像优化方案指引相关推荐

  1. 2022-03-13 转载 Dockerfile 高阶使用指南及镜像优化

    进阶:Dockerfile 高阶使用指南及镜像优化.md 查看全文 http://www.taodudu.cc/news/show-1600090.html 相关文章: 2022-03-21 转载办公 ...

  2. 优化Docker镜像大小方案 2017年12月10日 17:54:46 阅读数:1774 标

    2019独角兽企业重金招聘Python工程师标准>>> 优化Docker镜像大小方案 2017年12月10日 17:54:46 阅读数:1774 标签: Docker 更多 个人分类 ...

  3. docker镜像的构建及Dockerfile的详解应用,镜像加速器,镜像优化

    docker镜像的构建及dockerfile的祥解应用 1.镜像的构建 1.1创建一个Dockerfile 1.2构建镜像 1.3查看镜像的分层结构 1.4镜像的缓存特性 2.Dockerfile详解 ...

  4. Dockerfile构建Nginx镜像、镜像优化(多阶段构建,最小化镜像构建)

    Dockerfile创建镜像 Dockerfile 有以下指令选项: FROM MAINTAINER RUN CMD EXPOSE ENV ADD COPY ENTRYPOINT VOLUME USE ...

  5. Docker镜像优化

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

  6. 拒绝卡顿,揭秘盒马鲜生 Android 短视频秒播优化方案

    简介:短视频作为内容重要的承载方式,是吸引用户的重点,短视频的内容与体验直接关系到用户是否愿意长时停留.因此,体验的优化就显得尤为重要.上一篇我们分享了 iOS 短视频秒播优化,这篇我们来聊聊 And ...

  7. 金山逍遥网 sersync 服务器实时镜像同步方案

    金山逍遥网 sersync 服务器实时镜像同步方案 1. sersync+rsync原理 2.inotify和sersync同步的区别 3. 配置sersync+rsync实现实时同步 2台cento ...

  8. Docker 镜像优化与最佳实践

    云栖TechDay41期,阿里云高级研发工程师御坂带来Docker镜像优化与最佳实践.从Docker镜像存储的原理开始,针对镜像的存储.网络传输,介绍如何在构建中对这些关键点进行优化.并介绍Docke ...

  9. Android开发——H5容器加载速度优化方案

    1. 背景介绍 在偏重活动运营的电商App中,受制于App版本审核,具备开发周期短.可灵活发布等特点的H5页面受到青睐,承载了很多重要业务.但App Webview存在令人烦恼的性能问题,特别突出的是 ...

最新文章

  1. android api24如何使用uri,URI API(地图调起)
  2. R语言ggplot2可视化:为层次聚类树状图dendrogram中的簇进行着色、在树状图dendrogram中为不同的层次聚类簇配置不同的色彩
  3. swift_020(Swift 的属性)
  4. 5年 Python 功力,总结了 10 个开发技巧
  5. Maven(四):定制库到Mave本地资源库 (Kaptcha)
  6. java对字符串归一化_搜索引擎中的字符串归一化 | 学步园
  7. Spark中使用Dataset的groupBy/agg/join/broadcast hasjoin/sql broadcast hashjoin示例(java api)
  8. HTML一片空白, 无法渲染: Empty tag doesn't work in some browsers
  9. 亲串 (hdu 2203 KMP)
  10. 容器技术Docker K8s 46 Serverless Kubernetes(ASK)详解-场景应用
  11. 维纳滤波器matlab程序,维纳滤波原理及其matlab实现
  12. 直流双闭环pwm调速系统matlab仿真,基于Matlab的双闭环PWM直流调速虚拟实验系统
  13. Android NE问题分析方法介绍
  14. vue + element 实现文件上传
  15. 马云给正在奋斗的人的经典语句
  16. 如何通过修改注册表改变系统的默认文件夹
  17. java cookbook 3_CookBook/Java核心/3-Java反射.md at master · Byron4j/CookBook · GitHub
  18. 增量学习 (Incremental Learning)
  19. 应用进程和内核的关系
  20. 睡到自然醒的7个关键

热门文章

  1. xgboost不能解决哪些问题?为什么?进而说明树模型有哪些缺陷?那种模型能够树模型的这种缺陷?
  2. NLP命名实体识别NER数据准备及模型训练实例
  3. groupby+(apply+agg+transform)方法的比较
  4. 俞敏洪+摆脱恐惧+世界想让你做一个平凡的人、你信了吗
  5. ML基石_1_LearningProblem
  6. Linux命令grep
  7. coco数据集大小分类_MicroSoft COCO数据集
  8. vue 定时循环 setInterval
  9. 图像拼接--Seam Carving for Content-Aware Image Resizing
  10. 图像拼接--A multiresolution spline with application to image mosaics