Docker 多阶段构建的原理及构建过程展示
Docker多阶段构建是一个优秀的技术,可以显著减少 Docker 镜像的大小,从而加快镜像的构建速度,并减少镜像的传输时间和存储空间。本文将详细介绍 Docker 多阶段构建的原理、用途以及示例。
Docker 多阶段构建的原理
在传统的 Docker 镜像构建中,我们通常需要在 Dockerfile 中指定多个步骤,每个步骤都需要添加一些新的层到镜像中。这样做的问题是,每个层都会添加额外的文件和元数据到镜像中,因此镜像的大小会变得非常大。当需要传输这些镜像到其他地方时,这会消耗大量的时间和网络带宽。
为了解决这个问题,Docker 多阶段构建提供了一种方法来构建一个 Docker 镜像,该镜像只包含必要的文件和元数据,而不包含多余的信息。具体来说,Docker 多阶段构建允许您在同一个 Dockerfile 中定义多个阶段,每个阶段可以独立地构建、测试和优化。在每个阶段结束时,只需将必要的文件和元数据复制到下一个阶段,并舍弃上一个阶段中的多余信息。这样,您就可以在不增加镜像大小的情况下构建出一个可靠的 Docker 镜像。
Docker 多阶段构建的用途
Docker 多阶段构建的主要用途是减少 Docker 镜像的大小。由于每个阶段只包含必要的文件和元数据,所以您可以显著减少 Docker 镜像的大小,并加快构建速度。此外,Docker 多阶段构建还提供了一种简单的方法来构建、测试和优化多个应用程序,因为每个阶段都可以使用不同的环境和工具。
Docker 多阶段构建的示例
下面是一个使用 Docker 多阶段构建构建 Nginx应用程序的示例。该示例分为两个阶段:第一个阶段使用 Alpine 官方镜像来构建应用程序,第二个阶段使用 Alpine镜像 +Nginx运行时文件来运行应用程序。
首先拉取一个alpline镜像,并查看镜像的大小,可以看到只有7M
[root@server159 ~]# docker pull alpine
[root@server159 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7-python v1 e6a497c56c1c 16 hours ago 526MB
php-fpm v1 0474bd7488fa 39 hours ago 698MB
debian latest 676aedd4776f 3 weeks ago 117MB
alpine latest 8ca4688f4f35 4 weeks ago 7.34MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
nginx 1.18.0 c2c45d506085 2 years ago 133MB
随便创建一个空目录,最好是空的不要有其它文件
然后编写一个Dockerfile文件
[root@server159 alpine]# ls
Dockerfile
[root@server159 alpine]# cat Dockerfile
FROM alpine:latest as relay_nginx
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \apk add --no-cache gcc libgcc libc-dev zlib-dev pcre-dev wget make openssl-dev && \wget -c http://nginx.org/download/nginx-1.22.0.tar.gz && \tar xf nginx-1.22.0.tar.gz && \cd nginx-1.22.0 && \./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_auth_request_module --with-http_random_index_module && \make && make install && \rm -rf /usr/local/nginx/conf/*.default && \cd ../ && \rm -rf nginx-1.22.0* /var/cache/apk/*ADD ./index.html /usr/share/nginx/html/index.html
EXPOSE 80
EXPOSE 443ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
然后构建镜像
[root@server159 alpine]# docker build --no-cache -t nginx:alpine-1.0 .
构建完以后查看我们的镜像,可以看到大小为172M
[root@server159 alpine]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine-1.0 e096be22d040 34 seconds ago 172MB
centos7-python v1 e6a497c56c1c 16 hours ago 526MB
php-fpm v1 0474bd7488fa 39 hours ago 698MB
debian latest 676aedd4776f 3 weeks ago 117MB
alpine latest 8ca4688f4f35 4 weeks ago 7.34MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
nginx 1.18.0 c2c45d506085 2 years ago 133MB
构建一个容器查看效果
[root@server159 alpine]# docker run --name nginx-alpine-1.0 -d -p8080:80 nginx:alpine-1.0
21fa466986ab11cfac2c8c23b4772e8c2213d83e2ffc414c289420756106d1ed
去浏览器访问
可以看到容器是正常运行的
然后我们再编写Dockerfile文件,多加一层镜像的构建
[root@server159 alpine]# cat Dockerfile
FROM alpine:latest as relay_nginx
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \apk add --no-cache gcc libgcc libc-dev zlib-dev pcre-dev wget make openssl-dev && \wget -c http://nginx.org/download/nginx-1.22.0.tar.gz && \tar xf nginx-1.22.0.tar.gz && \cd nginx-1.22.0 && \./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_auth_request_module --with-http_random_index_module && \make && make install && \rm -rf /usr/local/nginx/conf/*.default && \cd ../ && \rm -rf nginx-1.22.0* /var/cache/apk/*FROM alpine:latest as alpine_nginx
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \apk add --no-cache zlib-dev pcre-dev openssl-dev && \rm -rf /var/cache/apk/*COPY --from=relay_nginx /usr/local/nginx /usr/local/nginx
EXPOSE 80
EXPOSE 443ENTRYPOINT ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
编写完毕以后我们构建一个2.0版本的镜像
[root@server159 alpine]# docker build --no-cache -t nginx:alpine-2.0 .
产看镜像
[root@server159 alpine]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine-2.0 11c2c53e9585 10 seconds ago 24.1MB
nginx alpine-1.0 603a2f2545fe 6 minutes ago 172MB
centos7-python v1 e6a497c56c1c 16 hours ago 526MB
php-fpm v1 0474bd7488fa 39 hours ago 698MB
debian latest 676aedd4776f 3 weeks ago 117MB
alpine latest 8ca4688f4f35 4 weeks ago 7.34MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
nginx 1.18.0 c2c45d506085 2 years ago 133MB
可以惊奇的发现我们2.0的镜像仅仅只有24M,小了好几倍
然后也用2.0的镜像生成一个容器测试一下可用性
[root@server159 alpine]# docker run --name nginx-alpine-2.0 -d -p8081:80 nginx:alpine-2.0
73e2a462573e3c5298ad6e255a95d214aad58ce498becfcac2fde8799c796d1e
然后去网页访问
说明我们的2.0版本镜像也是可以正常运行的
但是却小了好多,那是因为我们构建了两层的镜像,而底层的镜像会被压缩
所以这就是多层镜像构建的好处,在发布的时候可以大大缩减镜像的大小
在这个基础上再定制我们自己想要的镜像,就是一项很好的优化
相关文章:

Docker 多阶段构建的原理及构建过程展示
Docker多阶段构建是一个优秀的技术,可以显著减少 Docker 镜像的大小,从而加快镜像的构建速度,并减少镜像的传输时间和存储空间。本文将详细介绍 Docker 多阶段构建的原理、用途以及示例。 Docker 多阶段构建的原理 在传统的 Docker 镜像构建…...
【开题报告】基于Spring Boot的家装产品展示交易平台的设计与实现
1.研究背景和目的 随着人们对居住环境舒适度和个性化需求的不断提升,家装市场正逐渐发展成为一个重要的消费领域。为了满足消费者对家装产品的需求,建立一个高效、可靠的家装产品展示交易平台变得尤为重要。本项目旨在通过使用Spring Boot框架ÿ…...

MacOS安装git
文章目录 通过Xcode Command Lines Tool安装(推荐)终端直接运行git命令根据流程安装先安装Command Lines Tool后再安装git 官网下载二进制文件进行安装官方国外源下载二进制文件(不推荐)国内镜像下载二进制文件(推荐)安装git 通过Xcode Command Lines Tool安装(推荐) 简单来讲C…...

京东协议算法最新版
环境准备 1 com.jingdong.app.mall11.6.4 入口定位 逆向分析,发现 params 里面有一个 sign 以及请求头里面有一个 jdgs 首先我们发现京东的 sign 是 32 位的,猜测其可能是 md5 之类的 hash 算法,既然是 hash 算法,那么就大概率…...
软考系统架构设计师案例分析知识汇总
软件架构风格 △△△ 软件架构风格是描述某一类特定应用领域中软件系统组织方式和惯用方式。组织方式描述了系统的组成构件和这些构件的组织方式,惯用模式则反映众多系统共有的结构和语义。 面向对象架构风格的特征是将数据表示和基本操作封装在对象中。这种模式的构件是对象…...
MyBatis-plus 代码生成器
具体代码 application.yaml server:port: 8081 #自定义端口号spring:datasource:url: jdbc:mysql://localhost:3306/itcast?useUnicodetrue&characterEncodingutf-8&serverTimezoneGMT%2B8username: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver…...

运维常识——网络
内网,公网IP 内网IP为专网IP 因为网络资源(IP地址不够,所以引出来了内网IP和IPv6) 内网IP和公网IP之分是为了减缓IP地址不够使用的情况 一般设置代理服务器 设置两张网卡 一张对外一张对内 内部主机将数据转发到内网卡&#…...

《研发效能(DevOps)工程师》课程简介(一)丨IDCF
为贯彻落实《关于深化人才发展体制机制改革的意见》,推动实施人才强国战略,促进专业技术人员提升职业素养、补充新知识新技能,实现人力资源深度开发,推动经济社会全面发展,根据《中华人民共和国劳动法》有关规定&#…...

OMV 介绍及安装
# Time: 2023/11/02 #Author: Xiaohong # 运行电脑: Lenovo X201I (Intel(R) Core(TM) i3 CPU M 370 2.40GHz) # 功能: OMV 介绍及安装 导图 若OMV6 安装Extras 插件失败,可以参考 OMV6 安装Extras 插件失败的解决方法...

JAVA 实现PDF转图片(spire.pdf.free版)
1.引入jar包 导入方法1: 手动引入。将Free Spire.PDF for Java下载到本地,解压,找到lib文件夹下的Spire.PDF.jar文件。在IDEA中打开如下界面,将本地路径中的jar文件引入Java程序: 导入方法2:如果您想通过…...

高效学习工具之AnkiMobile新手入门指南(ios端,包括ipad、ihpone设备)————创建、使用、备份、设置参数、相关资料
文章目录 0 背景0.1 闭环学习0.2 什么是anki0.3 anki践行者经验分享 1 开始使用1.1 导入1.2 创建空白组1.3 创建卡片1.3.1 利用anki创建卡片的两种方法1.3.2 复习材料分类 1.4 筛选(做减法,拆分学习(做子卡牌集合))&am…...

LiveMeida视频接入网关
一、产品简介 视频接入网关主要部署在视频存储节点或视频汇聚节点,面向不同用户,主要用于对接不同厂家、不同型号的摄像机设备,获取摄像机视频后,以统一标准的视频格式和传输协议,将视频推送至上层联网/应用平台。可广…...

我和云栖有个约会
文章目录 云栖大会体验与感受大模型的体验感受 对大会的期待 云栖大会 云栖大会是是阿里巴巴集团主办的年度技术盛会,是云计算、大数据、人工智能等前沿技术产业发展的见证者、参与者和推动者。2023年的云栖大会于10月31日在杭州开幕,吸引了全球的技术专…...
模拟官网编写自定义Grafana Dashboard
前言 我们想编写自定义的Dashboard,类似于官网那样下载的Dashboard,并且能移值到机器主机,如何实现了? ## 官网dashboard https://grafana.com/grafana/dashboards/ 编写 先在虚拟机写好Dashboard 然后下载。json文件如下: {…...

组件局部注册和全局注册
普通组件的注册使用-局部注册 1.特点: 只能在注册的组件内使用 2.实现效果 3.步骤: 创建.vue文件(三个组成部分)在使用的组件内先导入再注册,最后使用 4.使用方式: 当成html标签使用即可 <组件名&…...
【数据结构】模拟实现stack
namespace my_stack {//适配器模式/配接器template <class T,class Containervector<T>>class stack {public:void push(const T& val){_con.push_back(val);}void pop(){_con.pop_back();}const T& top(){return _con.back();}size_t size(){return _con.…...
Hive创建分区表并插入数据
业务中经常会遇到这种需求:数据每天全量更新,但是要求月底将数据单独保存一份以供后期查询某月节点的信息。这时就要考虑用到Hive的分区表实现,即按照月份创建分区表,相当于新的月份数据保存在新表,进而实现保存了历史…...
虚拟机防火墙关闭教程
虚拟机防火墙关闭教程 连接数据库请求超时 教程...

《研发效能(DevOps)工程师》课程简介(二)丨IDCF
为贯彻落实《关于深化人才发展体制机制改革的意见》,推动实施人才强国战略,促进专业技术人员提升职业素养、补充新知识新技能,实现人力资源深度开发,推动经济社会全面发展,根据《中华人民共和国劳动法》有关规定&#…...

EViews| 基础操作 备战下周机考
目录 一、创建工作文件 1、非时间序列数据 2、时间序列数据 二、导入数据 1、导入数据 2、保存数据组合或方程结果 三、估计回归模型 1、估计回归模型 2、回归结果名词解读 四、检验模型设定错误 1、检验是否遗漏变量 2-1、检验是否加入了不相干变量 2-2、惩罚新增…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...