【Docker基础】Docker镜像管理:docker build详解

目录

1 Docker镜像基础概念

1.1 什么是Docker镜像

1.2 镜像的分层结构

2 docker build命令详解

2.1 docker build基本语法

2.2 构建上下文概念

3 Dockerfile编写实践示例

3.1 Dockerfile指令详解

3.1.1 FROM

3.1.2 RUN

3.1.3 COPY vs ADD

3.1.4 CMD vs ENTRYPOINT

3.1.5 EXPOSE

3.1.6 ENV

3.2 多阶段构建

4 构建过程优化技巧

4.1 利用构建缓存

4.2 .dockerignore文件

4.3 构建参数(--build-arg)

4.4 镜像大小优化

5 常见问题与解决方案

5.1 构建速度慢

5.2 镜像体积过大

5.3 构建缓存失效

6 总结


1 Docker镜像基础概念

1.1 什么是Docker镜像

  • Docker镜像是一个轻量级、可执行的独立软件包,包含运行某个软件所需的所有内容:代码、运行时环境、系统工具、系统库和设置
  • 镜像采用分层存储结构,每一层都是只读的,这种设计使得镜像可以高效地共享和复用
  • 镜像与容器的关系可以理解为:镜像是静态的定义,容器是镜像运行时的实体
  • 容器可以被创建、启动、停止、删除、暂停等,而镜像是这些容器运行的基础

1.2 镜像的分层结构

Docker镜像采用分层(Layer)的架构,这种设计带来了诸多优势:
  • 共享资源:多个镜像可以共享相同的底层镜像层
  • 空间效率:当镜像更新时,只需传输变更的部分
  • 快速构建:构建时可以复用已存在的层
  • 不可变性:每一层都是只读的,确保一致性
典型的Docker镜像分层结构:
  • 最底层是基础操作系统层
  • 中间层包含运行环境和依赖
  • 上层包含应用特定文件
  • 最上层是容器运行时添加的可写层

2 docker build命令详解

2.1 docker build基本语法

  • docker build命令用于根据Dockerfile构建镜像,其基本语法如下:
docker build [OPTIONS] PATH | URL | -
常用选项说明:
  • -t, --tag:指定镜像名称和标签,格式为name:tag
  • -f, --file:指定Dockerfile路径(默认是上下文路径下的Dockerfile)
  • --build-arg:设置构建时的变量
  • --no-cache:构建时不使用缓存
  • --pull:总是尝试拉取新版本的基础镜像
  • --target:多阶段构建时指定目标阶段

2.2 构建上下文概念

构建上下文(Build Context)是指docker build命令中PATH参数指定的目录及其子目录,Docker客户端会将整个上下文目录打包发送给Docker守护进程,因此:
  • 上下文过大时会导致构建过程变慢
  • 应该通过.dockerignore文件排除不必要的文件
  • Dockerfile中的COPY/ADD指令只能操作上下文中的文件
  • 客户端将构建上下文打包发送给守护进程
  • 守护进程解析Dockerfile
  • 按顺序执行构建指令
  • 生成最终镜像并存储在本地

3 Dockerfile编写实践示例

3.1 Dockerfile指令详解

3.1.1 FROM

  • 指定基础镜像,必须是Dockerfile的第一条有效指令:
FROM ubuntu:20.04

3.1.2 RUN

  • 执行命令并创建新的镜像层,常用于安装软件包:
RUN apt-get update && apt-get install -y \package1 \package2 \&& rm -rf /var/lib/apt/lists/*

3.1.3 COPY vs ADD

两者都用于复制文件,但ADD有额外功能:
  • COPY:简单复制文件/目录
COPY ./app /usr/src/app
  • ADD:除复制外还能解压压缩文件、支持URL
ADD http://example.com/file.tar.gz /tmp/

3.1.4 CMD vs ENTRYPOINT

  • CMD:提供容器默认的执行命令,可被覆盖
CMD ["python", "app.py"]
  • ENTRYPOINT:配置容器启动时运行的命令,不易被覆盖
ENTRYPOINT ["python"] CMD ["app.py"]

3.1.5 EXPOSE

  • 声明容器运行时监听的端口:
EXPOSE 8080

3.1.6 ENV

  • 设置环境变量,可被后续指令使用:
ENV NODE_ENV=production

3.2 多阶段构建

  • 多阶段构建可以显著减小最终镜像大小:
  • 最终镜像只包含运行所需内容,不包含构建工具
  • 减小镜像体积
  • 提高安全性(减少攻击面)

4 构建过程优化技巧

4.1 利用构建缓存

Docker会缓存已构建的层,合理组织Dockerfile可以最大化利用缓存:
  • 将变化频率低的指令放在前面
  • 将变化频率高的指令(如COPY源代码)放在后面
  • 合并相关RUN命令减少层数

4.2 .dockerignore文件

  • 类似于.gitignore,用于排除不需要加入构建上下文的文件:
# 忽略git目录
.git/# 忽略日志文件
*.log# 忽略临时文件
tmp/# 忽略本地配置文件
config/local.ini

4.3 构建参数(--build-arg)

  • 允许构建时传入变量,增加Dockerfile灵活性:
ARG VERSION=latest FROM ubuntu:$VERSION
  • 构建时指定:
docker build --build-arg VERSION=20.04 -t myapp .

4.4 镜像大小优化

  • 使用轻量级基础镜像(如alpine)
  • 多阶段构建
  • 清理不必要的文件(如apt缓存)
  • 合并RUN指令减少层数
  • 使用docker-slim等工具进一步优化

5 常见问题与解决方案

5.1 构建速度慢

可能原因及解决方案:
  • 大构建上下文:优化.dockerignore,减少上下文大小
  • 网络延迟:使用本地镜像仓库或国内镜像源
  • 未充分利用缓存:合理组织Dockerfile指令顺序
  • 复杂构建步骤:考虑使用多阶段构建分离构建和运行环境

5.2 镜像体积过大

  • 使用docker history 分析各层大小
  • 删除不必要的中间文件和缓存
  • 使用alpine等小型基础镜像
  • 采用多阶段构建

5.3 构建缓存失效

  • 指令顺序改变
  • 上游基础镜像更新
  • 构建参数变化
  • 上下文文件变化

6 总结

Docker镜像构建是容器化应用的关键环节,掌握docker build和Dockerfile的细节能够显著提高开发效率和部署质量。
通过合理利用多阶段构建、构建缓存、.dockerignore文件等技术,可以创建出高效、安全且体积小的Docker镜像,为容器化应用奠定坚实基础。

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

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

相关文章

在 macOS 上部署 Akash Network 的完整 Shell 脚本解决方案

以下是在 macOS 上部署 Akash Network 的完整 Shell 脚本解决方案,包含详细注释和错误处理: #!/bin/bash # Akash Network macOS 部署脚本 v2.5 # 功能:在 macOS 系统上完整部署 Akash Network 节点和客户端工具 # 作者:DeepSeek 区块链团队 # 日期:2025-06-20 # 文档:h…

【分布式理论】读确认数与写确认数:分布式一致性的核心概念

文章目录 零、概述一、基本概念解释1、 什么是写确认数(w)?2、 什么是读确认数(r)?3、一致性级别的对应关系 二、工作流程详解1、 写操作的完整流程2、 读操作的完整流程 三、强一致性的数学原理1、 为什么…

滚珠导轨在医疗设备中有多重要?

在医疗设备领域,稳定性是保障手术安全、提升诊断精度的核心要素。无论是手术机器人精准的器械操作,还是CT扫描仪高速稳定的扫描运动,都离不开背后精密传动系统的支持。作为线性运动的核心部件,滚珠导轨凭借其独特的滚动摩擦原理与…

港科ISM选课攻略整理

毕业要求 课程和课程目录(ISM专业) "D:\HKUST-ISM\prepare\中英Program & Course Catalog.pdf" 课程和课程目录(全部ISOM课程) "D:\HKUST-ISM\prepare\全部ISOM Course Catalog.pdf" 两个可选专业方向 Financial Technolo…

rent8_wechat-最常用出租屋管理系统-微信小程序

rent8_wechat-最常用出租屋管理系统是rent8的微信小程序,需要和rent8配合使用。rent8_wechat基于Tdesign开发。 核心功能 房产管理:新增房产信息、修改房产信息、删除房产信息。房间管理:新增房间信息、修改房间信息、删除房间信息、入住管…

OpenCV CUDA模块设备层---- 绝对值函数abs()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这是 OpenCV 的 cv::cudev 模块中用于 CUDA 设备端(device)的绝对值函数,专门处理 uchar1 类型(即…

IEC61850 通信协议测试验证方法详解

一、MMS 协议测试方法 MMS(制造报文规范)是 IEC61850 中用于设备监控和控制的核心协议,测试需覆盖以下维度: (一)协议栈实现验证 连接管理测试 测试用例:建立和释放 MMS 连接 100 次&#xf…

关于 Kyber:抗量子密码算法 Kyber 详解

一、基本概念 后量子密码学(PQC) │ ├──> 是一个领域(研究如何在“量子时代”保护数据安全) │ └──> Kyber 是这个领域中设计出来的一个“抗量子密码算法”└──> Kyber 是用于加密密钥交换的算法(叫…

如何保障具身智能系统级安全?鸿道OS给出中国方案

由东土科技自主研发完成的鸿道(Intewell)工业操作系统正式发布。东土科技董事长李平与该公司全资子公司光亚鸿道总经理邹露君在接受第一财经等采访时,解释了如何通过操作系统为具身智能产业提供底层支撑,解决产业规模化落地的安全…

深入浅出:JavaScript ES6中类(Class)的革新与实践

深入浅出:JavaScript ES6中类(Class)的革新与实践 在JavaScript的发展历程中,ES6(ECMAScript 2015)无疑是一个里程碑式的版本。它不仅引入了let、const、箭头函数等特性,更通过**类&#xff08…

华大北斗TAU804M-N2B0双频单北斗高精度定位模块 100%国产双频北斗 打破u-blox技术垄断

华大北斗TAU804M-N2B0双频单北斗模块深度解析 1. 产品定位 TAU804M-N2B0 是华大北斗(HDSC)推出的 双频单北斗高精度定位模块,支持 B1IB2a双频信号接收,专为 高精度定位、抗多径干扰 场景设计,是北斗三号系统应用的标杆…

IP证书申请攻略细则,有何作用?

IP证书申请攻略细则及作用解析 一、IP证书的作用 数据加密传输 IP证书通过SSL/TLS协议对客户端与服务器之间的数据进行加密,防止数据在传输过程中被窃取或篡改,适用于物联网设备、API接口、测试服务器等直接通过IP访问的场景。 身份验证与防伪造 浏览器…

回文链表C++

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 时间复杂度较大的解法: /*** Definition for singly-linked list.* struct ListNode {* int val;* Lis…

限流系列之三:TDMQ for Apache Pulsar 限流技术深度解析

导语 在高速、高吞吐量的消息处理场景中,TDMQ Pulsar 版以其卓越的性能和可扩展性成为众多企业的首选。然而,随着生产者和消费者以极高的速度生产/消费大量消息,服务器资源如 CPU、内存、网络及磁盘 IO 等可能会面临饱和风险。为此&#xff…

非研发部门参与产品开发过程的价值体现

汉捷咨询 胡红卫 企业已经越来越意识到新产品开发项目需要市场、销售、制造、采购、服务、财务等非研发部门的参与,尝试建立跨部门的项目组,安排相关人员参与项目,但是效果如何呢?在汉捷咨询对很多企业调研诊断过程中,…

Kafka的存储与索引:数据处理的底层奥秘

一、引言 Kafka 之所以能在海量数据的传输和处理过程中保持高效的性能和低延迟,背后隐藏着众多精妙的设计,而其存储与索引机制便是其中的核心奥秘。接下来,让我们深入探寻 Kafka 存储机制的基石与架构。 二、分区与日志组织​ Kafka 中的消…

大模型与搜索引擎的技术博弈及未来智能范式演进

基于认知革命与技术替代的全景综述 一、大模型对搜索引擎的替代性分析:技术范式与市场重构 (1)技术原理的代际分野 传统搜索引擎遵循 "爬虫抓取 - 索引构建 - 关键词排序" 的三段式架构,其核心是基于 PageRank 算法的…

XC7K325T数据采集卡设计原理图:786-基于X86 CPU+XC7K325T的16路16bit 1M sps同步数据采集卡

基于X86 CPUXC7K325T的16路16bit 1M sps同步数据采集卡 一、板卡概述 板卡为紧凑型的X86FPGA的工业监测处理平台,高度集成的硬件和完整的labview开发软件,大大方便客户现场使用。 二、板卡功能 板卡功能 参数内容 X86 SOM核心板 主频 2.0GHz …

单片机3种按键程序消抖方法

1,查询法延时模式 u8 key01;u8 x0;KEY1;while(1){if(KEY0) //"按键按下"{delay(10); //延时10msif(KEY0 && kdy01) //按下有10ms 且上状态是1。即下降沿时{key00; //将上状态置0.防止按住不放时&#xff0…

【java面试】线程篇

【java面试】线程篇 一、基础知识1 线程与进程的区别2 并行与并发的区别3 创建线程的方式4 线程包含了哪些状态,状态之间是如何变化的?5 新建三个线程,如何保证他们按照顺序执行?6、java中的wait和sleep方法的不同7 如何停止一个正…