文档
Docker 入门教程:容器化核心概念与最佳实践
1. Docker 解决了什么?
在传统部署中:
- 环境不一致:"我这里能跑"
- 依赖冲突:A 项目需要 Python 3.9,B 项目需要 Python 3.11
- 部署繁琐:安装依赖 → 配置环境 → 启动
- 资源浪费:VM 占用大量内存和磁盘
Docker 通过**镜像(Image)将应用和依赖打包,在任何地方以容器(Container)**形式运行。
2. 核心概念
Image vs Container
- Image:只读模板,类似 ISO 文件
- Container:Image 的运行实例,可读可写层叠加
Dockerfile 指令速查
FROM # 基础镜像
RUN # 构建时执行命令
COPY # 复制文件(推荐)
ADD # 复制 + 解压/URL 下载
WORKDIR # 设置工作目录
ENV # 环境变量
EXPOSE # 声明端口(文档用)
CMD # 容器启动默认命令(可覆盖)
ENTRYPOINT # 容器入口(不可覆盖,除非 --entrypoint)
VOLUME # 声明挂载点
USER # 切换用户
分层构建与缓存
FROM ubuntu:22.04 # Layer 1: 基础层
RUN apt update # Layer 2: apt 缓存
RUN apt install -y python # Layer 3: Python
COPY app.py . # Layer 4: 代码(变更频繁)
Docker 会缓存不变的层,只有变更的层需要重建。
3. 最佳实践
- ✅ 使用多阶段构建减小镜像体积
- ✅ 以非 root 用户运行
- ✅
.dockerignore排除 node_modules/.git 等 - ✅ 固定基础镜像版本标签(不用
latest) - ✅ 合并 RUN 指令减少层数:
RUN apt update && apt install -y pkg1 pkg2 && rm -rf /var/lib/apt/lists/* - ❌ 不要在容器内存储数据(用 Volume)
- ❌ 不要在一个容器运行多个进程(用 Compose)
4. Docker Compose 实战技巧
# 环境变量复用
x-common-env: &common-env
ENV: production
LOG_LEVEL: info
services:
app:
environment:
<<: *common-env
PORT: 5000
# 启动顺序控制
depends_on:
db:
condition: service_healthy # 等待健康检查通过
5. 网络模式
| 模式 | 说明 |
|---|---|
| bridge | 默认,独立网络栈 |
| host | 使用宿主机网络(仅 Linux) |
| none | 无网络 |
| overlay | 跨主机容器通信(Swarm) |
6. 思考题
CMD和ENTRYPOINT的区别?什么场景用哪个?- 为什么推荐 Alpine 作为基础镜像?有什么缺点?
- Volume 和 Bind Mount 的区别?