Docker
定义
Docker 是一个开源的容器化平台,通过操作系统级虚拟化技术将应用及其依赖打包成轻量级、可移植的容器,实现"一次构建,到处运行"的部署模式。
技术定位
Docker 位于 虚拟化 技术栈的容器层,介于传统虚拟机(VM)与裸机部署之间。它通过 Linux 内核特性(如 cgroups 和 namespaces)实现资源隔离,成为现代 微服务 架构和 CI/CD 流程的基础设施标准。
核心特性 (Key Features)
- 轻量级隔离:容器共享宿主机内核,启动时间毫秒级,资源占用远低于虚拟机
- 镜像分层存储:采用 UnionFS 联合文件系统,通过层级复用大幅减少存储空间
- 环境一致性:开发、测试、生产环境使用相同镜像,消除"在我机器上能跑"问题
- 声明式配置 :通过
Dockerfile和docker-compose.yml实现基础设施即代码 - 生态系统完善:Docker Hub 提供数百万公共镜像,支持私有仓库部署
工作原理 (How It Works)
核心架构
Docker 采用 客户端-服务器(C/S)架构,主要组件包括:
REST API
Docker Client
docker CLI
Docker Daemon
dockerd
containerd
容器运行时
runc
OCI 运行时
Linux Kernel
cgroups + namespaces
Images
镜像管理
Containers
容器管理
Networks
网络管理
Volumes
数据卷管理
关键机制说明
-
Namespace 隔离
- PID namespace:进程隔离,容器内 PID 1 独立于宿主机
- Network namespace:网络栈隔离,每个容器拥有独立 IP
- Mount namespace:文件系统隔离,容器看到独立的根文件系统
- UTS namespace:主机名隔离
- IPC namespace:进程间通信隔离
- User namespace:用户权限隔离
-
Cgroups 资源限制
- 限制 CPU、内存、磁盘 I/O、网络带宽
- 防止单个容器耗尽宿主机资源
-
镜像分层机制
[应用层] ← 可写层 (Container Layer) [依赖层] ← 只读层 [运行时层] ← 只读层 [基础镜像层] ← 只读层 (Base Image)- 使用 Copy-on-Write (CoW) 策略:修改文件时才复制到可写层
- 多个容器可共享相同的只读层
快速上手 (Quick Start)
安装
Linux 安装(Ubuntu/Debian)
bash# 安装依赖 sudo apt-get update sudo apt-get install ca-certificates curl gnupg # 添加 Docker 官方 GPG 密钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 添加 Docker 仓库 echo "deb [arch=$(dpkg --print-architecture) \ signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装 Docker Engine sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
Windows/macOS
下载并安装 Docker Desktop
最简代码 (MVE)
bash
# 1. 运行第一个容器(自动拉取镜像)
docker run hello-world
# 2. 运行交互式容器
docker run -it ubuntu:22.04 bash
# 在容器内执行命令后,输入 exit 退出
# 3. 后台运行 Nginx 服务器
docker run -d -p 8080:80 --name my-nginx nginx:alpine
# 访问 http://localhost:8080 查看效果
# 4. 查看运行中的容器
docker ps
# 5. 停止并删除容器
docker stop my-nginx
docker rm my-nginx
创建自定义镜像
\Dockerfile 示例
dockerfile# 基础镜像 FROM node:18-alpine # 设置工作目录 WORKDIR /app # 复制依赖文件并安装(利用缓存层) COPY package*.json ./ RUN npm ci --only=production # 复制应用代码 COPY . . # 暴露端口 EXPOSE 3000 # 启动命令 CMD ["node", "server.js"]
bash# 构建镜像 docker build -t my-app:1.0 . # 运行容器 docker run -d -p 3000:3000 my-app:1.0
优缺点对比 (Trade-offs)
| 维度 | 优势 (Pros) | 局限 (Cons) |
|---|---|---|
| 性能 | 接近原生性能,启动秒级 | 不适合 GUI 应用,图形性能损耗大 |
| 资源占用 | 单机可运行数百容器 | Windows 容器需 Hyper-V,资源开销较大 |
| 隔离性 | 进程级隔离,安全性优于传统部署 | 不如虚拟机隔离彻底,共享内核存在风险 |
| 可移植性 | 跨平台一致性(Linux/Windows/macOS) | 架构依赖(ARM 镜像无法在 x86 上运行) |
| 生态系统 | 海量公共镜像,社区活跃 | 镜像质量参差不齐,存在供应链安全风险 |
| 学习曲线 | 基础使用简单 | 网络、存储、编排等高级特性复杂 |
避坑指南与最佳实践
常见陷阱
1. 数据持久化问题
❌ 错误:将数据存储在容器内,容器删除后数据丢失
✅ 正确:使用 Volume 或 Bind Mount
bashdocker run -v /host/data:/container/data my-app2. 镜像体积过大
❌ 错误:使用完整 OS 镜像(如
ubuntu:latest)✅ 正确:使用 Alpine 或 Distroless 镜像
dockerfileFROM node:18-alpine # 仅 40MB vs node:18 的 900MB+3. 容器以 root 运行
❌ 风险:容器逃逸后可能获得宿主机 root 权限
✅ 正确:创建非特权用户
dockerfileRUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser
性能优化建议
1. 利用构建缓存
dockerfile# 先复制依赖文件(变化频率低) COPY package.json package-lock.json ./ RUN npm ci # 再复制源代码(变化频率高) COPY . .2. 多阶段构建减小镜像
dockerfile# 构建阶段 FROM node:18 AS builder WORKDIR /app COPY . . RUN npm ci && npm run build # 运行阶段 FROM node:18-alpine WORKDIR /app COPY --from=builder /app/dist ./dist CMD ["node", "dist/server.js"]3. 使用 .dockerignore
node_modules .git *.log .env
常见问题
Q: Docker 和虚拟机有什么区别?
A: Docker 容器共享宿主机内核,启动快、资源占用少;虚拟机包含完整 OS,隔离性更强但开销大。
Q: 如何清理无用的镜像和容器?
A: 使用
docker system prune -a清理所有未使用的资源(谨慎操作)。Q: 容器内时间不对怎么办?
A: 挂载宿主机时区文件:
bashdocker run -v /etc/localtime:/etc/localtime:ro my-appQ: 如何限制容器资源?
A: 使用资源限制参数:
bashdocker run --memory="512m" --cpus="1.5" my-app
进阶主题
网络模式
| 模式 | 说明 | 使用场景 |
|---|---|---|
| bridge | 默认模式,容器通过虚拟网桥通信 | 单机多容器应用 |
| host | 容器直接使用宿主机网络栈 | 需要高性能网络的场景 |
| none | 无网络配置 | 安全隔离或自定义网络 |
| container | 共享另一个容器的网络 | Sidecar 模式(如服务网格) |
编排工具对比
单机编排
原生集群
企业级编排
Docker Compose
开发/测试环境
Docker Swarm
中小规模生产
Kubernetes
大规模云原生
- Docker Compose:适合本地开发,通过 YAML 定义多容器应用
- Docker Swarm:Docker 原生集群方案,配置简单但功能有限
- Kubernetes:事实标准,功能强大但学习曲线陡峭
相关资源
官方文档