Dockerfile 学习笔记:从基础镜像到可复现构建

阿远
2026-10-29 / 0 评论 / 0 阅读 / 正在检测是否收录...

容器能启动只是第一步,镜像怎样构建、依赖怎样固定,也影响以后能否重新部署。本篇整理 Dockerfile 的基础构建流程。

学习整理:2026-10-29。以下命令、地址和账号均为课程实验示例,按实际环境替换;涉及安装、覆盖配置或服务启停的操作先在隔离环境练习,不代表本站已经实施。

一、示例

FROM nginx:stable-alpine
COPY ./dist/ /usr/share/nginx/html/
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget -q -O- http://127.0.0.1/ || exit 1

构建:

docker build -t ops-demo/web:1.0.0 .
docker image history ops-demo/web:1.0.0
docker run --rm -p 127.0.0.1:8080:80 ops-demo/web:1.0.0

二、常用指令

  • FROM:基础镜像。
  • RUN:构建期间执行。
  • COPY:复制构建上下文文件。
  • WORKDIR:后续命令工作目录。
  • ENV:镜像默认环境变量。
  • ARG:构建参数,不适合保存秘密。
  • USER:容器默认用户。
  • ENTRYPOINT/CMD:启动命令。
  • HEALTHCHECK:健康检查。

三、构建上下文

docker build最后的点表示上下文目录。Docker会读取该目录中允许的文件,应使用.dockerignore:

.git
*.log
.env
backup/
node_modules/

四、优化原则

  • 选择可信、维护中的基础镜像。
  • 固定可追踪版本,不依赖latest作为发布版本。
  • 合理利用构建缓存。
  • 多阶段构建减少最终镜像。
  • 删除构建缓存和包管理缓存。
  • 不把密钥写入镜像层。
  • 尽可能使用非root用户。
  • 在CI中扫描镜像漏洞。

五、镜像标签

推荐同时记录:

  • 语义版本,如1.2.0。
  • Git提交短哈希。
  • 构建时间或流水线编号。

镜像应不可变。同一个版本标签不要反复覆盖不同内容。

六、排障

  • COPY失败:文件不在构建上下文或被.dockerignore排除。
  • 下载失败:DNS、代理、仓库、证书。
  • 启动退出:CMD错误、配置错误、前台进程结束。
  • 架构不匹配:镜像平台与主机CPU不同。
  • 镜像太大:构建产物和工具没有分阶段。

我的验收重点

先说清每个组件和参数解决的问题,再在实验环境记录正常结果、错误现象与恢复步骤。配置能通过语法检查只是起点,还应验证实际功能。本文保留为学习笔记,不把计划中的多机部署或演练写成本站完成记录。

让最小构建确实能运行

先 mkdir -p dist 并生成 dist/index.html,同时准备包含 server 块的 nginx.conf,才能执行 COPY。示例映射改为 127.0.0.1:8080:80,避免实验服务意外对外暴露。EXPOSE 只是镜像元信息,不会自动发布端口。stable-alpine 是会变化的标签,真正可复现需要记录 digest、源文件和构建参数。HEALTHCHECK 失败只改变健康状态,不保证 Docker 自动重启容器。

配套文件

在新的实验目录保存本文 Dockerfile,创建 dist/index.html。nginx.conf 保存以下 server 片段:

server {
    listen 80;
    root /usr/share/nginx/html;
    location / { try_files $uri $uri/ =404; }
}

可用 mkdir -p dist,再用 printf 写入一句测试文字。构建后 curl http://127.0.0.1:8080/ 应返回该文字。前台运行时用 Ctrl+C 停止,--rm 随后移除实验容器。

内容复核与修订:2026-10-29。实验示例与本站运行记录分别说明;原始归档日期保留。
0

评论 (0)

取消