入门教程 - 容器化核心概念与最佳实践

知识库
知识库文档
/tech-stacks/docker/tutorial/入门教程 - 容器化核心概念与最佳实践.md

文档

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. 思考题

  1. CMDENTRYPOINT 的区别?什么场景用哪个?
  2. 为什么推荐 Alpine 作为基础镜像?有什么缺点?
  3. Volume 和 Bind Mount 的区别?

信息

路径
/tech-stacks/docker/tutorial/入门教程 - 容器化核心概念与最佳实践.md
更新时间
2026/5/31