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.mzph.cn/web/53419.shtml

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

相关文章

Python知识点:如何使用Python进行医学图像处理

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 在Python中进行医学图像处理是一个涉及多个步骤的过程&#xff0c;包括图像的读…

Ruby-SAML CVE-2024-45409 漏洞解决方案

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

从数据仓库到数据中台再到数据飞轮:我了解的数据技术进化史

这里写目录标题 前言数据仓库&#xff1a;数据整合的起点数据中台&#xff1a;数据共享的桥梁数据飞轮&#xff1a;业务与数据的双向驱动结语 前言 在当今这个数据驱动的时代&#xff0c;企业发展离不开对数据的深度挖掘和高效利用。从最初的数据仓库&#xff0c;到后来的数据…

基于SpringBoot+Vue+MySQL的校园一卡通系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着现代社会的快速发展&#xff0c;校园一卡通已成为大学生活中不可或缺的一部分。它不仅承载着校园消费的功能&#xff0c;还集成了学生身份证明、图书馆借阅、门禁系统等多种服务。然而&#xff0c;传统的一卡通管理系统往往…

OpenCL 学习(2)---- OpenCL Platform 和 Device

目录 OpenCL PlatformOpenCL Device参考代码 OpenCL Platform opencl 支持的 Platform 可以使用 clGetPlatformIDs 函数查询&#xff0c;函数原型如下&#xff1a; clGetPlatformIDs(cl_uint /* num_entries */,cl_platform_id * /* platforms */,cl_uint * …

鸿蒙OpenHarmony【轻量系统内核扩展组件(CPU占用率)】子系统开发

基本概念 CPU&#xff08;中央处理器&#xff0c;Central Processing Unit&#xff09;占用率分为系统CPU占用率和任务CPU占用率。 系统CPU占用率&#xff1a;是指周期时间内系统的CPU占用率&#xff0c;用于表示系统一段时间内的闲忙程度&#xff0c;也表示CPU的负载情况。系…

[创业之路-151] :职能部门/非经营部门 VS 业务部门/经营部门划分与职责

目录 前言&#xff1a; 一、部门分类 1、职能部门/非经营部门 2. 业务部门/经营部门 》 企业产品与服务提供链条中的部门 3、研发、生产属于职能部门&#xff0c;也属于业务部门吗&#xff1f; 二、战略 2.1 职能战略 1、定义与目的 2、特点 3、分类 4、作用 2.2 经…

自监督的主要学习方法

自监督学习是一种机器学习方法&#xff0c;其中模型从未标注的数据中学习生成标签&#xff0c;通常通过构造预训练任务或预测任务来从数据的内部结构中提取信息。它的核心目标是利用无监督的数据进行学习&#xff0c;从而在下游任务中更好地利用监督信号。自监督学习的主要方法…

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件&#xff0c;其中编辑一些配置文件&#xff0c;最常用的工具就是 Vim &#xff0c;本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。…

告别枯燥:我开发了一个在电脑桌面上使用弹幕来背单词的软件

前言 在这个快节奏的时代&#xff0c;我们每天都在忙碌中度过&#xff0c;手机虽然方便&#xff0c;但往往难以找到一整块时间来专心背单词。然而&#xff0c;你是否意识到&#xff0c;每天坐在电脑前的时间远比使用手机的时间要长&#xff1f;现在我们来介绍一个新型的学习软…

基于大数据的电子产品需求数据分析系统的设计与实现(Python Vue Flask Mysql)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Springboot 文件上传下载相关问题

文章目录 关于Springboot 文件上传下载问题解决方案注意事项文件上传文件下载文件删除文件在线打开在写练习的时候&#xff0c;发现了一些小小的问题&#xff0c;已经在 上述代码中体现。① 代码路径碰到中文的时候&#xff0c;会有乱码&#xff0c;需要转换&#xff08;内容中…

浏览器插件利器--allWebPluginV2.0.0.20-stable版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

我的AI工具箱Tauri版-VideoIntroductionClipCut视频介绍混剪

本教程基于自研的AI工具箱Tauri版进行VideoIntroductionClipCut视频介绍混剪。 本项目为自研的AI工具箱Tauri版中的视频剪辑模块&#xff0c;专注于自动生成视频介绍片段。该模块名为 VideoIntroductionClipCut&#xff0c;用户可以通过该工具快速进行视频的混剪和介绍内容的生…

【网络】高级IO——epoll版本TCP服务器初阶

目录 前言 一&#xff0c;epoll的三个系统调用接口 1.1.epoll_create函数 1.1.1.epoll_create函数干了什么 1.2. epoll_ctl函数 1.2.1.epoll_ctl函数函数干了什么 1.3.epoll_wait函数 1.3.1.epoll_wait到底干了什么 1.4.epoll的工作过程中内核在干什么 二&#xff0c;…

行列式的计算方法

行列式的计算方法根据矩阵的大小和具体情况可以采用不同的方法。以下是常用的计算行列式的方法&#xff1a; 一、22矩阵的行列式 对于一个22的矩阵&#xff1a; A ( a b c d ) A \begin{pmatrix} a & b \\ c & d \end{pmatrix} A(ac​bd​) 行列式的计算公式为&a…

nginx upstream转发连接错误情况研究

本次测试用到3台服务器&#xff1a; 192.168.10.115&#xff1a;转发服务器A 192.168.10.209&#xff1a;upstream下服务器1 192.168.10.210&#xff1a;upstream下服务器2 1台客户端&#xff1a;192.168.10.112 服务器A中nginx主要配置如下&#xff1a; log_format main…

linux下共享内存的3种使用方式

进程是资源封装的单位&#xff0c;内存就是进程所封装的资源的一种。一般情况下&#xff0c;进程间的内存是相互隔离的&#xff0c;也就是说一个进程不能访问另一个进程的内存。如果一个进程想要访问另一个进程的内存&#xff0c;那么必须要进过内核这个桥梁&#xff0c;这就是…

研究生第一次刷力扣day1

1.给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target 的那两个整数&#xff0c;并返回它们的数组下标 直接采用暴力求解&#xff0c;其他解答案看不懂 大致思想&#xff1a;先用len函数求出数组的长度n&#xff0c;然后一个个遍…

基于SpringBoot+Vue+MySQL的医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今社会&#xff0c;随着医疗服务需求的不断增长和医疗信息化的快速发展&#xff0c;提升医院管理效率和服务质量成为了医疗行业的核心需求。传统的医院管理模式面临着效率低下、资源分配不均、患者就医体验差等问题。为了应…