Docker入门与实战——使用Dockerfile创建镜像(二)
使用Dockerfile创建镜像3、创建镜像3.1、命令选项3.2、选择父镜像3.3、使用.dockerignore文件3.4、多步骤创建4、最佳实践5、本章小结3、创建镜像在Dockerfile编写完毕之后读者可以使用docker[image]build命令来创建镜像基本格式为此命令将读取指定路径包括子目录下的Dockerfile并将该路径下的所有数据作为上下文(Context)发送给Docker服务端。Docker服务端在验证Dockerfile格式无误后会逐条执行其中定义的指令。当遇到ADD、COPY和RUN指令时会生成一层新的镜像。最终若镜像创建成功系统将返回最终镜像的ID。请注意如果上下文过大将导致向服务端发送大量数据从而延长创建过程。因此除非文件是生成镜像所必需的否则请勿将其放在上下文路径下。如果需要使用非上下文路径下的Dockerfile则可以通过-f选项来指定其路径。要为生成的镜像指定标签信息可以使用-t选项。可以多次使用此选项以一次性为镜像添加多个名称。例如若上下文路径为/tmp/docker_builder/且希望生成的镜像标签为builder/first_image:1.0.0则可以使用以下命令3.1、命令选项docker [image] build命令支持一系列选项可以调整创建镜像过程的行为。选项介绍如表所示。3.2、选择父镜像通常生成新的镜像时都需要通过FROM指令来指定父镜像。父镜像是所生成镜像的基础会直接影响镜像的大小和功能。用户可以选择两种镜像作为父镜像一种是基础镜像(baseimage)另一种是普通镜像往往由第三方创建基于基础镜像​。基础镜像比较特殊它的Dockerfile中往往不存在FROM指令或者基于scratch镜像(FROM scratch)这意味着基础镜像在整个镜像树中处于根的位置。下面的Dockerfile定义了一个简单的基础镜像将用户提前编译好的二进制可执行文件binary复制到镜像中运行容器时执行binary命令普通镜像也可以作为父镜像来使用包括常见的busybox、debian、ubuntu等。Docker不同类型镜像之间的继承关系如图所示。3.3、使用.dockerignore文件可以通过.dockerignore文件每一行添加一条匹配模式来让Docker忽略匹配路径或文件避免在创建镜像时将无关数据发送到服务端。例如下面的示例中包括了6行忽略的模式第一行为注释​.dockerignore文件中的模式语法支持Golang风格的路径匹配规则其中​“*”表示任意多个字符​“?”代表单个字符​“!”表示不匹配即不忽略指定的路径或文件​。3.4、多步骤创建Docker支持多步骤镜像创建(Multi-stage build)特性可以精简最终生成的镜像大小。对于需要编译的应用如C、Go或Java语言等​通常情况下至少需要准备两个环境的Docker镜像编译环境镜像包括完整的编译引擎、依赖库等往往比较庞大作用是将应用编译为二进制文件。运行环境镜像利用编译好的二进制文件运行应用由于不需要编译环境因此体积比较小。使用多步骤创建可以在保证最终生成的运行环境镜像保持精简的情况下使用单一的Dockerfile降低维护复杂度。以Go语言应用为例。创建干净目录进入目录中创建main.go文件内容为创建Dockerfile使用golang:1.20镜像编译应用二进制文件为app使用精简的镜像alpine:latest作为运行环境。Dockerfile的完整内容为执行如下命令创建镜像并运行应用查看生成的最终镜像大小只有6.55MB4、最佳实践最佳实践的目标是根据需求来定制适合自己并且高效、便捷的镜像。首先读者要深入了解每个指令的含义和执行效果亲自编写一些简单的示例进行测试确保充分理解后再编写正式的Dockerfile。此外Docker Hub官方仓库中提供了大量优秀的镜像和对应的Dockerfile读者可以通过阅读它们来学习如何编写高效的Dockerfile。下面是一些构建镜像的经验。读者在生成镜像的过程中可以参考借鉴以完善所生成的镜像。精简镜像用途尽量让每个镜像的用途都比较集中、单一避免构造庞大而复杂的多功能镜像。选择合适的基础镜像容器的核心是应用。选择过大的父镜像如Ubuntu系统镜像会造成最终生成应用镜像的臃肿通常建议选用精简的应用镜像如node:slim​或者较为轻量级的系统镜像如alpine、busybox或debian​。提供注释和维护者信息Dockerfile也是一种代码需要考虑方便后续扩展和他人使用。正确使用版本号使用明确的版本号信息如1.0、2.0而非依赖于默认的latest。通过版本号可以避免环境不一致导致的问题。减少镜像层数为了生成尽量少的镜像层数可以尝试合并RUN、ADD和COPY指令。通常情况下多条RUN指令可以合并为一条RUN指令。恰当使用多步骤创建17.05版本支持​通过多步骤创建可以将编译和运行过程分开确保最终生成的镜像仅包含运行应用所需的最小化环境。当然读者也可以分别构建编译镜像和运行镜像来达到类似的效果但这种方式需要维护多个Dockerfile。使用.dockerignore文件利用该文件可以标记在执行docker build时忽略的路径和文件避免发送不必要的数据内容从而加快整个镜像的创建过程。及时删除临时文件和缓存文件例如在执行apt-get指令后/var/cache/apt目录下可能会缓存一些安装包需要及时清理。提高生成速度例如合理使用缓存、减少内容目录下的文件或使用.dockerignore文件指定等以加快镜像创建速度。调整合理的指令顺序在开启缓存的情况下内容不变的指令尽量放在前面以便最大限度地复用缓存。减少外部源的干扰如果确实需要从外部引入数据则务必指定持久且带版本信息的地址以便其他人能够重复使用而不会出错。遵循这些最佳实践读者将能够创建出高效、易于维护和使用的Docker镜像从而优化容器部署和应用管理过程。5、本章小结本章重点讲解使用Dockerfile创建镜像的整个过程。内容包括Dockerfile的基本结构、支持的内部指令、使用Dockerfile创建镜像的基本流程以及合理构建镜像的最佳实践。通过学习Dockerfile构建镜像的过程读者将能领略到Docker镜像在使用中所展现的灵活性尤其是在进行修改时能够实现“一处修改全局更新”​。然而编写一个高质量的Dockerfile并非易事这需要不断地进行学习和实践。在本书的第二部分笔者精选了多个具有代表性的Dockerfile实例帮助读者更好地理解镜像构建原理并参考实例进行实践。

相关新闻

Java实现机房动环检测系统:Modbus采集与告警实战

Java实现机房动环检测系统:Modbus采集与告警实战

简介:这份基于Java语言的机房动环检测系统设计源码,面向需要构建机房动力环境监控方案的开发者与运维人员,可用于实时采集供电、空调、温湿度、消防、漏水等设备数据,并实现异常报警与用户交互。资源包共66个文件,约21…

2026/10/18 21:50:45 阅读更多 →
AI编程必备的10大 Skills:从Claude Code到MCP的实战配置清单

AI编程必备的10大 Skills:从Claude Code到MCP的实战配置清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 17:04:03 阅读更多 →
模型选择与推理档位指南:用 TaoToken 统一 Key 调度 Codex reasoning_effort 的配置清单

模型选择与推理档位指南:用 TaoToken 统一 Key 调度 Codex reasoning_effort 的配置清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:13:24 阅读更多 →

最新新闻

MCP协议驱动智能体底座架构设计:从插件思维到接口思维

MCP协议驱动智能体底座架构设计:从插件思维到接口思维

1. 从“插件思维”到“接口思维”的认知跃迁大多数人第一次接触MCP(Model Context Protocol,模型上下文协议)时,脑子里蹦出来的第一个词就是“插件系统”。这也不奇怪,毕竟它的外在表现确实像插件:你写一个…

2026/10/20 12:45:32 阅读更多 →
从零搭建React企业级应用架构:REA分层设计与工程实践

从零搭建React企业级应用架构:REA分层设计与工程实践

1. 项目概述先说结论:REA不是某个框架的名字,也不是一个开源库的缩写,而是我近期在团队内部从零搭建并持续打磨的一套 React 企业级应用架构方案。全称我习惯叫它 React Enterprise Architecture,有人问为什么不叫别的名字&#x…

2026/10/20 12:45:32 阅读更多 →
Matlab实现贝叶斯优化Transformer多输入单输出时序预测

Matlab实现贝叶斯优化Transformer多输入单输出时序预测

最近整理时序预测这块的工作时,我发现一个问题:很多人一上来就搭LSTM,序列一长效果就拉胯;换了Transformer吧,又开始为超参数头疼。手工调参既累又不稳定,尤其是当输入特征有好几个、预测目标只有一个的时候…

2026/10/20 12:45:32 阅读更多 →
告别重复办公!OpenClaw 3.1.0 本地 AI 智能体部署实战

告别重复办公!OpenClaw 3.1.0 本地 AI 智能体部署实战

📖 前言 本文面向 Windows 系统用户,系统梳理 OpenClaw 的标准化部署流程。全程无需输入任何命令行,所有操作均依托可视化向导完成,即便是零基础用户也能独立走完整套部署。文中同时汇总了高频报错的对应解决方案,力求…

2026/10/20 12:45:32 阅读更多 →
Context-Mode是什么?一文讲透上下文模式的三种落地形态

Context-Mode是什么?一文讲透上下文模式的三种落地形态

最近在给某智能助手做效果调优时,我天天被一个词轰炸:context-mode。测试同学说"上下文模式下的记忆老丢",后端同事说"异步线程里 context 没传过去",模型侧的人又说"提示词里的 context 结构得调整&quo…

2026/10/20 12:45:32 阅读更多 →
副业内容创业成本优化指南:小说、漫画、漫剧的降本增效实战

副业内容创业成本优化指南:小说、漫画、漫剧的降本增效实战

1. 副业内容创业的成本困局与破局思路1.1 为什么小说、漫画、漫剧成了副业热门赛道这两年身边搞副业的朋友越来越多,我观察到一个很明显的趋势:以前大家聊副业,张口就是开店、带货、跑腿,现在聊得最多的变成了内容创作。小说、漫画…

2026/10/20 12:44:31 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →