Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

目录

Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

引言

一、什么是 Dockerfile

二、Dockerfile 的基本结构

三、Dockerfile 的常见配置项

1、多阶段构建 (Multi-stage Builds)

2、缓存优化

3、合并 RUN 命令

四、Dockerfile 使用须知

五、一个完整的Dockerfile实例

六、总结


作者:watermelo37

涉及领域:Vue、SpingBoot、Docker、LLM、python等

---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

引言

        Dockerfile 是构建 Docker 镜像的核心文件。它定义了如何将应用程序及其依赖打包成一个可以跨平台运行的容器。本篇博客将从基础概念出发,逐步介绍 Dockerfile 的常见配置、使用注意事项,以及如何编写高效的 Dockerfile。

一、什么是 Dockerfile

        Dockerfile 是一组指令的集合,用于定义如何创建一个 Docker 镜像。每条指令对应于镜像构建中的一个步骤,这些步骤被逐个执行,最终生成一个可用的容器镜像。它不仅提升了应用的可移植性,还简化了部署和管理的流程。

        Dockerfile是一个没有后缀名的文件!Dockerfile是一个没有后缀名的文件!Dockerfile是一个没有后缀名的文件!放到用来执行cmd命令的文件夹中即可。

二、Dockerfile 的基本结构

        Dockerfile 中的每一行是一个命令,这些命令定义了镜像的构建流程。以下是 Dockerfile 常见指令的基础介绍:

FROM:定义基础镜像

  • 格式:FROM <image>[:tag]
  • 说明:Dockerfile 中每一个镜像必须从某个基础镜像开始,比如 FROM node:14,表示基于 Node.js 14 构建镜像。

RUN:执行命令

  • 格式:RUN <command>
  • 说明:用于在镜像构建过程中执行命令,如安装软件包等。

COPYADD:复制文件

  • 格式:COPY <src> <dest> 或 ADD <src> <dest>
  • 说明:将文件从主机复制到镜像中。ADD 可以处理 URL 和压缩文件,而 COPY 更为简单,通常推荐使用。

WORKDIR:设置工作目录

  • 格式:WORKDIR <path>
  • 说明:定义命令的执行路径,如果该路径不存在,Docker 会自动创建。

CMDENTRYPOINT:定义容器启动时的默认行为

  • 格式:CMD ["executable", "param1", "param2"]
  • 说明:CMD 提供了容器的默认运行命令,但可以被覆盖。ENTRYPOINT 则定义了固定的启动命令,通常配合 CMD 来设置参数。

EXPOSE:暴露端口

  • 格式:EXPOSE <port>
  • 说明:声明容器内部应用监听的端口,不过需要在运行容器时明确暴露该端口。

ENV:设置环境变量

  • 格式:ENV <key> <value>
  • 说明:用于定义在构建和运行时可用的环境变量。

三、Dockerfile 的常见配置项

        首先我们要知道,Dockerfile中的指令分为两大类,一部分为声明式指令,比如“FROM”、“WORKDIR”、“EXPOSE”、“ENV”、“VOLUME”、“USER”、“LABEL”,它们只是声明一个基础,一个规则或者一个关系,另一部分为创建式指令,如“RUN”、“COPY”、“ADD”、“CMD”、“ENTRYPOINT”,它们往往是增加部分文件或内容、预设部分命令等,都会创建一个镜像层,若干个镜像层合并起来就是你要生成的新镜像。比如:

FROM node:14              # 基础镜像,不创建新层
WORKDIR /app              # 设置工作目录,不创建新层
COPY package.json /app    # 复制文件,创建新层
RUN npm install           # 安装依赖,创建新层
COPY . /app               # 复制代码,创建新层
CMD ["npm", "start"]      # 设置容器启动命令,创建新层

        为了让 Dockerfile 更高效和可维护,以下是一些常见的优化配置:

1、多阶段构建 (Multi-stage Builds)

        在开发过程中可能会遇到需要在镜像内编译源代码,但编译后的产物才是最终的镜像内容。多阶段构建可以将编译和最终镜像的制作分离出来,减少镜像体积。

FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myappFROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

2、缓存优化

        Dockerfile 中的命令是逐行缓存的。当构建镜像时,如果 Docker 发现某个指令之前已经执行过,并且输入没有发生变化,它会直接使用缓存的结果,而不重新执行。这能显著提升构建速度。

        如果文件结构频繁变化,可以通过合理安排 COPY 和 RUN 来减少不必要的重新构建。

        例如,假设你在 Dockerfile 中执行如下指令:

COPY . /app
RUN npm install

        如果你的项目代码发生了变化,COPY . /app 会被重新执行,那么 RUN npm install 也会重新执行,即使 package.json 没有变化。重新安装依赖往往非常耗时,这是不必要的。

         解决办法是将 package.json 先单独复制并安装依赖,再复制其余代码:

# Step 1: 复制 package.json 并安装依赖
COPY package.json /app
RUN npm install# Step 2: 复制项目的其他文件
COPY . /app

        这样,只有当 package.json 发生变化时,才会重新运行 npm install,否则它会使用缓存结果,极大地节省时间。

3、合并 RUN 命令

        每个 RUN 命令会创建一个镜像层,多个命令可以合并到一个 RUN 中,减少镜像层的数量,优化镜像大小。

RUN apt-get update && apt-get install -y \python3 \python3-pip && \apt-get clean && \rm -rf /var/lib/apt/lists/*

四、Dockerfile 使用须知

        .dockerignore 文件:类似于 .gitignore,.dockerignore 文件可以避免将不必要的文件(如 .git、node_modules)复制到镜像中,优化构建速度和镜像体积。

        命令顺序和缓存:Docker 构建是分层的,每个命令会生成一个新的层。如果前面的层没有变化,Docker 会使用缓存,避免重新执行命令。因此,优化命令顺序能加速构建过程。

        最小化镜像大小:选择合适的基础镜像(如 Alpine),移除不必要的包和文件,尽量减小镜像体积,提升启动速度和安全性。

        避免敏感信息:不要将密码、秘钥等敏感信息硬编码在 Dockerfile 中。可以使用环境变量、配置文件等方式进行注入。

        容器进程的管理:确保 Docker 容器中运行的进程是前台进程,否则容器可能会意外退出。可以通过 CMD 或 ENTRYPOINT 来定义正确的启动进程。 

五、一个完整的Dockerfile实例

# Step 1: 使用 Node.js 作为基础镜像
FROM node:14# Step 2: 设置工作目录
WORKDIR /app# Step 3: 复制 package.json 并安装依赖
COPY package.json /app
RUN npm install# Step 4: 复制应用代码
COPY . /app# Step 5: 构建应用
RUN npm run build# Step 6: 暴露应用端口
EXPOSE 3000# Step 7: 定义容器启动命令
CMD ["npm", "start"]

六、总结

        Dockerfile 是容器化开发中的关键工具。理解并掌握其使用方式,不仅能提高开发效率,还能让你的应用具备更强的可移植性和灵活性。通过优化配置和合理安排构建步骤,可以打造更轻量、更高效的容器镜像。

         只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        其他热门文章,请关注:

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        在线编程实现!如何在Java后端通过DockerClient操作Docker生成python环境

        干货含源码!如何用Java后端操作Docker(命令行篇)

        JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南

        PDF预览:利用vue3-pdf-app实现前端PDF在线展示

        巧用Array.forEach:简化循环与增强代码可读性

        Docker 入门全攻略:安装、操作与常用命令指南

        MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

        shpfile转GeoJSON且控制转化精度;如何获取GeoJSON?GeoJson结构详解

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C盘太臃肿了用这招一键给C盘瘦身 快速释放C盘空间

C盘太臃肿了用这招一键给C盘瘦身 快速释放C盘空间。我们的电脑不知不觉的就爆满了&#xff0c;这个主要的原因就是各种垃圾文件堆积&#xff0c;时间用得越久&#xff0c;垃圾堆积得越多&#xff0c;这样我们的C盘空间就被蚕食了&#xff0c;空间越来越小&#xff0c;变得越来越…

干货分享:为什么stable diffusion训练用ddpm, 采样用ddim呢?

前言 回忆一下DDPM&#xff0c;实质上它的推导过程应是如下的&#xff1a; 其中&#xff0c; 是单纯的高斯分布的推导&#xff0c;相当于一个序列过程的归纳法推导。 在DDPM中采用的是[贝叶斯公式]。 而过程则是用对进行一个估测&#xff0c;也就是用前向过程反过来对进行一个…

sql语法学习:关键点和详细解释

学习SQL语法是掌握数据库操作的基础。以下是SQL语法的一些关键点和详细解释&#xff1a; 1. SQL基础 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系型数据库的标准语言。它主要包括以下几个部分&#xff1a; 数据定义语言&#xff08;DDL&…

探索Mem0:AI的智能记忆层

文章目录 探索Mem0&#xff1a;AI的智能记忆层背景介绍Mem0是什么&#xff1f;如何安装Mem0&#xff1f;简单使用方法应用场景常见问题及解决方案总结 ![ 探索Mem0&#xff1a;AI的智能记忆层 背景介绍 在人工智能的世界里&#xff0c;记忆是个性化体验的关键。想象一下&…

结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 介绍 百度百科&#xff1a;装饰模式指的是在不必改变原类文件和使用继承的情况下&#xff0c;动态地扩展一个对…

只需5分钟!掌握学术写作的核心逻辑!

人工智能的广泛应用中&#xff0c;ChatGPT 已被证明是一种极具潜力的语言模型&#xff0c;其功能涵盖多个领域&#xff0c;显示出强大的适应性。在 GPT-4 架构的推动下&#xff0c;ChatGPT 正在彻底改变我们与文本驱动的人工智能的交互模式。 在学术界&#xff0c;学术写作至关…

【测试】——Selenium API (万字详解)

&#x1f4d6; 前言&#xff1a;本文详细介绍了如何利用Selenium进行Web自动化测试&#xff0c;包括定位元素&#xff08;如cssSelector和xpath&#xff09;、常用操作函数&#xff08;如点击、输入等&#xff09;、窗口管理、键盘鼠标事件和浏览器导航&#xff0c;以及处理弹窗…

实用小工具——多标签页插件Office Tab介绍

Office Tab引入选项卡式用户界面&#xff0c;增强了Microsoft Office使用体验。软件界面&#xff0c;可以设置你喜欢的标签类型。 安装后office界面会新增一个办公标签栏&#xff0c;立面有各功能说明。 最常用的是这个标签切换功能。 安装也很简单&#xff0c;选择对应位数安装…

知识产权实缴出资是否合法

知识产权实缴出资是否合法 近年来&#xff0c;随着知识产权在企业价值中的重要性日益凸显&#xff0c;知识产权实缴出资作为一种新兴的出资方式&#xff0c;逐渐受到社会各界的关注。然而&#xff0c;关于知识产权实缴出资是否合法的问题&#xff0c;一直是企业和投资者关注的焦…

vulnhub(13):LordOfTheRoot(sql时间盲注、mysql udf提权)

端口 nmap主机发现 nmap -sn 192.168.72.0/24 ​ Nmap scan report for 192.168.72.170 Host is up (0.00020s latency). ​ 170是新出现的机器&#xff0c;他就是靶机 nmap端口扫描 nmap -Pn 192.168.72.170 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap/sca…

Sony IMX334LQR-C 1/1.8寸 8.42 M像素

索尼IMX334LQR宽动态超星光级交通监测CMOS 封装&#xff1a;LGA 对⾓线&#xff1a;8.86 mm&#xff08;类型1/1.8&#xff09; 索尼IMX334LQR宽动态超星光级交通监测CMOS的参数及规格书资料&#xff1a; IMX334LQR-C是⼀个对⾓线8.86 mm&#xff08;类型1/1.8&#xff09;的…

帕金森病:这五大幕后推手,你了解多少?

在快节奏的现代生活中&#xff0c;健康问题日益受到公众的关注&#xff0c;而帕金森病作为一种常见的神经系统退行性疾病&#xff0c;更是牵动着无数家庭的心弦。今天&#xff0c;就让我们一起揭开帕金森病的神秘面纱&#xff0c;探讨其背后的五大主要原因&#xff0c;让更多人…

离散化c++

应用于数字取值范围很大&#xff0c;但数字个数很少的情况&#xff0c;原理是将要用到的数字放到一个连续的数组中&#xff0c;通过一个函数find得到数字和存放在数组中的下标的映射关系。 其中find函数的实现可以通过二分查找来实现&#xff1b; 练习题&#xff1a; 题意&…

Python 类型提示全解析:从入门到精通的必备技巧(如何让Python代码更清晰、错误更少)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 什么是类型提示?📝 类型提示的基本用法📝 高级用法📝 类型提示的工具和技巧📝 注意事项和最佳实践⚓️ 相关链接 ⚓️📖 介绍 📖 在编程的世界里,代码的清晰和可维护性是成功的关键。尤其是在 …

C++——关联式容器(5):哈希表

7.哈希表 7.1 哈希表引入 哈希表的出现依旧是为了查找方便而设计的。在顺序结构中&#xff0c;查询一个值需要一一比较&#xff0c;复杂度为O(N)&#xff1b;在平衡树中&#xff0c;查询变为了二分查找&#xff0c;复杂度为O(logN)&#xff1b;而对于哈希表&#xff0c;我们可…

SpringBoot简易商品管理系统

> 这是一个基于SpringBootThymeleaf实现的简易商品管理系统。 > 包含基本的登录/注册与商品管理功能。 > 界面简洁美观&#xff0c;代码结构清晰&#xff0c;适用于JAVA初学者在此基础上进行二次开发。 一、项目演示 二、技术框架 框架描述Spring Boot容器管理 S…

毫米波雷达预警功能 —— 开门预警(DOW)

文档声明&#xff1a; 以下资料均属于本人在学习过程中产出的学习笔记&#xff0c;如果错误或者遗漏之处&#xff0c;请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。 笔记资料仅供学习交流使用&#xff0c;转载请标明出处&#xff0c;谢谢配…

16代现场实拍图

64*32 全彩 LED 点阵显示屏 无线通信868M&#xff0c;跳频通信 通信速率200K/50K 覆盖20-30米以上的通信半径 尺寸&#xff1a;192*96mm 供电方式&#xff1a;24V外置电源 储存温度&#xff1a;-40℃~80℃ 工作温度&#xff1a;-20℃~50℃ 自定义双向通信协议&#xff…

工业无线路由器组网方案:简单方便的工业组网方案

​一、项目背景 随着工业互联网的发展&#xff0c;越来越多的企业开始寻求高效、稳定的网络解决方案&#xff0c;以支持其生产和管理的数字化转型。工业无线路由器在这一过程中扮演着重要的角色。本文将详细介绍基于星创易联SR500工业无线路由器的组网方案&#xff0c;适用于制…

解锁2024年翻译在线Top4,让每一次交流都精准无误

现在世界就像个大家庭&#xff0c;交流多了&#xff0c;语言不通就成了问题。有道翻译在线就像桥梁&#xff0c;帮我们和全世界的朋友沟通。对企业来说&#xff0c;翻译准确太重要了&#xff0c;一句话翻错可能损失巨大。有道翻译在线技术强&#xff0c;各种语言都能搞定&#…