惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
Martin Fowler
Martin Fowler
博客园 - 【当耐特】
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
C
Check Point Blog
Last Week in AI
Last Week in AI
F
Fortinet All Blogs
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG

博客园 - 洛晨随风

openclaw云端部署踩坑(持续更新) openspec的project.md要求模板 AI编程的残酷真相:为什么说Spec Coding是2026年最大的趋势? 在 AI 编程狂热之后:为什么“文档与原理”才是开发者的真正护城河 python代码:ffmpeg.probe(视频路径) 出现系统找不到指定文件的问题处理办法 浅显易懂的解释一下RRF加权算法的意思 JS队列之双端队列介绍 hugging face 在windows 上的使用办法 大屏上cesium可能出现放大缩小后的坐标偏移问题采坑 windows 端使用gemini cli的办法 记一次插件发布的采坑经历 提示词记录 混合开发的一些小tips(uniapp+hbuilder x+vue3+vite+ 5+APP) AI的规则设置 项目打包时跳过TS类型检查的办法 cursor 配置MCP模式,以读取figma原型为例说明开发的便捷性 pnpm workspace 采坑 一些AI工具整理 解决谷歌翻译导致的HTML多加入<font style=“vertical-align:inherit;“>的问题
🐳 Docker 核心实战与进阶笔记
洛晨随风 · 2025-12-19 · via 博客园 - 洛晨随风

一、 Dockerfile 指令全参数详解

Dockerfile 是定义镜像“静态环境”的说明书。

指令 参数与功能说明 代码示例 关键避坑
FROM 指定基础镜像。开启一个构建阶段。 FROM node:20-slim AS builder AS 用于起别名,方便后续多阶段引用。
WORKDIR 设定工作目录。后续指令的相对路径基准。 WORKDIR /app 目录不存在会自动递归创建(类似 mkdir -p)。
COPY 复制文件。从宿主机或其它阶段拷贝。 COPY --from=builder /app/dist ./dist --from 是跨阶段搬运产物的唯一通道。
ADD 高级复制。支持 URL 下载和自动解压缩。 ADD source.tar.gz /data 原则:除非需要自动解压,否则一律用 COPY
RUN 构建时执行。用于安装软件、编译代码。 RUN pnpm install && pnpm build 层缓存:每一个 RUN 都会产生一层,尽量合并命令。
ENV 运行时环境变量。容器启动后程序可见。 ENV NODE_ENV=production 常用于切换生产/开发环境逻辑。
VOLUME 声明数据卷。定义持久化挂载点。 VOLUME ["/opt/admin"] 标记该目录为“数据出入口”,防止数据随容器消失。
HEALTHCHECK 健康检查。监控业务逻辑是否正常。 HEALTHCHECK --interval=30s CMD curl -f... 不仅看进程,更看服务是否真正可用。
CMD 默认启动命令。容器运行时的第一个进程。 CMD ["node", "server.js"] 限制:只能有一个,多个只有最后一个生效。

二、 核心进阶逻辑:多阶段构建 (Multi-stage)

在企业级 Node.js 开发中,为了解决“镜像臃肿”问题,通常采用双阶段设计:

1. 逻辑结构图

  • 阶段一:Builder(施工房):安装编译器、源代码、缓存。任务是把代码编译成 dist

  • 阶段二:Runner(精装房):重新开一个干净的镜像,只通过 COPY --from=builder 把 dist 拿过来。

2. 代码演练:利用“层缓存”优化速度

codeDockerfile

# --- 第一阶段:编译 ---
FROM node:20-slim AS builder
WORKDIR /app

# 【关键】将 package.json 拷贝放在前面。
# 只要这个文件没变,Docker 就不会重新跑耗时的 install,直接复用缓存层。
COPY package.json pnpm-lock.yaml ./
RUN pnpm install

COPY . .
RUN pnpm build

# 

三、 Dockerfile vs. Docker Compose:元件与组装

1. 深度解读:两者的关联性

  • 关联性:在 docker-compose.yml 中使用 build: . 即可直接触发 Dockerfile 的构建流程,实现“一键代码到系统”。

  • 网络互通(服务发现):Compose 会自动创建内部局域网。容器连接数据库时,主机名直接填 服务名(Service Name)(如 db),Compose 的内置 DNS 会自动解析 IP。

  • 动静结合:Dockerfile 负责固化环境(),Compose 负责动态挂载目录、配置网络、管理端口()。

2. 代码联动示例

codeYaml

# docker-compose.yml
version: '3'
services:
  web-app:
    build: .             # 关联 Dockerfile
    container_name: web_service
    ports:
      - "8080:3000"      

四、 避坑指南与最佳实践(金句总结)

  1.  陷阱

    • 如果 Dockerfile 需要 COPY dist/绝对不能在 .dockerignore 里忽略 dist/。否则 Docker 引擎会因找不到文件而报错。

  2. 镜像即光盘

    • Dockerfile 做出来的镜像是“死”的只读光盘(ROM);启动后的容器才是“活”的运行环境。

  3. 动静分离的思想

    • 死的东西(入镜像):代码逻辑、Node 库、编译成品。

    • 活的东西(入卷):数据库文件、用户上传图片、日志、配置文件。不要把活数据存在镜像里!

  4. 变量管理

    • GitLab CI 自带的 $CI_... 变量是系统自动注入的(如仓库地址、分支名);而 $SONAR_TOKEN 类变量需在 Settings 界面手动录入。

  5. 命令顺序

    • 顺序决定速度:修改代码频繁,修改依赖不频繁。因此先 COPY package.json 再 COPY 源码,能极大加速构建。

  6. 安全原则

    • 默认容器是 root 权限。生产环境建议在 Dockerfile 最后使用 USER node 切换用户,降低被攻破后的风险。


💡 总结:Dockerfile 保证了环境的确定性,Docker Compose 保证了系统的协作性。掌握了卷(Volume)的挂载和多阶段构建的隔离,你就掌握了 Docker 生产级应用的核心。