欢迎关注我的公众号「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。

镜像构建流程示意图

Docker image build workflow

步骤 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

valaidating nginx docker image by running the docker container.

推送镜像到 Docker Hub

登录:

docker login

docker hub login

打标签:

docker tag nginx:1.0 <username>/nginx:1.0

tagging docker image with dockerhub username

推送:

docker push <username>/nginx:1.0

docker image in docker hub

Docker image build to registry workflow

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>EOF

Dockerfile 最佳实践

  • 使用 .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全栈技术」,进公众号【服务】栏,可以看到技术群,点击即可加入学习交流群。↓↓↓

关注公众号,免费学技术~

更多推荐