当前位置: 首页 > news >正文

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 技术的核心组成部分之一&#xff0c;它用于封装应用程序及其依赖项&#xff0c;以便在任何支持 Docker 的环境中运行。了解 Docker 镜像的结构和原理对于有效使用 Docker 至关重要。以下是对 Docker 镜像结构和原理的详细介绍。 Dock…...

PostgreSQL数据库定期清理归档(pg_wal)日志

一、配置归档模式 在postgresql.conf文件中设置archive_mode on来启用归档功能。 二、设置归档命令 同样在postgresql.conf中&#xff0c;设置archive_command参数&#xff0c;指定一个shell命令来处理归档日志&#xff0c;例如&#xff1a; archive_command cp %p /home/…...

RTTI介绍

RTTI介绍 RTTI&#xff08;Run-Time Type Information&#xff0c;运行时类型信息&#xff09;是C的一项功能&#xff0c;它允许在程序运行时检查对象的类型。RTTI的主要作用是在多态&#xff08;polymorphism&#xff09;场景中&#xff0c;可以在运行时安全地转换对象类型或…...

【C#生态园】C#推送通知库大比拼:选择最适合你项目的库

提升用户体验&#xff1a;C#推送通知库详细评测及比较 前言 在移动应用开发中&#xff0c;推送通知是一个至关重要的功能。它可以帮助应用保持与用户的互动&#xff0c;及时传递重要信息&#xff0c;提升用户体验。本文将介绍几个用于C#的推送通知库&#xff0c;帮助开发者了…...

乐歌E5,E6系列升降桌质量如何?2024推荐必买的四款热销型号

在数字化时代&#xff0c;电脑桌成为了我们日常生活和工作中不可或缺的一部分。然而&#xff0c;长时间坐在固定高度的电脑桌前&#xff0c;不仅会影响我们的工作效率&#xff0c;还可能对身体健康造成不良影响。因此&#xff0c;一款能够电动升降的电脑桌显得尤为重要。 乐歌…...

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 二、思考 可以通过指定别名&#xff0c;来指向一个或多个索引&#xff0c…...

使用AI编码,这些安全风险你真的了解吗?

前言 随着AI技术的飞速发展与普及&#xff0c;企业开发人员对AI编码助手工具如Copilot的依赖度日益增强&#xff0c;使用AI编码助手工具虽然能显著提升编程效率与质量&#xff0c;但同时也存在一系列的潜在风险。 许多开发人员可能未意识到&#xff0c;如果他们的现有代码库中…...

计算机网络实验一:组建对等网络

实验一 组建对等网络 实验要求&#xff1a; 1. 组建对等网络&#xff0c;会在命令行使用ipconfig&#xff0c;两网络能够相互ping通&#xff0c;尝试netstat 命令 2. 建立局域网共享文件夹 3. 安装packet tracer&#xff0c;模拟组建对等网并测试对等网 1、组建对等网络 连…...

R语言绘制折线图

折线图是实用的数据可视化工具&#xff0c;通过连接数据点的线段展示数据随时间或变量的变化趋势。在经济、科学、销售及天气预报等领域广泛应用&#xff0c;为决策和分析提供依据。它能清晰呈现经济数据动态、助力科学研究、反映企业销售情况、预告天气变化&#xff0c;以简洁…...

基于组合模型的公交交通客流预测研究

摘 要 本研究致力于解决公交客流预测问题&#xff0c;旨在通过融合多种机器学习模型的强大能力&#xff0c;提升预测准确性&#xff0c;为城市公交系统的优化运营和交通管理提供科学依据。研究首先回顾了公交客流预测领域的相关文献&#xff0c;分析了传统统计方法在处理大规…...

docker环境redis启动失败

现象&#xff1a; 查看日志错误为 Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename> 经查询为aof文件损坏导致&#xff0c;修复aof即可 解决方法&#xff1a; 1.查看执行的docker命令&…...

Pandas库详细学习要点

Pandas库是一个基于Python的数据分析库&#xff0c;它提供了丰富的数据结构和数据分析工具&#xff0c;非常适合数据科学和数据分析领域的工作。以下是Pandas库详细学习的一些要点&#xff1a; 1. 数据结构 - Series&#xff1a;一维带标签数组&#xff0c;类似于NumPy中的一…...

光路科技TSN交换机:驱动自动驾驶技术革新,保障高精度实时数据传输

自动驾驶技术正快速演进&#xff0c;对实时数据处理能力的需求激增。光路科技推出的TSN&#xff08;时间敏感网络&#xff09;交换机&#xff0c;在比亚迪最新车型中的成功应用&#xff0c;显著推动了这一领域的技术进步。 自动驾驶技术面临的挑战 自动驾驶系统需整合来自雷达…...

【含开题报告+文档+PPT+源码】基于SpringBoot的社区家政服务预约系统设计与实现【包运行成功】

开题报告 社区家政服务是满足居民日常生活需求的重要组成部分&#xff0c;在现代社会中发挥着越来越重要的作用。随着城市化进程的不断加速&#xff0c;社区家政服务需求量呈现持续增长的趋势。然而&#xff0c;传统的家政服务模式存在一些问题&#xff0c;如预约流程繁琐、信…...

2024最新【Pycharm】史上最全PyCharm安装教程,图文教程(超详细)

1. PyCharm下载安装 完整安装包下载&#xff08;包含Python和Pycharm专业版注册码&#xff09;&#xff1a;点击这里 1&#xff09;访问官网 https://www.jetbrains.com/pycharm/download/#sectionwindows 下载「社区版 Community」 安装包。 2&#xff09;下载完成后&#…...

llama3 implemented from scratch 笔记

github地址&#xff1a;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…...

照片在线转成二维码展示,更方便分享图片的好办法

怎么能把照片生成二维码后&#xff0c;分享给其他人展示呢&#xff1f;现在很多人为了能够更方便的将自己的图片展现给其他人会使用生成二维码的方式&#xff0c;将图片存储到云空间&#xff0c;通过扫码调取图片查看内容。与其他方式相比&#xff0c;这样会更加的方便&#xf…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...