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 443

ENTRYPOINT ["/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 443

ENTRYPOINT ["/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版本镜像也是可以正常运行的

但是却小了好多,那是因为我们构建了两层的镜像,而底层的镜像会被压缩

所以这就是多层镜像构建的好处,在发布的时候可以大大缩减镜像的大小

在这个基础上再定制我们自己想要的镜像,就是一项很好的优化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件设计模式的意义

软件设计模式的意义 所有开发人员都应该接触过软件设计模式这个概念,看过《设计模式-可复用的对象软件的基础》这本书,在面试中都被问过: 你用过哪些设计模式这种问题。但很大可能也就仅此而已了。 为什么好像只能从框架中找到设计模式的应用…

Springboot+vue的导师双选管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的导师双选管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的导师双选管理系统,采用M(model&a…

11.4-GPT4AllTools版本已开始对小部分GPT3.5用户内测推送

OpenAI已经开始小规模推送GPT4 AllTools功能,部分GPT博主已经第一时间体验了此功能,此功能特色是整合目前的多模态功能以及文件上传和联网模块,无需切换,更要全面综合 可上传包括 PDF、数据文件在内的任意文档,并进行分…

nerdctl install【nerdctl 安装】

文章目录 1. 在线安装2. 离线安装 1. 在线安装 #!/bin/bashsource ./config.shENABLE_DOWNLOAD${ENABLE_DOWNLOAD:-true}if [ ! -e files ]; thenmkdir -p files fiFILES_DIR./files if $ENABLE_DOWNLOAD; thenFILES_DIR./tmp/filesmkdir -p $FILES_DIR fi# download files, i…

智能井盖生产商家,万宾科技井盖传感器产品详情

市政府管理水平决定城市人民幸福程度,所以在智慧城市推进过程中,市政府也在加快城市信息基础设施建设,希望提高公共服务水平,以此来满足城市居民的需求,进一步推进城市信息化智能化发展。作为城市生命线的一个组成部分…

python调用飞书机器人发送文件

当前飞书webhook机器人还不支持发送文件类型的群消息,可以申请创建一个机器人应用来实现群发送文件消息。 创建机器人后,需要开通一系列权限,然后发布。由管理员审核通过后,才可使用。 包括如下的权限,可以获取群的c…

逆向学习记录(4)adb

adb用于PC和手机端通讯。 常用命令如下: 如果不是模拟器(模拟器一般都有自己的adb),adb会出现在Andirod的SDK中,路径为:Android/SDK/platform-tools。 最好加入环境变量中。

2、Sentinel基本应用限流规则(2)

2.2.1 是什么 Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。 2.2.2 基本概念 • 资源 (需要被保护的东西…

ke9案例三:页面提交文件,我服务器端接收

案例三:页面提交文件,我服务器端接收 ProcessFile.java 1value "/process-file" 2获取邮件消息的所有部分part--Collection<Part> partsrequest.getParts(); 3遍历每一个part 4之后可以打印头文件等String headerpart.getHeader("content-disposition&q…

esxi 6.7下安装黑裙

esxi上创建一个黑裙系统的虚拟机&#xff0c;用来存资料 一、工具 硬件&#xff1a; 工控机&#xff1a;装有esxi6.7系统&#xff08;192.168.100.2&#xff09;&#xff0c;配置&#xff1a;3865U&#xff0c;16G内存&#xff0c;120Gmsata120sata硬盘&#xff0c;6个网口 主…

web前端——HTML+CSS实现九宫格

web前端——HTMLCSS实现九宫格 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

基准测试详解

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

星辰天合受邀参加红帽2023中国区合作伙伴大会

近日&#xff0c;“共创成功” ——红帽 2023 中国区合作伙伴大会成功举行&#xff0c;包括 XSKY星辰天合在内的 100 多位合作伙伴受邀出席&#xff0c;分享开源时代的合作共赢之道&#xff0c;探讨新业态下的市场策略。 红帽2023中国区合作伙伴大会现场 红帽今年 30 岁了&…

《研发效能(DevOps)工程师》课程简介(四)丨IDCF

由国家工业和信息化部教育与考试中心颁发的职业技术证书&#xff0c;也是国内首个研发效能&#xff08;DevOps&#xff09;职业技术认证&#xff0c;内涵1000页学习教材2000分钟的课程内容讲解460多个技术知识点300多道练习题。涵盖【组织与协作】、【产品设计与运营】、【开发…

[Lingo编程极速入门]——基础01

目录索引 直接求解&#xff1a;基本约束条件书写&#xff1a;思考&#xff1a; 多段式编程&#xff1a;模板&#xff1a;问题引入&#xff1a;解法&#xff1a;第一句&#xff1a;第二、三句&#xff1a;第四句&#xff1a; 直接求解&#xff1a; 首先我们进行最简单的Lingo求解…

P02项目(学习)

★ P02项目 项目描述&#xff1a;安全操作项目旨在提高医疗设备的安全性&#xff0c;特别是在医生离开操作屏幕时&#xff0c;以减少非授权人员的误操作风险。为实现这一目标&#xff0c;我们采用多层次的保护措施&#xff0c;包括人脸识别、姿势检测以及二维码识别等技术。这些…

民宿酒店服务预约小程序的作用

民宿往往是旅游者们前往某个城市感受风情常住的地方&#xff0c;也因此在景区或特定地方&#xff0c;总是不乏大小民宿品牌&#xff0c;但除了市场高需求外&#xff0c;商家们所遇的痛点也不少&#xff1a; 1、获客引流难 民宿生意虽然需求量高&#xff0c;但各家品牌众多&am…

索引和事务

文章目录 一、索引1.1 概念1.2 作用1.3 使用场景1.4 使用 二、事务2.1 为什么要使用事务2.2 事务的概念2.3 事务的使用 三、内容重点总结 一、索引 1.1 概念 索引是一种特殊的文件&#xff0c;包含对数据表所有记录的引用指针。在MySQL中&#xff0c;索引是基于一个或多个列的…

如何在word文档中批量插入二维码

合同系统中&#xff0c;一般流程是线上拟稿、审批、定稿&#xff0c;然后线下打印定稿的合同并且存档。当拿到一个纸质合同&#xff0c;需要去线上系统查询当时的合同拟制过程&#xff0c;那如何快速定位到这个文档&#xff0c;是一个问题。通用的做法是&#xff0c;将该文档的…

《网络协议》01. 基本概念

title: 《网络协议》01. 基本概念 date: 2022-08-30 09:50:52 updated: 2023-11-05 15:28:52 categories: 学习记录&#xff1a;网络协议 excerpt: 互联网、网络互连模型&#xff08;OSI&#xff0c;TCP/IP&#xff09;、计算机通信基础、MAC 地址、ARP & ICMP、IP & 子…