Win10 WSL Ubuntu20.04环境Docker Pull/Extracting极慢如何解决
小体积文件Extracting阶段耗时异常的核心诱因是WSL跨文件系统IO瓶颈、存储驱动兼容差、镜像源链路不佳,按以下优先级操作即可解决:
1. 修正Docker数据目录位置(解决90%的解包慢问题)
如果Docker的数据存储目录放在Windows挂载的NTFS分区(即/mnt/c/开头的路径下),跨9p协议的文件操作延迟会高到离谱,哪怕几百字节的文件解包都可能卡几十秒:
- 先停止Docker相关服务:
sudo systemctl stop docker docker.socket containerd - 编辑Docker配置文件:
sudo nano /etc/docker/daemon.json - 确保配置中
data-root指向WSL原生ext4分区内的路径,不要放在/mnt挂载的Windows盘符下,示例配置:{ "data-root": "/opt/docker-data" } - 如果是从默认路径
/var/lib/docker迁移,执行以下命令同步原有数据:sudo mkdir -p /opt/docker-data sudo rsync -aP /var/lib/docker/ /opt/docker-data/ sudo chown root:root /opt/docker-data - 重载配置重启Docker:
sudo systemctl daemon-reload sudo systemctl start docker
注意:执行
docker build、docker run等涉及大量文件读写的操作时,不要把项目文件放在/mnt/c/这类Windows挂载目录下,先把项目复制到WSL的ext4分区(比如/home/你的用户名/目录下)再操作,IO性能差距可达10~100倍。
2. 配置镜像加速解决Pull慢问题
在刚才编辑的/etc/docker/daemon.json中添加镜像源配置,替换为你可正常访问的Docker镜像加速地址即可,示例:
{ "data-root": "/opt/docker-data", "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] }
改完重启Docker服务,执行docker info查看Registry Mirrors字段确认配置生效。
3. 关闭WSL跨文件系统权限映射减少额外开销
编辑WSL配置文件(不存在则新建):
sudo nano /etc/wsl.conf
写入以下配置:
[automount] options = "metadata,umask=022,fmask=011" enabled = true mountFsTab = false
保存退出后,打开Windows的PowerShell执行wsl --shutdown关闭WSL,重新打开终端即可生效,该配置会减少跨盘符操作时大量不必要的文件元数据转换开销,进一步提升解包速度。
4. 确认使用WSL2版本
WSL1的系统调用兼容层对Docker的overlay2存储驱动支持极差,IO性能远低于WSL2:
- 在Windows PowerShell中执行以下命令查看WSL版本:
wsl -l -v - 如果Ubuntu 20.04对应的VERSION列显示为1,执行以下命令转换为WSL2:
转换前确保C盘有足够剩余空间(不小于WSL虚拟磁盘已占用容量)。wsl --set-version Ubuntu-20.04 2
日志中e0ede8e4b377: Extracting [==================================================>] 560B/560B长时间卡住的现象,是典型的Docker数据目录位于NTFS挂载分区、或使用WSL1版本的特征,完成第一步配置后该层解包耗时会降到毫秒级。
内容的提问来源于stack exchange,提问作者user630702

