在前几篇文章中,我们学习了 镜像、容器、网络与存储 的基本操作。
但是实际开发中,我们常常需要 自定义镜像(例如带有特定应用、配置、依赖的环境)。这时就需要用到 Dockerfile。
本篇文章带你深入学习 Dockerfile 的语法与镜像构建,并通过实战案例掌握镜像优化技巧。
Dockerfile 是一个 文本文件,其中包含了构建镜像的所有指令。
你可以把它理解为一份 镜像的食谱,Docker 会根据这份食谱逐步生成镜像。
指令 | 作用 | 示例 |
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"] |
区别:
新建一个目录,编写 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,你会看到自定义页面。
不推荐:
RUN apt-get update
RUN apt-get install -y curl
推荐(减少镜像层数):
RUN apt-get update && apt-get install -y curl
有些应用(如 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 编译环境,体积更小。
推荐使用 alpine 镜像(只有几 MB 大小)。
FROM alpine:3.17
⚠️ 注意:有些库在 alpine 下可能缺失,需要额外安装。
构建镜像:
docker build -t myapp:v1 .
查看镜像:
docker images
运行容器:
docker run -d -p 8080:80 myapp:v1
删除镜像:
docker rmi myapp:v1
编写 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!。
在本篇文章中,我们学习了:
在下一篇文章中,我们将学习 Docker Compose 实战,掌握如何通过 docker-compose.yml 文件管理多容器应用。