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 的区别。