容器能启动只是第一步,镜像怎样构建、依赖怎样固定,也影响以后能否重新部署。本篇整理 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)