docker详解介绍+基础操作 (四)容器镜像
一.镜像结构和原理
Docker 镜像是 Docker 技术的核心组成部分之一,它用于封装应用程序及其依赖项,以便在任何支持 Docker 的环境中运行。了解 Docker 镜像的结构和原理对于有效使用 Docker 至关重要。以下是对 Docker 镜像结构和原理的详细介绍。
Docker 镜像的结构
1. 层(Layers)
Docker 镜像是由多个层(layers)组成的。每个层代表了一个文件系统的快照。这些层是只读的,每个层都基于前一层,形成一个堆栈。当构建一个新的镜像时,Docker 会根据 Dockerfile 中的指令逐层构建。
基础层:通常是一个操作系统的基础镜像,如 ubuntu:20.04。
中间层:包含应用程序的依赖项和配置。
顶层:包含应用程序本身。
2. 工作原理
Union File System (UnionFS):Docker 使用 UnionFS 将多个层合并为一个文件系统。UnionFS 允许文件系统中的文件和目录位于多个不同的物理位置,但在用户看来是一个统一的整体。
只读层:每个层都是只读的,这意味着一旦层被创建,就不能被修改。
写时复制(Copy-on-Write):当容器启动时,Docker 会在最顶层添加一个可写层,称为容器层。这个层允许对文件系统进行读写操作。如果某个文件被修改,实际上是在容器层中创建一个新文件,而原始文件保持不变。
Docker 镜像的构建
1. Dockerfile
Dockerfile 是一个文本文件,包含了一系列指令,用于自动构建 Docker 镜像。每个指令都会创建一个新的层。
例如,一个简单的 Dockerfile 可能如下所示:
Dockerfile
使用官方的 Node.js 运行时作为父镜像
FROM node:14
设置工作目录
WORKDIR /app
将当前目录的内容复制到工作目录中
COPY . /app
安装应用程序的依赖
RUN npm install
构建应用程序
RUN npm run build
暴露端口
EXPOSE 3000
启动应用程序
CMD ["npm", "start"]
2. 构建过程
解析 Dockerfile:Docker 读取 Dockerfile 并解析其中的指令。
创建基础层:根据 FROM 指令创建基础层。
逐层构建:根据后续的指令逐层构建镜像。
- COPY 和 ADD 指令会将文件复制到镜像中,创建新的层。
- RUN 指令会执行命令,创建新的层。
- ENV 指令会设置环境变量,创建新的层。
- EXPOSE 指令会暴露端口,但不会创建新的层。
- CMD 和 ENTRYPOINT 指令会设置容器启动时的默认命令,但不会创建新的层。
3. 缓存机制
Docker 在构建镜像时会使用缓存机制来加速构建过程。如果某个指令之前已经执行过,并且其上下文没有发生变化,Docker 会直接使用缓存的层,而不是重新执行该指令。
Docker 镜像的存储
1. 镜像存储
Docker 镜像存储在 Docker 守护进程的本地存储中,默认情况下位于 /var/lib/docker 目录下。每个镜像的层都存储在 overlay2 或 aufs 子目录中,具体取决于使用的存储驱动。
2. 镜像压缩
Docker 镜像在存储和传输时会被压缩,以节省空间和带宽。每个层都会被单独压缩,并且可以独立下载和验证。
二.Docker 镜像的使用
1. 拉取镜像
从 Docker Hub 或其他注册表拉取镜像:
docker pull ubuntu:20.04
2. 列出本地镜像
查看本地已有的镜像:
docker images
3. 删除镜像
删除本地镜像:
docker rmi ubuntu:20.04
三.优化 Docker 镜像
1. 减少层的数量
合并 RUN 指令:将多个 RUN 指令合并为一个,以减少镜像层数。
Dockerfile
RUN apt-get update && apt-get install -y \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/*
2. 清理临时文件
在 RUN 指令中删除不必要的文件和缓存:
Dockerfile
RUN apt-get update && apt-get install -y package && rm -rf /var/lib/apt/lists/*
3. 使用多阶段构建
将构建过程分为多个阶段,只将最终所需的文件复制到最终镜像中:
Dockerfile
第一阶段:构建
FROM node:14 as builder
WORKDIR /app
COPY . /app
RUN npm install
RUN npm run build
第二阶段:运行
FROM node:14-alpine
WORKDIR /app
COPY --from=builder /app/dist /app
CMD ["node", "app.js"]
4. 使用较小的基础镜像
选择较小的基础镜像,如 alpine,以减少镜像大小:
Dockerfile
FROM alpine:3.14
优化镜像工具dive
dive 是一个用于探索和分析 Docker 镜像的工具,可以帮助你理解镜像的每一层,并优化镜像构建过程。通过 dive,你可以查看每层添加了哪些文件,以及每层的大小,从而更好地管理镜像的大小和内容
安装 dive
使用 Docker 安装
docker pull wagoodman/dive:latest
使用包管理器安装
Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y dive
CentOS/RHEL
sudo yum install epel-release
sudo yum install dive
macOS (使用 Homebrew)
brew install dive
基本用法
启动 dive
你可以使用 dive 分析现有的 Docker 镜像或构建新的镜像。
分析现有镜像
dive <image-name-or-id>
例如,分析名为 my-image 的镜像:
dive my-image
构建新镜像并分析
dive build -t <image-name> .
例如,构建并分析名为 my-image 的镜像:
dive build -t my-image .
dive 界面
启动 dive 后,你会进入一个基于 TUI(Text User Interface)的界面,其中包含多个视图和操作选项。
主界面
主界面分为两个主要部分:
1. 左侧面板:显示镜像的每一层及其元数据。
2. 右侧面板:显示当前选中层的详细信息。
常用操作
- 上下箭头:在层之间导航。
- Enter:进入当前选中层的详细视图。
- q:退出 dive。
- h:显示帮助信息。
详细视图
选择一个层后,dive 会显示该层的详细信息,包括:
- 命令:构建该层时执行的 Dockerfile 命令。
- 大小:该层的大小。
- 文件变化:该层相对于前一层的文件变化,包括新增、删除和修改的文件。
- 环境变量:该层中设置的环境变量。
- 标签:该层中设置的标签。
- 历史记录:该层的历史记录。
优化镜像
通过 dive,你可以发现以下几种优化镜像的方法:
1. 减少层的数量:合并多个 RUN 命令,减少镜像层数。
2. 清理临时文件:在 RUN 命令中删除不必要的文件和缓存。
3. 使用多阶段构建:将构建过程分为多个阶段,只将最终所需的文件复制到最终镜像中。
4. 使用较小的基础镜像:选择较小的基础镜像,如 alpine,以减少镜像大小。
示例
假设你有一个简单的 Dockerfile:
Dockerfile
使用官方的 Node.js 运行时作为父镜像
FROM node:14
设置工作目录
WORKDIR /app
将当前目录的内容复制到工作目录中
COPY . /app
安装应用程序的依赖
RUN npm instal
构建应用程序
RUN npm run build
暴露端口
EXPOSE 3000
启动应用程序
CMD ["npm", "start"]
你可以使用 dive 构建并分析这个镜像:
dive build -t my-node-app .
启动 dive 后,你可以逐层查看镜像的构建过程,发现哪些层占用了较多的空间,并进行相应的优化。
相关文章:
docker详解介绍+基础操作 (四)容器镜像
一.镜像结构和原理 Docker 镜像是 Docker 技术的核心组成部分之一,它用于封装应用程序及其依赖项,以便在任何支持 Docker 的环境中运行。了解 Docker 镜像的结构和原理对于有效使用 Docker 至关重要。以下是对 Docker 镜像结构和原理的详细介绍。 Dock…...
PostgreSQL数据库定期清理归档(pg_wal)日志
一、配置归档模式 在postgresql.conf文件中设置archive_mode on来启用归档功能。 二、设置归档命令 同样在postgresql.conf中,设置archive_command参数,指定一个shell命令来处理归档日志,例如: archive_command cp %p /home/…...
RTTI介绍
RTTI介绍 RTTI(Run-Time Type Information,运行时类型信息)是C的一项功能,它允许在程序运行时检查对象的类型。RTTI的主要作用是在多态(polymorphism)场景中,可以在运行时安全地转换对象类型或…...
【C#生态园】C#推送通知库大比拼:选择最适合你项目的库
提升用户体验:C#推送通知库详细评测及比较 前言 在移动应用开发中,推送通知是一个至关重要的功能。它可以帮助应用保持与用户的互动,及时传递重要信息,提升用户体验。本文将介绍几个用于C#的推送通知库,帮助开发者了…...
乐歌E5,E6系列升降桌质量如何?2024推荐必买的四款热销型号
在数字化时代,电脑桌成为了我们日常生活和工作中不可或缺的一部分。然而,长时间坐在固定高度的电脑桌前,不仅会影响我们的工作效率,还可能对身体健康造成不良影响。因此,一款能够电动升降的电脑桌显得尤为重要。 乐歌…...
Android广播
文章目录 1.收发应用广播1.标准广播2.有序广播3.广播的静态注册 2.监听系统广播1.接受分钟到达广播2.接受网络变更广播3.定时管理器AlarmManager 3.捕捉屏幕的变更事件1.竖屏和横屏切换2.回到桌面与切换到任务列表 1.收发应用广播 1.标准广播 广播的收发过程分为三个步骤&…...
Chapter 2 - 3. Understanding Congestion in Fibre Channel Fabrics
B2B Credit Counters Figure 2-3 shows the following counters on an FC port: 图 2-3 显示了 FC 端口上的以下计数器: 1. Rx B2B credits: The number of receive buffers of an FC port. This value does not change while the port is up. FC 端口的接收缓冲区数量。该值…...
014 属性分组
文章目录 后端AttrGroupEntity.javaCategoryEntity.javaAttrGroupController.javaCategoryServiceImpl.java 前端attrgroup-add-or-update.vue https://element.eleme.cn/#/zh-CN/component/cascader 后端 AttrGroupEntity.java package com.xd.cubemall.product.entity;impo…...
ElasticSearch备考 -- Alias
一、题目 1) Create the alias hamlet that maps both hamlet-1 and hamlet-2 Verify that the documents grouped by hamlet are 8 2) Configure hamlet-3 to be the write index of the hamlet alias 二、思考 可以通过指定别名,来指向一个或多个索引,…...
使用AI编码,这些安全风险你真的了解吗?
前言 随着AI技术的飞速发展与普及,企业开发人员对AI编码助手工具如Copilot的依赖度日益增强,使用AI编码助手工具虽然能显著提升编程效率与质量,但同时也存在一系列的潜在风险。 许多开发人员可能未意识到,如果他们的现有代码库中…...
计算机网络实验一:组建对等网络
实验一 组建对等网络 实验要求: 1. 组建对等网络,会在命令行使用ipconfig,两网络能够相互ping通,尝试netstat 命令 2. 建立局域网共享文件夹 3. 安装packet tracer,模拟组建对等网并测试对等网 1、组建对等网络 连…...
R语言绘制折线图
折线图是实用的数据可视化工具,通过连接数据点的线段展示数据随时间或变量的变化趋势。在经济、科学、销售及天气预报等领域广泛应用,为决策和分析提供依据。它能清晰呈现经济数据动态、助力科学研究、反映企业销售情况、预告天气变化,以简洁…...
基于组合模型的公交交通客流预测研究
摘 要 本研究致力于解决公交客流预测问题,旨在通过融合多种机器学习模型的强大能力,提升预测准确性,为城市公交系统的优化运营和交通管理提供科学依据。研究首先回顾了公交客流预测领域的相关文献,分析了传统统计方法在处理大规…...
docker环境redis启动失败
现象: 查看日志错误为 Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename> 经查询为aof文件损坏导致,修复aof即可 解决方法: 1.查看执行的docker命令&…...
Pandas库详细学习要点
Pandas库是一个基于Python的数据分析库,它提供了丰富的数据结构和数据分析工具,非常适合数据科学和数据分析领域的工作。以下是Pandas库详细学习的一些要点: 1. 数据结构 - Series:一维带标签数组,类似于NumPy中的一…...
光路科技TSN交换机:驱动自动驾驶技术革新,保障高精度实时数据传输
自动驾驶技术正快速演进,对实时数据处理能力的需求激增。光路科技推出的TSN(时间敏感网络)交换机,在比亚迪最新车型中的成功应用,显著推动了这一领域的技术进步。 自动驾驶技术面临的挑战 自动驾驶系统需整合来自雷达…...
【含开题报告+文档+PPT+源码】基于SpringBoot的社区家政服务预约系统设计与实现【包运行成功】
开题报告 社区家政服务是满足居民日常生活需求的重要组成部分,在现代社会中发挥着越来越重要的作用。随着城市化进程的不断加速,社区家政服务需求量呈现持续增长的趋势。然而,传统的家政服务模式存在一些问题,如预约流程繁琐、信…...
2024最新【Pycharm】史上最全PyCharm安装教程,图文教程(超详细)
1. PyCharm下载安装 完整安装包下载(包含Python和Pycharm专业版注册码):点击这里 1)访问官网 https://www.jetbrains.com/pycharm/download/#sectionwindows 下载「社区版 Community」 安装包。 2)下载完成后&#…...
llama3 implemented from scratch 笔记
github地址:https://github.com/naklecha/llama3-from-scratch?tabreadme-ov-file 分词器的实现 from pathlib import Path import tiktoken from tiktoken.load import load_tiktoken_bpe import torch import json import matplotlib.pyplot as plttokenizer_p…...
照片在线转成二维码展示,更方便分享图片的好办法
怎么能把照片生成二维码后,分享给其他人展示呢?现在很多人为了能够更方便的将自己的图片展现给其他人会使用生成二维码的方式,将图片存储到云空间,通过扫码调取图片查看内容。与其他方式相比,这样会更加的方便…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
