Docker镜像的优化
我们在使用docker镜像的时候会发现一些镜像运行的话会非常的大,占用系统资源,那么我们其实是可以通过优化来解决这样的问题的
镜像的优化准则:
- 选择最精简的基础镜像
- 减少镜像的层数
- 清理镜像构建的中间产物
- 注意优化网络请求
- 尽量去用构建缓存
- 使用多阶段构建镜像
那么接下来我们以为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镜像的优化相关推荐
- 前端 Docker 镜像体积优化
如果 2019 年技术圈有十大流行词,容器化肯定占有一席之地,随着 Docker 的风靡,前端领域应用到 Docker 的场景也越来越多,本文主要来讲述下开源的分布式图数据库 Nebula Graph ...
- Docker镜像压缩与优化
现如今docker如此受人追捧,主要是因为它的轻量化.可以快速部署以及资源的利用.但是一个docker images质量的好与坏,主要取决于Dockerfile编写的质量.同样功能的镜像,但是不同的D ...
- Docker最全总结,DockerFile,Docker编排容器,Docker镜像,Docker-compose构建
文章目录 Docker 简介 为什么使用docker: Docker引擎: Docker系统镜像: Docker容器: Docker仓库: ubuntu安装docker: ubuntu脚本自动安装: ...
- python docker 镜像过大_Docker镜像压缩与优化操作
现如今docker如此受人追捧,主要是因为它的轻量化.可以快速部署以及资源的利用.但是一个docker images质量的好与坏,主要取决于dockerfile编写的质量.同样功能的镜像,但是不同的d ...
- 深入剖析Docker镜像
作者:乔克 公众号:运维开发故事 知乎:乔克叔叔 大家好,我是乔克,一名一线运维实践者. 镜像对于YAML工程师来说都不陌生,每天都在和他打交道,编写.构建.发布,重复而有趣. 在我们编写 ...
- Docker镜像优化
Docker镜像优化 原文:Docker镜像优化 前言 上篇博文说到使用Visual Studio Tools for Docker帮助我们生成Dockerfile,现在我们讨论下生成的Dockerf ...
- Docker 镜像优化:从 1.16GB 到 22.4MB
作者 | The Agile Crafter Docker 是一个供软件开发人员和系统管理员使用容器构建.运行和与分享应用程序的平台.容器是在独立环境中运行的进程,它运行在自己的文件系统上,该文件系统 ...
- 优化 ASP.NET Core Docker 镜像的大小
在这容器化的世界里,我们已经很少直接通过文件发布来运行asp.net core程序了.现在大多数情况下,我们都会使用docker来运行程序.在使用docker之前,我们往往需要打包我们的应用程序.as ...
- docker镜像创建与优化
1 . 创建镜像 有两种方法构建镜像: docker commit :将运行的容器保存成镜像 Dockerfile:自动构建 使用docker commit 创建镜像分为三步: 运行容器 修改容器 将 ...
最新文章
- ShardingSphere-Proxy分库分表以及多租户安装使用
- 动力节点的课堂笔记_男孩把历史笔记画成“漫画”,同学成小粉丝,网友:别人家的孩子...
- LC31 Next Permutation
- Nosql and Mongodb 介绍
- DIY Ruby CPU 分析——Part III
- UA OPTI501 电磁波8 麦克斯韦方程边界条件的推导
- 如何判断SAP CDS view的association是inner join还是outer join实现的
- SpringBoot项目如何部署到独立的tomcat上
- 正常的vite创建项目并且安装vue router,vant的代码示例
- 新一代国际视频编解码标准正式出炉,腾讯超100项提案获标准采纳
- 掌握 cinder-scheduler 调度逻辑 - 每天5分钟玩转 OpenStack(48)
- Java 随机数,可变参数,JDBC,访问控制
- 百度人脸识别技术应用002---百度云上创建人脸库_分组_以及通过网页上传人脸照片到人脸分组
- 微信电脑客户端可以刷朋友圈啦
- 使用laravel-wechat微信支付
- 点灯科技Arduino开发环境搭建
- Linux生成校验文件asc,使用 GnuPG 加密签名来验证下载文件的可靠性和完整性
- qt获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址
- [TL-WR841N V5~V9] 无线桥接(WDS)如何设置?
- EMNLP2021论文:元学习大规模多标签文本分类