存储性能优化
容器的存储挑战
容器相比传统虚拟机在存储方面有以下特点:
- 容器层是临时的,容器删除后数据丢失
- 写入层(Writable Layer)使用 Copy-on-Write(写时复制)机制
- 默认存储驱动(overlay2)的 I/O 性能不如直接使用宿主机文件系统
存储驱动选择
overlay2(推荐)
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
优势:
– 比 aufs 和 devicemapper 性能更好
– 支持 page cache 共享
– 内核原生支持(Linux 4.0+)
检查当前驱动:
docker info | grep "Storage Driver"
性能对比
| 存储驱动 | 性能 | 内核要求 | 生产推荐 |
|---|---|---|---|
| overlay2 | ⭐⭐⭐⭐⭐ | 4.0+ | ✅ 首选 |
| aufs | ⭐⭐⭐ | 3.x | ❌ 已过时 |
| devicemapper | ⭐⭐ | 任何 | ❌ 不推荐 |
| btrfs/zfs | ⭐⭐⭐⭐ | 特殊 | ⚠️ 特定场景 |
数据卷性能优化
使用 Volume 而非 Bind Mount
# Volume:由 Docker 管理,性能更好
docker volume create mydata
docker run -v mydata:/data ...
# Bind Mount:直接挂载宿主机目录,有额外的权限检查
docker run -v /host/path:/container/path ...
Volume 驱动选择
# 本地 volume -> 默认使用宿主机文件系统
# NFS volume -> 网络存储,I/O 有网络延迟
# 推荐:SSD 宿主机的本地 volume
设置文件系统类型
# 使用 XFS 而非 ext4(对 Docker volume 性能更好)
mkfs.xfs /dev/sdb
mount /dev/sdb /var/lib/docker
多阶段构建优化
减少最终镜像大小可以间接提升存储性能:
# ❌ 大镜像
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
CMD ["node", "dist/server.js"]
# ✅ 小镜像
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build
FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/server.js"]
I/O 密集应用优化
1. 数据库容器
# 数据库(MySQL/PostgreSQL)使用 Volume 而非容器内文件系统
docker run -d \
--name mysql \
-v mysql-data:/var/lib/mysql \
--mount type=volume,source=mysql-conf,target=/etc/mysql/conf.d \
mysql:8.0
# 使用 tmpfs 存储临时数据
docker run -d \
--tmpfs /tmp:rw,noexec,nosuid,size=1g \
mysql:8.0
2. 日志和临时文件
version: '3'
services:
app:
image: myapp
tmpfs:
- /tmp:size=500m
- /var/log/app:size=200m
volumes:
- app-data:/data
使用 tmpfs 将临时文件存在内存中可以显著提升 I/O 性能。
I/O 监控
# 容器级别 I/O
docker stats --no-stream
# 查看容器的 I/O 限制
docker inspect | jq '.[].HostConfig.BlkioWeight'
# 系统级别 I/O
iostat -x 1
iotop
# Docker 级别的磁盘使用
docker system df
调优参数
daemon.json 调优
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"default-shm-size": "128M"
}
容器级别调优
# 限制 I/O
docker run \
--device-read-bps /dev/sda:100mb \
--device-write-bps /dev/sda:50mb \
--device-read-iops /dev/sda:1000 \
--device-write-iops /dev/sda:500 \
mysql:8.0
面试要点
- overlay2 是目前推荐的存储驱动,性能和稳定性最好
- Volume 优于 Bind Mount,Docker 管理的 volume 性能更好
- 多阶段构建减少镜像体积间接提升存储效率
- tmpfs 适合临时文件和缓存,显著提升 I/O 性能
- 数据库容器务必使用 Volume 存储数据文件
面试官常问:数据库容器化时如何优化 I/O 性能?tmpfs 用在什么场景?
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容