保姆级教程:在Ubuntu Server上把两块旧SSD组RAID 0,给Docker容器当高速存储盘
极速容器存储方案Ubuntu Server下用双SSD构建RAID 0阵列优化Docker性能当你在家庭实验室或开发环境中运行大量容器时存储I/O很容易成为性能瓶颈。最近我在迁移本地开发环境时发现两块闲置的256GB SSD于是决定将它们组成RAID 0阵列专门用于Docker存储。经过实测容器镜像拉取速度提升了近2倍批量构建时间缩短了40%。下面分享我的完整实现方案。1. 硬件准备与系统环境配置1.1 选择合适的SSD组合在开始前需要确认几个关键点磁盘类型一致性最好使用相同型号、容量的SSD我这次使用的是两块三星860 EVO 250GB接口带宽SATA III接口理论带宽为6GbpsNVMe则更高健康状态检查使用smartctl检查磁盘健康状况sudo smartctl -a /dev/sdb | grep -i media_wearout_indicator1.2 系统环境准备我的测试环境Ubuntu Server 22.04 LTS内核版本5.15.0-76-genericDocker版本23.0.1先更新系统并安装必要工具sudo apt update sudo apt upgrade -y sudo apt install -y mdadm xfsprogs hdparm2. 创建并优化RAID 0阵列2.1 磁盘识别与初始化列出可用磁盘lsblk -o NAME,MODEL,SIZE,ROTA,FSTYPE,MOUNTPOINT典型输出示例NAME MODEL SIZE ROTA FSTYPE MOUNTPOINT sda Samsung SSD 860 256G 0 sdb Samsung SSD 860 256G 0 nvme0n1 Kingston A2000 1T 0重要安全提示操作前请确认目标磁盘没有重要数据RAID 0创建过程会清除磁盘所有内容2.2 创建高性能RAID 0使用mdadm创建阵列时有几个关键参数需要特别注意sudo mdadm --create --verbose /dev/md0 \ --level0 \ --raid-devices2 \ --chunk256 \ # 对SSD较优的块大小 --metadata1.2 \ # 最新元数据格式 /dev/sda /dev/sdb验证阵列状态cat /proc/mdstat watch -n 1 cat /proc/mdstat # 实时监控2.3 文件系统选择与优化对于Docker工作负载推荐使用XFS文件系统sudo mkfs.xfs -f -d su256k,sw2 -l version2 /dev/md0关键参数说明-d su256k条带单元大小与RAID chunk对齐-l version2启用最新日志特性挂载参数优化/etc/fstab示例UUIDyour-uuid /mnt/docker xfs defaults,noatime,nodiratime,discard 0 03. Docker存储配置实战3.1 迁移Docker数据目录首先停止Docker服务sudo systemctl stop docker然后迁移现有数据如果有sudo rsync -avxP /var/lib/docker/ /mnt/docker/修改Docker配置文件/etc/docker/daemon.json{ data-root: /mnt/docker, storage-driver: overlay2 }3.2 存储驱动优化建议不同工作负载下的推荐配置工作负载类型推荐配置调优参数多容器开发环境overlay2dm.basesize20GCI/CD构建节点fuse-overlayfsdm.mkfsarg-O ^has_journal数据库容器devicemapperdm.blkdiscardfalse重新加载配置sudo systemctl daemon-reload sudo systemctl start docker4. 性能测试与调优4.1 基准测试对比使用fio进行测试随机4K读写[global] ioenginelibaio direct1 runtime30 size1G [randwrite] rwrandwrite bs4k [randread] rwrandread bs4k单盘 vs RAID 0测试结果测试项单SSD (IOPS)RAID 0 (IOPS)提升幅度随机读45,78289,15694.8%随机写23,45146,89299.9%顺序读(MB/s)52098288.8%4.2 实际应用场景测试镜像拉取docker pull mysql:8.0耗时从58秒降至31秒Maven构建大型Java项目构建时间从8分12秒缩短至5分07秒数据库导入1GB SQL文件导入时间从4分22秒减少到2分45秒5. 维护与故障处理5.1 监控阵列健康状态设置定期检查任务/etc/cron.weekly/raid-check#!/bin/bash echo $(date) RAID Status /var/log/raid-check.log mdadm --detail /dev/md0 /var/log/raid-check.log smartctl -a /dev/sda | grep -i wear /var/log/raid-check.log smartctl -a /dev/sdb | grep -i wear /var/log/raid-check.log5.2 安全备份策略由于RAID 0没有冗余建议使用cron定期备份关键容器数据将重要镜像推送到私有仓库考虑使用docker commit保存关键容器状态备份示例脚本#!/bin/bash BACKUP_DIR/mnt/nas/docker_backups mkdir -p $BACKUP_DIR/$(date %Y%m%d) docker ps -aq | xargs -I {} docker export {} $BACKUP_DIR/$(date %Y%m%d)/container_{}.tar6. 进阶配置技巧6.1 TRIM支持优化启用定期TRIM/etc/cron.daily/trim-raid#!/bin/sh fstrim -v /mnt/docker6.2 内核参数调优在/etc/sysctl.conf中添加# 提高IO队列深度 block.queue_depth 256 # 优化调度器SSD专用 vm.swappiness 1 vm.dirty_ratio 10 vm.dirty_background_ratio 56.3 电源管理调整防止SSD进入低功耗模式for disk in /dev/sda /dev/sdb; do echo max_performance /sys/block/${disk##*/}/device/scsi_disk/*/cache_type done在实际使用三个月后这个配置在持续运行30容器的开发环境中表现稳定。最明显的改善是在同时启动多个容器时启动时间从平均12秒降到了7秒左右。不过需要注意的是在长时间高负载下SSD的温度会比单盘配置时高5-8℃建议保持良好的散热条件。