Docker 入门教程(第 4 篇)——Dockerfile 与镜像构建

  • 时间:2025-11-10 17:54 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:在前几篇文章中,我们学习了 镜像、容器、网络与存储 的基本操作。但是实际开发中,我们常常需要 自定义镜像(例如带有特定应用、配置、依赖的环境)。这时就需要用到 Dockerfile。本篇文章带你深入学习 Dockerfile 的语法与镜像构建,并通过实战案例掌握镜像优化技巧。1. 什么是 Dockerfile?Dockerfile 是一个 文本文件,其中包含了构建镜像的所有指令。你可以把它理解为一

在前几篇文章中,我们学习了 镜像、容器、网络与存储 的基本操作。
但是实际开发中,我们常常需要 自定义镜像(例如带有特定应用、配置、依赖的环境)。这时就需要用到 Dockerfile

本篇文章带你深入学习 Dockerfile 的语法与镜像构建,并通过实战案例掌握镜像优化技巧。

1. 什么是 Dockerfile?

Dockerfile 是一个 文本文件,其中包含了构建镜像的所有指令。
你可以把它理解为一份 镜像的食谱,Docker 会根据这份食谱逐步生成镜像。

2. Dockerfile 的常用指令

指令

作用

示例

FROM

指定基础镜像

FROM ubuntu:20.04

RUN

执行命令

RUN apt-get update && apt-get install -y curl

COPY

复制文件到镜像

COPY index.html /usr/share/nginx/html/

ADD

类似 COPY,但支持解压压缩包和 URL

ADD app.tar.gz /app/

WORKDIR

设置工作目录

WORKDIR /app

ENV

设置环境变量

ENV LANG=C.UTF-8

EXPOSE

声明容器对外暴露的端口

EXPOSE 8080

CMD

容器启动时执行的命令(可被覆盖)

CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINT

容器入口点(不易被覆盖)

ENTRYPOINT ["python3", "app.py"]

区别:

  • CMD 更像是“默认参数”,可以在 docker run 时覆盖。
  • ENTRYPOINT 更像是“固定执行的命令”。

3. 构建第一个 Dockerfile

示例:自定义 Nginx 镜像

新建一个目录,编写 Dockerfile:

# 1. 基于官方 Nginx 镜像
FROM nginx:latest
# 2. 拷贝自定义网页文件到镜像中
COPY index.html /usr/share/nginx/html/
# 3. 暴露 80 端口
EXPOSE 80

在同级目录下创建一个 index.html:

<!DOCTYPE html>
<html>
<head><title>Hello Docker</title></head>
<body><h1>我的第一个 Docker 镜像!</h1></body>
</html>

构建镜像:

docker build -t mynginx:v1 .

运行容器:

docker run -d --name testnginx -p 8080:80 mynginx:v1

打开浏览器访问 http://localhost:8080,你会看到自定义页面。

4. Dockerfile 的优化技巧

4.1 合并 RUN 指令

不推荐:

RUN apt-get update
RUN apt-get install -y curl

推荐(减少镜像层数):

RUN apt-get update && apt-get install -y curl

4.2 使用多阶段构建

有些应用(如 Go/Java)需要先编译再运行,这时可以用 多阶段构建,避免将编译工具带入最终镜像。

示例:Go 应用

# 第一阶段:编译
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 第二阶段:运行
FROM alpine:3.17
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

这样最终镜像只包含编译好的二进制文件,而没有 Go 编译环境,体积更小。

4.3 选择轻量化基础镜像

推荐使用 alpine 镜像(只有几 MB 大小)。

FROM alpine:3.17

⚠️ 注意:有些库在 alpine 下可能缺失,需要额外安装。

5. 镜像构建与管理

构建镜像:

docker build -t myapp:v1 .

查看镜像:

docker images

运行容器:

docker run -d -p 8080:80 myapp:v1

删除镜像:

docker rmi myapp:v1

6. 实战:Python Flask 应用镜像

编写 Dockerfile:

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]

假设 app.py 内容如下:

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, Docker!"
if __name__ == "__main__":
app.run(host="0.0.0.0")

构建并运行:

docker build -t flaskapp:v1 .
docker run -d -p 5000:5000 flaskapp:v1

打开 http://localhost:5000,你会看到 Hello, Docker!。

7. 总结

在本篇文章中,我们学习了:

  1. 什么是 Dockerfile。
  2. 常见 Dockerfile 指令及作用。
  3. 如何构建自定义镜像。
  4. 镜像优化技巧(合并 RUN、多阶段构建、使用 alpine)。
  5. 实战案例:自定义 Nginx 页面、Python Flask 应用。

在下一篇文章中,我们将学习 Docker Compose 实战,掌握如何通过 docker-compose.yml 文件管理多容器应用。

  • 全部评论(0)
手机二维码手机访问领取大礼包
返回顶部