Docker速查笔记
1. Dockerfile 是什么?
Dockerfile 是一个文本文件,里面包含了一系列指令,用来定义如何构建一个 Docker 镜像。你可以把它想象成一个“菜谱”,Docker 会根据这个“菜谱”一步步构建出你想要的镜像。
2. Dockerfile 的基本结构
一个典型的 Dockerfile 由多个指令组成,每个指令对应一个操作。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   |  FROM ubuntu:20.04
 
  WORKDIR /app
 
  COPY . .
 
  RUN apt-get update && apt-get install -y python3
 
  EXPOSE 80
 
  CMD ["python3", "app.py"]
 
  | 
 
3. Dockerfile 常用指令详解
1. FROM
- 作用:指定基础镜像。
 
- 语法:
FROM <镜像名>:<标签> 
- 示例:
FROM ubuntu:20.04 
2. WORKDIR
- 作用:设置工作目录,后续命令会在此执行。
 
- 示例:
WORKDIR /app 
3. COPY
- 作用:将本地文件复制到容器中。
 
- 示例:
COPY . . 
4. RUN
- 作用:执行命令(通常用于安装依赖)。
 
- 示例:
RUN apt-get update && apt-get install -y python3 
5. EXPOSE
- 作用:声明容器运行时监听的端口(不自动映射)。
 
- 示例:
EXPOSE 80 
6. CMD
- 作用:指定容器启动时默认执行的命令。
 
- 示例:
CMD ["python3", "app.py"] 
7. ENV
- 作用:设置环境变量。
 
- 示例:
ENV PYTHON_VERSION=3.8 
8. ADD
- 作用:类似 COPY,但可解压或从 URL 下载文件。
 
- 示例:
ADD https://example.com/file.tar.gz /app 
9. ENTRYPOINT
- 作用:设置容器启动时固定执行命令。
 
- 示例:
1 2
   | ENTRYPOINT ["python3"] CMD ["app.py"]
   | 
 
10. VOLUME
- 作用:声明挂载点,用于持久化数据。
 
- 示例:
VOLUME /data 
4. Dockerfile 最佳实践
1. 减少镜像层数
1
   | RUN apt-get update && apt-get install -y python3 && apt-get clean
   | 
 
2. 使用 .dockerignore
防止无关文件被复制到镜像中。
3. 多阶段构建
1 2 3 4 5 6 7
   | FROM node:14 AS build WORKDIR /app COPY . . RUN npm install && npm run build
  FROM nginx:alpine COPY --from=build /app/dist /usr/share/nginx/html
   | 
 
5. 实战:编写一个 Python 应用的 Dockerfile
项目结构
1 2 3 4
   | my-app/ ├── app.py ├── requirements.txt └── Dockerfile
   | 
 
Dockerfile 内容
1 2 3 4 5 6 7
   | FROM python:3.8-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 5000 CMD ["python", "app.py"]
   | 
 
构建与运行
1 2
   | docker build -t my-python-app . docker run -p 5000:5000 my-python-app
   | 
 
6. 常见基础镜像分类
操作系统镜像
| 镜像名 | 
特点 | 
示例标签 | 
| ubuntu | 
功能全面 | 
ubuntu:22.04 | 
| alpine | 
轻量(5MB) | 
alpine:latest | 
| centos | 
稳定,常用于企业 | 
centos:8 | 
| debian | 
稳定精简 | 
debian:bullseye | 
语言运行时镜像
| 语言 | 
官方镜像示例 | 
说明 | 
| Python | 
python:3.11-slim | 
轻量环境 | 
| Node.js | 
node:18-alpine | 
带 npm/yarn | 
| Go | 
golang:1.20-alpine | 
编译环境 | 
| Java | 
eclipse-temurin:17-jdk-alpine | 
OpenJDK | 
| PHP | 
php:8.2-apache | 
带 Apache 支持 | 
数据库镜像
| 数据库 | 
镜像名 | 
常用标签 | 
| MySQL | 
mysql | 
mysql:8.0 | 
| PostgreSQL | 
postgres | 
postgres:latest | 
| Redis | 
redis | 
redis:6.2 | 
Web 服务器镜像
| 服务 | 
镜像名 | 
示例标签 | 
| Nginx | 
nginx | 
nginx:latest | 
| Apache HTTPD | 
httpd | 
httpd:2.4 | 
特殊用途镜像
| 镜像 | 
特点 | 
| scratch | 
空镜像,用于静态二进制 | 
| busybox | 
极轻量系统工具集 | 
✅ 总结
- 合理使用 
.dockerignore 减少冗余。 
- 多阶段构建减少体积。
 
- 优先选择官方轻量镜像。
 
- 注意 CMD 与 ENTRYPOINT 的区别。