一、核心概念
  1. Dockerfile
    定义镜像构建步骤的文本文件,包含一系列指令和配置,用于自动化创建镜像。

  2. 镜像层(Layer)
    Docker 镜像由多层只读层叠加而成,每个指令(如 RUNCOPY)会生成一个新的层。层可缓存,加速重复构建。

  3. 构建上下文(Build Context)
    发送给 Docker 守护进程的文件集合,用于构建镜像。默认是 Dockerfile 所在目录。

二、Dockerfile 基础指令

1. FROM

  • 用途:指定基础镜像,所有 Dockerfile 必须以 FROM 开头。
  • 示例
    FROM nginx:latest  # 基于官方 Nginx 镜像
    

2. RUN

  • 用途:执行 shell 命令,生成新的镜像层。
  • 示例
    RUN apt-get update && apt-get install -y curl  # 安装依赖
    

3. COPY

  • 用途:将本地文件或目录复制到镜像中。
  • 示例
    COPY ./src /app/src  # 复制宿主机的 src 目录到镜像的 /app/src
    

4. ADD

  • 用途:类似 COPY,但支持自动解压压缩文件(如 .tar.gz)和远程 URL。
  • 示例
    ADD https://example.com/file.tar.gz /app/  # 下载并解压文件
    

5. WORKDIR

  • 用途:设置工作目录,后续指令(如 RUNCOPY)将在此目录执行。
  • 示例
    WORKDIR /app  # 切换到 /app 目录
    

6. CMD

  • 用途:定义容器启动时默认执行的命令(可被覆盖)。
  • 示例
    CMD ["node", "server.js"]  # 启动 Node.js 服务
    

7. ENTRYPOINT

  • 用途:定义容器启动时执行的命令(不可被覆盖,但可通过 --entrypoint 修改)。
  • 示例
    ENTRYPOINT ["python", "app.py"]  # 固定执行 Python 脚本
    

8. EXPOSE

  • 用途:声明容器监听的端口(仅文档作用,实际需通过 -p 映射)。
  • 示例
    EXPOSE 8080  # 声明应用使用 8080 端口
    

9. ENV

  • 用途:设置环境变量。
  • 示例
    ENV API_URL=https://api.example.com  # 定义 API 地址
    
三、docker build 命令详解

基本语法

docker build [OPTIONS] PATH | URL | -

常用选项

  • -t, --tag:指定镜像名称和标签(格式:name:tag)。
  • -f, --file:指定 Dockerfile 路径(默认为 PATH/Dockerfile)。
  • --no-cache:禁用缓存,强制重新执行所有步骤。
  • --build-arg:传递构建参数(需在 Dockerfile 中用 ARG 定义)。

示例

  1. 构建并标记镜像:
    docker build -t my_app:v1 .  # 当前目录为构建上下文
    
  2. 指定 Dockerfile 路径:
    docker build -t my_app:v1 -f Dockerfile.prod .
    
  3. 传递构建参数:
    docker build --build-arg ENV=prod -t my_app:prod .
    
四、构建流程示例

目标:构建一个 Node.js 应用镜像。

步骤 1:创建项目结构

mkdir -p node-app/{src,public}
touch node-app/server.js node-app/package.json

步骤 2:编写 Dockerfile

# 使用官方 Node.js 18 镜像作为基础
FROM node:18-alpine# 设置工作目录
WORKDIR /app# 复制 package.json 和 package-lock.json
COPY package*.json ./# 安装依赖
RUN npm install# 复制应用源码
COPY . .# 暴露端口 3000
EXPOSE 3000# 启动应用
CMD ["node", "server.js"]

步骤 3:构建镜像

docker build -t node-app:latest .

步骤 4:运行容器

docker run -p 3000:3000 node-app:latest
五、最佳实践
  1. 减少镜像层数
    合并相关指令(如 RUN apt-get update && apt-get install -y ...),避免生成过多无用层。

  2. 使用 .dockerignore
    排除构建上下文中的无关文件(如 node_modules.git),减少传输大小。

    .git
    node_modules
    *.log
    
  3. 多阶段构建(Multi-Stage Builds)
    分离构建环境和运行环境,减小最终镜像体积。

    # 阶段 1:构建应用
    FROM node:18 AS builder
    WORKDIR /app
    COPY . .
    RUN npm install && npm run build# 阶段 2:运行应用
    FROM node:18-alpine
    WORKDIR /app
    COPY --from=builder /app/dist ./dist
    CMD ["node", "dist/server.js"]
    
  4. 使用轻量级基础镜像
    优先选择 Alpine Linux 或 distroless 镜像,减少镜像体积和安全风险。

    FROM node:18-alpine  # 体积约 100MB,远小于默认的 Ubuntu 镜像
    
  5. 避免以 root 用户运行
    创建非 root 用户,提升容器安全性。

    RUN adduser -D app_user
    USER app_user
    
六、调试与优化
  1. 查看构建日志

    docker build --progress=plain -t my_app:debug .  # 显示详细日志
    
  2. 跳过缓存

    docker build --no-cache -t my_app:nocache .
    
  3. 分析镜像层

    docker history my_app:latest  # 查看各层大小和命令
    
  4. 扫描镜像漏洞
    使用 docker scan 或第三方工具(如 Trivy)检查安全风险。

    docker scan my_app:latest
    
七、常见问题
  1. 构建失败:文件未找到

    • 原因:COPYADD 指令路径错误。
    • 解决:检查文件是否在构建上下文中,使用绝对路径或正确相对路径。
  2. 权限拒绝(Permission Denied)

    • 原因:容器内进程以非 root 用户运行,但文件权限不足。
    • 解决:在 Dockerfile 中使用 RUN chown 修改文件所有者。
  3. 缓存未生效

    • 原因:构建上下文文件变更导致缓存失效。
    • 解决:尽量保持静态文件(如依赖包)不变,或合理拆分指令。
  4. 端口无法访问

    • 原因:未通过 -p 映射端口。
    • 解决:运行容器时添加 -p 主机端口:容器端口,如 docker run -p 8080:80 nginx
八、总结
  • Dockerfile 是镜像构建的核心,需合理设计指令顺序和层结构。
  • docker build 命令通过参数控制镜像名称、上下文和缓存策略。
  • 遵循最佳实践(如多阶段构建、轻量级镜像)可显著优化构建效率和安全性。

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

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

相关文章

Redis 是单线程模型吗?

最近在面试中经常被问到这个问题:"Redis是单线程的吗?"很多同学都会脱口而出:"是的!"但其实这个答案并不完全正确。今天我们就来聊聊Redis的线程模型,把这个问题彻底搞清楚。 先说结论 Redis的线程…

Hologres实战:路径分析函数

前言 Hologres提供了一套高效的路径分析函数,包括路径明细计算和结果解析功能,能够帮助用户深入理解用户行为路径,并通过桑基图实现数据可视化。 一、核心功能 路径明细计算:精确记录用户在产品或功能中的完整访问路径结果解析…

产品开发实践(常见的软硬结合方式)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】前面说过,传统的纯软件开发,在国内的大背景下面是很难存活的。但是如果是把软件,构建在硬件基础之上&#xff0c…

Linux | i.MX6ULL网络通信-套字节 UDP(第十八章)

01 Linux | i.MX6ULL网络通信-套字节 TCP(第十七章) 02 iTOP-IMX6ULL 实现基于 UDP 的 socket 编程。

学习嵌入式第三十天

文章目录进程和线程&#xff08;续&#xff09;线程1.线程传参2.线程属性3.线程间通信1.概念2.方式3.互斥锁4.死锁5.信号量习题 进程和线程&#xff08;续&#xff09; 线程 1.线程传参使用第四个参数实现对线程内部的传参 代码实现&#xff1a; #include <stdio.h> #inc…

GaussDB 数据库架构师修炼(十三)安全管理(3)-行级访问控制

1 背景行级访问控制特性将数据库的访问控制精确到数据表行级别 &#xff0c;只允许用户查看 、更新或删除特定的行数据。2 实例场景实例以医生只能看到治疗的病人&#xff0c;不能看其它医生的病人为例&#xff1a;1)医院病人的信息表pat_info&#xff1a;csdn> set search_…

Wi-Fi 与蜂窝网络(手机网络)的核心区别,以及 Wi-Fi 技术未来的发展方向

在日常生活中&#xff0c;我们既离不开家里的 Wi-Fi&#xff0c;也离不开手机的 4G/5G 网络。它们都能把我们连接到互联网&#xff0c;但底层的工作方式却大不相同。一、设计初衷的不同Wi-Fi诞生于 1997 年的 IEEE 802.11 标准&#xff0c;定位是局域网无线替代。它的目标是让电…

C++编程实战:高效解决算法与数据结构问题

个人主页 &#xff1a; zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 题目1. 数字统计2. 两个数组的交集3. 牛牛的快递4. 点击消除5. 最小花费爬楼梯6. 简写单词1. 数字统计 BC153 数字统计 #include <iostream> using na…

《零基础入门AI:深度学习中的视觉处理(卷积神经网络(CNN)进阶)》

一、卷积知识扩展 1. 二维卷积 单通道版本 对于单通道输入图像 III (尺寸 HWH \times WHW) 和卷积核 KKK (尺寸 FFF \times FFF)&#xff0c;输出特征图 OOO 的计算公式为&#xff1a; O(i,j)∑m0F−1∑n0F−1I(im,jn)⋅K(m,n)O(i,j) \sum_{m0}^{F-1} \sum_{n0}^{F-1} I(im, j…

pyecharts可视化图表-pie:从入门到精通(进阶篇)

欢迎来到pyecharts饼图系列教程的进阶篇&#xff01;在上一篇基础教程中&#xff0c;我们学习了饼图的基本概念和简单实现。在本文中&#xff0c;我们将深入探索pyecharts中饼图的六种高级用法和自定义选项&#xff0c;包括环形饼图、富文本标签饼图、滚动图例饼图、环形图、嵌…

【JAVA 核心编程】面向对象高级:类变量与方法 抽象类与接口

一、类变量与类方法&#xff08;静态变量&#xff09; 1&#xff09;类变量 class Child{private String name;//定义一个变量count&#xff0c;是一个类变量&#xff08;静态变量&#xff09;static静态//该变量最大的特点就是会被Child 类的所有对象访问public static int co…

【Java基础面试题】数据类型

Java面试高频总结&#xff1a;基本数据类型深度解析 &#x1f4ca; 八种基本数据类型详解数据类型关键字字节数位数默认值取值范围核心特性字节型byte180-128 ~ 127最小整数类型短整型short2160-32,768 ~ 32,767较少使用整型int4320-2 ~ 2-1 (约21亿)最常用整数类型长整型long8…

攻防世界—unseping(反序列化)

一.审题<?php highlight_file(__FILE__);class ease{private $method;private $args;function __construct($method, $args) {$this->method $method;$this->args $args;}function __destruct(){if (in_array($this->method, array("ping"))) {call_u…

AI热点周报(8.10~8.16):AI界“冰火两重天“,GPT-5陷入热议,DeepSeek R2模型训练受阻?

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录3分钟速览版&#xff1a;一张表看懂本周AI大事一、GPT-5&#xff1a;期待越高&#x…

Python_vue3_django旅拍在线婚纱摄影网站的设计与实现016023190_源码LW_讲解安装

目录前言-本系统介绍已开发项目效果实现截图开发技术详细介绍论文设计框架系统测试核心代码参考示例总结源码获取详细视频演示或者查看其他版本&#xff1a;文章底部获取博主联系方式&#xff01;前言-本系统介绍 利用Python语言、MySQL数据库&#xff0c;Django框架&#xff0…

Python爬虫-爬取政务网站的文档正文内容和附件数据

前言 本文是该专栏的第67篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以某政务网站为例子。基于Python爬虫采集某政务网站的文档正文内容和其关联的附件数据。 具体的实现思路以及完整实现代码逻辑,笔者将在正文进行详细介绍。废话不多说,跟着笔者直接往下…

Python:如何在Pycharm中显示geemap地图?

01 说明 或许在旧版本的python和jupyter中并不能成功. 作为参考&#xff0c;这里给出实验成功的版本&#xff1a;名称版本通道geemap0.36.1conda-forgejupyter1.1.1conda-forgepycharm2024.1.4 (Professional Edition)nullpython3.11.13conda-forge此外&#xff0c;由于显示底图…

力扣3:无重复字符的最长子串

力扣3:无重复字符的最长子串题目思路代码题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 思路 这道题的思路其实是很简单的&#xff0c;最后我们需要得到子串的长度所以我们可以定义两个变量即子串的左边界和右边界这样有了左右边界就…

Git登录配置的详细方法

Git登录绑定主要涉及配置用户信息和设置身份验证。以下是详细的配置方法&#xff1a; 1. 配置基本用户信息 # 全局配置用户名和邮箱 git config --global user.name "你的用户名" git config --global user.email "你的邮箱example.com"# 或者为单个仓库配…

测试工程师的AI转型指南:从工具使用到测试策略重构

测试工程师的AI转型指南&#xff1a;从工具使用到测试策略重构 测试工程师正站在职业转型的十字路口。当GitHub Copilot能自动生成测试用例&#xff0c;AI性能工具能预测系统瓶颈&#xff0c;传统“手动执行用例、人工分析结果”的工作模式正被颠覆。某互联网公司测试团队的调研…