云原生之深入解析减少Docker镜像大小的优化技巧

news2024/11/26 17:51:36

一、什么是 Docker?

  • Docker 是一种容器引擎,可以在容器内运行一段代码,Docker 镜像是在任何地方运行应用程序而无需担心应用程序依赖性的方式。
  • 要构建镜像,docker 使用一个名为 Dockerfile 的文件,Dockerfile 是一个包含许多指令(RUN、COPY、EXPOSE 等)的文件,成功执行这些命令后,docker 将创建一个镜像供我们在任何地方使用。
  • 为什么要减小 docker 镜像大小?
    • 安装不必要的软件包会增加攻击面,从而增加安全风险;
    • 镜像传输需要更多时间;
    • 部署大镜像需要更多时间;
  • 必须以某种方式创建 Dockerfile,以便从该 Dockerfile 构建的镜像在大小方面得到优化。

二、最小化镜像层

  • 可以减少 Dockerfile 中的层数,dockerfile 中的每个 FROM、RUN、COPY 命令都会创建一个单独的层,并增加镜像的整体大小和构建时间。
  • 要减小 docker 镜像大小,请在单个 RUN 或 COPY 指令中执行多个命令来最小化 Dockerfile 中的层数:
FROM ubuntu:latest
RUN apt update  - y
RUN apt install unzip - y
RUN apt install curl - y
RUN apt install python3 - y
  • 与其对每个命令使用单独的指令,不如将它们组合起来:
FROM ubuntu:latest
RUN apt update  -y && \
apt install unzip -y && \
apt install curl -y && \
apt install python3 -y
  • 从下图中可以看出,通过减少层数,可以减少一些 MB 的大小:

在这里插入图片描述

三、使用 Docker Squash 减小镜像大小

  • Docker 在构建镜像时创建了很多层,压缩有助于在逻辑层中组织镜像,可以控制镜像的结构,而不是让镜像具有多个不必要的层。
  • 可以使用以下命令安装 docker-squash:
pip install docker-squash
  • 可以运行以下命令来减小镜像的大小:
docker-squash image:old -t image:new

在这里插入图片描述

四、使用较小的基础镜像

  • 减小 docker 镜像大小最明显的方法是使用较小的基础镜像,如果希望为 python 应用程序创建镜像,请考虑使用 python:3.9-slim 镜像而不是 python:3.9。python:3.9 的大小约为 1.3 GB,而 python:3.9-slim 的大小仅为 1 GB 左右。
  • 可以使用 alpine 版本进一步减少镜像,alpine 镜像是专门为作为容器运行而设计的,而且体积非常小,python:3.9-alpine 镜像只有 49 MB。

五、使用多阶段构建来减小大小

  • 为了显着减小大小,可以使用 docker 多阶段构建的概念,这里使用不同的 images/Dockerfile 来构建和打包应用代码。
  • 它将 Dockerfile 分成多个阶段,并将所需的工件从一个阶段传递到另一个阶段,然后在最后一个阶段交付缩小镜像大小的最终镜像,它显着减小镜像尺寸。
# Official docker build image, Using  node:14.17-alpine3.14 image for stage-1.
# Stage-1
FROM node:14.17-alpine3.14 as build
# Copy Required files
COPY public /home/app/public/
COPY src /home/app/src/
# dockerfile install multiple packages
RUN apk add g++ make python2
RUN npm install --silent
# Create Build
RUN npm run build
RUN apk --purge del python2
#Run the build by copying the files form previous stage.
# Stage-2
FROM nginx:stable-alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /home/app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  • 这里使用两个阶段从 docker 文件创建镜像,在 Stage-1 中,复制代码并构建它,在 stage-2 中,使用在 stage-1 中构建的代码在 Nginx 中运行。

六、apt 安装中使用 --no-install-recommends 标志

  • 当运行 apt install 命令来安装某些包时,它会安装一些不需要的推荐包,使用 --no-install-recommends 标志可以显着减小镜像大小:
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends
  • 如下图所示,带有 new 标签的镜像由于添加了此标志而减少了 5MB,当要安装多个包时,这将非常有帮助。

在这里插入图片描述

  • 可以在 apk add 命令中添加 --no-cache。

七、在 apt install 命令后添加 rm -rf /var/lib/apt/lists/*

  • 可以在 apt install 之后添加这个命令来减少 docker 镜像的大小:
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
  • 从如下的图中可以看出,已将 docker 镜像的大小减少了约 41 MB:

在这里插入图片描述

八、使用 .dockerignore 文件

  • 如果不想将某些文件复制到 docker 镜像,那么使用 .dockerignore 文件可以节省一些空间。在构建上下文中有一些隐藏的文件/文件夹,可以使用 ADD 或 COPY 命令(如 .git 等)将其传输到镜像,包含一个 .dockerignore 文件以减小 docker 镜像大小是一个很好的做法。
  • .dockerignore 文件示例:
ignorethisfile.txt
logs/
ignorethisfolder/
.git
.cache
*.md

九、在 RUN 之后放置 COPY

  • 在某些情况下,对代码进行了细微的更改,并且需要反复从 dockerfile 构建镜像。在这种情况下,将 COPY 命令放在 RUN 命令之后将有助于减小镜像大小,因为在这种情况下 docker 将能够更好地使用缓存功能。它将为安装了依赖项的镜像创建缓存,每次更改代码时,docker 都会使用该缓存并创建镜像。它还将减少 docker 构建时间。
#Dockerfile-1
FROM ubuntu:latest
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
COPY file /home/ubuntu
#Dockerfile-2
FROM ubuntu:latest
COPY file /home/ubuntu
RUN apt update -y && \
apt install unzip -y --no-install-recommends && \
apt install curl --no-install-recommends -y && \
apt install python3 -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
  • 在上述情况下,dockerfile-1 将能够比 dockerfile-2 表现得更好。

十、安装后删除软件包

  • 如果需要在 docker 镜像中安装一些包,并且从外部下载它们,那么最好在安装后删除这些包。例如,如果希望从 zip 文件安装 AWS CLI V2,那么在成功安装后请记住也删除该 zip 文件:
FROM ubuntu:latest
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
sudo ./aws/install && \
rm awscliv2.zip

十一、使用 Docker 镜像缩容工具

  • 有几个dockerfile 优化工具可以减少 docker 镜像的大小:
    • Dive:Dive 是一个开源工具,用于探索 Docker 镜像及其层内容,然后发现缩小 Docker/OCI 镜像大小的方法;Dive 的 Git 地址;
  • fromlatest.io:此工具将检查 Dockerfile 并检查可以执行的更多步骤以减小镜像大小,具体使用请参考:fromlatest.io;
  • Docker Slim:它让容器更好、更小、更安全,可以使用 dockerslim 来最小化容器镜像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1320842.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux系统和网络(一):文件IO

本文主要探讨linux系统编程的文件IO相关知识。 文件IO 文件存在块设备中为静态文件,open打开文件,内核在进程中建立打开文件的数据结构在内存中用于记录文件的文件参数,开辟一段内存用于存放内容,将静态文件转为动态文件 打开文件后对文件的读写操作都为对动态…

Windows下配置最新ChromeDriver

1、问题 在使用代码调用谷歌浏览器时会出错: from selenium import webdriver driver webdriver.Chrome() SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114 Current browser versi…

网络空间搜索引擎- FOFA的使用技巧总结

简介 FOFA是一款网络空间测绘的搜索引擎,旨在帮助用户以搜索的方式查找公网上的互联网资产。 FOFA的查询方式类似于谷歌或百度,用户可以输入关键词来匹配包含该关键词的数据。不同的是,这些数据不仅包括像谷歌或百度一样的网页,还…

网神防火墙后台用户敏感信息泄露漏洞复现

简介 网神防火墙是一款由中国知名网络安全公司启明星辰开发的防火墙产品。它提供了全面的网络安全防护功能,旨在保护企业网络免受各种网络威胁和攻击。 该产品存在用户账号信息泄露漏洞,通过构造特定数据包,获取防火墙管理员登录的账号密码。 漏洞复现 FOFA语法: body=&…

A01、关于JVM的GC回收

引用类型 对象引用类型分为强引用、软引用、弱引用,具体差别详见下文描述: 强引用:就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用&am…

KSP音频抓包

1. 按照网上其他教程&#xff0c;安装KSP抓音频 Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;38&#xff09;-- KSP in MDE - 大大通(简体站) Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;22&#xff09;--DSP音频链路监听 - 大大通(简体站) <<Biu~笔记&#xff1a;高…

docker 与 ffmpeg

创建容器 docker run -it -v /mnt/f/ffmpeg:/mnt/f/ffmpeg --name ffmpeg 49a981f2b85f /bin/bash 在 Linux 上编译 FFmpeg&#xff1a; 安装依赖库&#xff1a; sudo apt-get update sudo apt-get install build-essential yasm cmake libtool libc6 libc6-dev unzip wget下…

电脑操作系统深度剖析:Windows、macOS和Linux的独特特性及应用场景

导言 电脑操作系统是计算机硬件和应用软件之间的桥梁&#xff0c;不同的操作系统在用户体验、性能和安全性方面有着独特的特色。电脑操作系统是计算机系统中的核心组件&#xff0c;不同的操作系统在设计理念、用户体验和应用领域上存在显著差异。本文将深入探讨几种常见的电脑操…

2018年第七届数学建模国际赛小美赛A题空中加油飞行计划解题全过程文档及程序

2018年第七届数学建模国际赛小美赛 A题 空中加油飞行计划 原题再现&#xff1a; 太平洋中部一个小岛上的居民被自然灾害困住。救援人员需要派遣一架轻型飞机运送少量急救药品到岛上&#xff0c;并运送一名重伤者到医疗基地求救。岛上有一个无人值守的简易机场&#xff0c;可以…

20231218在Ubuntu18.04下以EXT4格式化HDD

20231218在Ubuntu18.04下以EXT4格式化HDD 2023/12/18 17:24 缘起&#xff1a; 编译一个Android10大概要200GB&#xff0c;编译10个Android10的SDK&#xff0c;3TB的HDD机械硬盘就估计会被填满了&#xff01; 如果使用rm -rf *这个命令将SDK一个一个逐个地删除&#xff0c;估计2…

思幻二次元风格的工作室个人引导页源码

思幻工作室个人引导页源码已经完成开发&#xff01;该源码支持三端自适应&#xff0c;并且具备赞助功能。我们选择了当前点赞量最高的配色方案&#xff0c;打造了一个独特的二次元风格引导页。经过在美国服务器上进行的测试&#xff0c;效果令人满意&#xff0c;网页加载速度达…

WordPress主题 响应式个人博客主题Kratos源码

Kratos 是一款专注于用户阅读体验的响应式 WordPress 主题&#xff0c;整体布局简洁大方&#xff0c;针对资源加载进行了优化。 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净&#xff0c;简单且响应迅速的博客主题&#xff0c;Vtrois创建和维护&#xff0c; 主…

【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; X的平方根 class Soluti…

SVN小白常见操作流程

SVN小白常见操作流程 一、什么是Subversion&#xff1f;二、TortoiseSVN客户端安装教程三、SVN 操作3.1 SVN Ckeckout(检出)3.2 Add(新增文件)3.3 SVN Commit(提交)3.4 SVN Update(更新操作)3.5SVN Delete(删除操作)3.6 SVN Revert to a revision(版本回溯)3.7 不同版本内容之间…

P2P网络下分布式文件共享场景的测试

P2P网络介绍 P2P是Peer-to-Peer的缩写&#xff0c;“Peer”在英语里有“对等者、伙伴、对端”的意义。因此&#xff0c;从字面意思来看&#xff0c;P2P可以理解为对等网络。国内一些媒体将P2P翻译成“点对点”或者“端对端”&#xff0c;学术界则统一称为对等网络(Peer-to-Pee…

阿里云|人工智能(AI)技术解决方案

函数计算部署Stable Diffusion AI绘画技术解决方案 通过函数计算快速部署Stable Diffusion模型为用户提供快速通过文字生成图片的能力。该方案通过函数计算快速搭建了AIGC的能力&#xff0c;无需管理服务器等基础设施&#xff0c;专注模型的能力即可。该方案具有高效免运维、弹…

美颜SDK是什么?视频美颜SDK在直播平台中的集成与接入教程详解

当下&#xff0c;主播们追求更加自然、精致的外观&#xff0c;而观众也期待在屏幕前欣赏到更为清晰、美丽的画面。为了满足这一需求&#xff0c;美颜SDK应运而生&#xff0c;成为直播平台的重要利器之一。 一、什么是美颜SDK&#xff1f; 通过美颜SDK&#xff0c;开发者可以…

【Proteus仿真】【Arduino单片机】定时智能插座开关

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使LCD1602液晶&#xff0c;DS18B20温度传感器、按键、蜂鸣器、继电器开关、HC05蓝牙模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD16…

如何让32位.Net 应用打开3G开关

昨天刚分享了《如何让.NET应用使用更大的内存》&#xff0c;结果就有同学说&#xff0c;<最好加一下32位如何开启大内存&#xff0c;因为很多传统项目32位&#xff0c;实在迁移不动了>&#xff0c;那么&#xff0c;我就验证了一些可行的方案&#xff0c;发现都挺简单的。…

TCP/IP详解——FTP 协议,Telnet协议

文章目录 1. FTP 协议1.1 FTP的应用1.2 FTP传输文件的过程1.3 FTP传输模式1.4 主动模式&#xff08;Active Mode&#xff09;1.5 Active Mode 抓包分析1.6 被动模式&#xff08;Passive Mode&#xff09;1.7 Passive Mode 抓包分析 2. Telnet 协议2.1 Telnet 概念2.2 Telnet 协…