如何构建 Docker 镜像:超详细新手指南
欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入学习交流群。↓↓↓
关注公众号,免费学技术~
如有问题欢迎添加作者微信👉:15011572657
↓↓↓
在这篇文章中,你将学习如何从零开始构建一个 Docker 镜像,并使用 Dockerfile 将你的应用部署并运行在 Docker 容器中。
众所周知,Docker 是一个用于打包、部署和运行应用的轻量级容器工具。如果你想先了解 Docker 基础,可以参考相关入门文章。
如果你还没有安装 Docker,可参考官方安装指南。
Dockerfile 解析
构建 Docker 镜像最核心的组件就是 Dockerfile。
Dockerfile 是一个包含指令(INSTRUCTION)与参数(ARGUMENT)的简单文本文件。Docker 会根据 Dockerfile 中的内容自动构建镜像。
在 Dockerfile 中:
左边是指令 INSTRUCTION
右边是参数 ARGUMENT
文件名是:Dockerfile或者dockerfile(无扩展名)
常见 Dockerfile 指令与解释
指令 | 含义 |
|---|---|
| FROM | 指定基础镜像(来自 Docker Hub、GCR、Quay、ECR 等) |
| RUN | 在镜像构建期间执行命令 |
| ENV | 设置环境变量(构建期 + 容器运行时均可用) |
| COPY | 复制本地文件到镜像 |
| EXPOSE | 声明容器需要暴露的端口 |
| ADD | COPY 的增强版(支持 URL、自动解压 tar),但官方推荐优先使用 COPY |
| WORKDIR | 设置工作目录 |
| VOLUME | 创建 / 挂载数据卷 |
| USER | 指定容器运行使用的用户 |
| LABEL | 为镜像添加元数据 |
| ARG | 设置构建期变量(不会出现在运行时) |
| SHELL | 指定后续 RUN、CMD 等使用的 shell |
| CMD | 容器启动时执行的命令(可被覆盖) |
| ENTRYPOINT | 容器默认入口点(可通过 CLI 覆盖) |
如何使用 Dockerfile 构建镜像(实战示例)
我们将用一个真实示例来学习整个流程:
从零构建一个 Nginx 镜像,并替换首页 index.html。
镜像构建流程示意图

步骤 1:创建工程目录
mkdir nginx-image && cd nginx-imagemkdir filestouch .dockerignore步骤 2:准备 HTML 与 Nginx 配置
进入 files 目录:
cd files创建 index.html
vi index.html内容如下:
<html> <head> <title>Dockerfile</title> </head> <body> <div class="container"> <h1>My App</h1> <h2>This is my first app</h2> <p>Hello everyone, This is running via Docker container</p> </div> </body></html>创建 Nginx 配置文件 default
vi default内容如下:
server { listen 80 default_server; listen [::]:80 default_server; root /usr/share/nginx/html; index index.html index.htm; server_name _; location / { try_files $uri $uri/ =404; }}步骤 3:选择基础镜像
使用 Ubuntu 18.04:
FROM ubuntu:18.04官方建议:
生产环境尽量使用最小化镜像(如 alpine 或 distroless)
优先使用官方认证镜像以降低安全风险
步骤 4:编写 Dockerfile
在 nginx-image 目录下创建 Dockerfile:
vim Dockerfile内容如下:
FROM ubuntu:18.04 LABEL maintainer="contact@devopscube.com" RUN apt-get -y update && apt-get -y install nginxCOPY files/default /etc/nginx/sites-available/defaultCOPY files/index.html /usr/share/nginx/html/index.htmlEXPOSE 80CMD ["/usr/sbin/nginx", "-g", "daemon off;"]步骤 5:构建 Docker 镜像
最终目录结构如下:
nginx-image├── Dockerfile└── files ├── default └── index.html运行构建命令:
docker build -t nginx:1.0 .步骤 6:运行并测试镜像
docker run -d -p 9090:80 --name webserver nginx:1.0访问:
http://<host-ip>:9090
推送镜像到 Docker Hub
登录:
docker login
打标签:
docker tag nginx:1.0 <username>/nginx:1.0
推送:
docker push <username>/nginx:1.0

Dockerfile heredoc 用法
示例:
RUN <<EOFapt-get updateapt-get upgrade -yapt-get install -y nginxEOF可用于写入 Python 文件:
RUN python3 <<EOFwith open("/hello", "w") as f: print("Hello", file=f) print("World", file=f)EOF可用于直接生成 HTML:
COPY <<EOF /usr/share/nginx/html/index.html<html>...</html>EOFDockerfile 最佳实践
使用
.dockerignore尽量减少镜像层数量
运行非 root 用户
优先使用小镜像(alpine / distroless)
避免泄露密码与敏感信息
使用固定版本 tag 而非 latest
使用多阶段构建(multi-stage build)
避免不必要的 RUN 指令
使用 hadolint 进行 Dockerfile 检查
常见构建问题
Dockerfile 语法错误 → build 失败
8080 端口被占用 → 修改端口或关闭占用程序
无法访问互联网 → DNS 或代理问题
服务名称冲突 → 指定 container --name
官方可信镜像仓库
Registry | 内容 |
|---|---|
Docker Hub | 官方基础镜像 |
Google Cloud | Distroless 基础镜像 |
AWS ECR Public | Amazon 公共镜像 |
RedHat Quay | 企业级镜像仓库 |
Docker 镜像 vs 容器
镜像 | 容器 |
|---|---|
只读层组成 | 镜像 + 可写层 |
如 VM 镜像 | 如 VM 实例 |
可有多个标签 | 镜像必须存在才能运行 |
如何从 Git 仓库构建镜像?
docker build https://github.com/user/repo.git什么是 Docker build context?
就是构建镜像时提交给 Docker Engine 的整个目录内容。
你接下来可以练习
你可以尝试为以下应用制作 Docker 镜像:
Python
Node.js
Django
FastAPI
Java 应用
总结:
本文详细介绍了如何构建 Docker 镜像、使用 Dockerfile、推送镜像、最佳实践等内容。对于 DevOps 工程师而言,熟悉镜像构建流程,是学习容器化与 Kubernetes 的基础。
END
➤ 往期精彩回顾
云计算架构师韩先超亲身经历 | 记录从大学到现在工作经历我的2024年终总结:在坚持中成长,在选择中前行韩先超对咪咕进行【K8S超大规模集群与AI赋能算力网络调度】培训韩先超对合肥电信进行线下Kubernetes技术培训推荐书籍:《Kubernetes从入门到DevOps企业应用实战》——韩老师以企业实战为背景出版的一本高质量书籍:销量突破1万韩先超在2025年3月,对国网进行Python线下培训圆满落幕
韩先超对中国铁道科学研究院进行【容器 + Kubernetes 安全培训】-2025年7月Windows 10正式终结,今日起停止服务,是升级还是继续用?Kubernetes的15大典型应用场景:从微服务到AI,让你彻底搞懂K8s的真正价值Docker 使用场景:15 种最常见的 Docker 用法Linux 服务器 CPU 占用过高排查指南Nginx 限流:如何保护你的服务器免受暴力破解攻击欢迎关注我的公众号「DevOps和k8s全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入学习交流群。↓↓↓
关注公众号,免费学技术~
更多推荐
所有评论(0)