WSLC 国内镜像源配置指南:解决 wslc pull 超时问题
前言
WSLC (WSL Container) 是微软在 WSL 中新增的容器功能,类似 Docker。但在国内使用时,会遇到一个棘手的问题:无法拉取镜像。
wslc pull alpine:latest
Get "https://registry-1.docker.io/v2/": context deadline exceeded
经过调研和测试,我发现 WSLC 当前版本不支持 registry mirror 配置,但有两种可行的解决方案。本文将详细介绍这两种方法。
问题分析
为什么 wslc pull 会超时?
WSLC 默认从 Docker Hub (registry-1.docker.io) 拉取镜像。由于网络限制,国内用户无法直接访问该地址,导致请求超时。
WSLC 支持镜像源配置吗?
不支持。 通过分析 WSL 源码(src/windows/common/WSLCUserSettings.cpp),确认 settings.yaml 仅支持以下配置项:
session:
cpuCount: default
memorySize: default
maxStorageSize: default
networkingMode: default
hostFileShareMode: default
dnsTunneling: default
defaultBindingAddress: default
portRelay: default
credentialStore: default
没有 registryMirrors、insecure-registries 等 Docker 风格的镜像源配置。
解决方案
方案一:使用完整镜像地址直接拉取(推荐)
这是最简单的方法,直接在 wslc pull 命令中指定国内镜像源的完整地址。
基本语法
wslc pull <镜像源地址>/library/<镜像名>:<标签>
实际示例
# DaoCloud(推荐,国内最大最稳定)
wslc pull docker.m.daocloud.io/library/alpine:latest
# 1Panel 提供
wslc pull docker.1panel.live/library/alpine:latest
# Hub Proxy
wslc pull hub.rat.dev/library/alpine:latest
验证
# 查看镜像列表
wslc images
# 运行测试
wslc run --rm docker.m.daocloud.io/library/alpine:latest echo "Hello!"
已验证可用的镜像源
| 镜像源地址 | 提供方 | 状态 |
|---|---|---|
docker.m.daocloud.io |
DaoCloud | ✅ 推荐 |
docker.1panel.live |
1Panel | ✅ 可用 |
hub.rat.dev |
Hub Proxy | ✅ 可用 |
hubp.de |
HubP | ✅ 可用 |
docker.1ms.run |
社区 | ✅ 可用 |
注意:镜像源可能随时失效,建议定期验证。
常用镜像地址对照表
| 原始镜像 | 完整拉取命令 |
|---|---|
alpine:latest |
wslc pull docker.m.daocloud.io/library/alpine:latest |
nginx:latest |
wslc pull docker.m.daocloud.io/library/nginx:latest |
redis:7-alpine |
wslc pull docker.m.daocloud.io/library/redis:7-alpine |
ubuntu:latest |
wslc pull docker.m.daocloud.io/library/ubuntu:latest |
mysql:8.0 |
wslc pull docker.m.daocloud.io/library/mysql:8.0 |
node:18-alpine |
wslc pull docker.m.daocloud.io/library/node:18-alpine |
python:3.11-slim |
wslc pull docker.m.daocloud.io/library/python:3.11-slim |
方案二:通过 Docker 导出再导入
如果已经在 Docker 中配置了镜像源,可以先用 Docker 拉取,导出为 tar 文件,再导入 WSLC。
步骤
# 1. 用 Docker 拉取镜像(Docker 已配置镜像源)
docker pull alpine:latest
# 2. 导出为 tar 文件
docker save alpine:latest -o "env:TEMP\alpine-latest.tar"
# 3. 导入到 WSLC
wslc load -i "env:TEMP\alpine-latest.tar"
# 4. 验证
wslc images
批量导入脚本
# wslc-import.ps1
param(
[Parameter(Mandatory=true)]
[string[]]Images
)
wslc = "C:\Program Files\WSL\wslc.exe"
foreach (image in Images) {
Write-Host "Processing:image"
# 导出
tarFile = "env:TEMP\(image -replace '[:/\\]', '_').tar"
docker save image -otarFile
# 导入
& wslc load -itarFile
# 清理
Remove-Item tarFile -Force
Write-Host "Done:image" -ForegroundColor Green
}
# 显示结果
& $wslc images
使用方法:
.\wslc-import.ps1 alpine:latest, redis:7-alpine, nginx:latest
两种方案对比
| 特性 | 方案一:直接拉取 | 方案二:Docker 导入 |
|---|---|---|
| 步骤数 | 1 步 | 3 步 |
| 依赖 | 仅需 WSLC | 需要 Docker |
| 速度 | 快 | 较慢(需导出/导入) |
| 灵活性 | 需记住镜像地址 | 可用 Docker 生态工具 |
| 推荐场景 | 日常使用 | 已有 Docker 环境 |
镜像地址格式说明
使用国内镜像源时,需要在原始镜像名前加上镜像源地址和 /library/ 前缀:
<镜像源地址>/library/<原始镜像名>:<标签>
例如:
alpine:latest→docker.m.daocloud.io/library/alpine:latestnginx:stable-alpine→docker.m.daocloud.io/library/nginx:stable-alpine
如果是第三方仓库(如
quay.io、ghcr.io),不需要/library/前缀:
quay.io/prometheus/prometheus→docker.m.daocloud.io/quay.io/prometheus/prometheus
Docker daemon.json 配置参考
如果同时使用 Docker,可以在 %USERPROFILE%\.docker\daemon.json 中配置镜像源:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://hub.rat.dev"
]
}
配置后重启 Docker Desktop 生效。
展望
WSLC 目前仍处于 Preview 阶段,希望微软能在后续版本中添加 registryMirrors 配置支持,就像 Docker 的 daemon.json 一样。我已经在 GitHub Issue 中提交了 Feature Request。
总结
- WSLC 当前不支持 registry mirror 配置,这是功能缺失
- 推荐方案:使用完整镜像地址直接拉取(
wslc pull docker.m.daocloud.io/library/xxx) - 备选方案:通过 Docker 导出再导入
- 推荐镜像源:DaoCloud (
docker.m.daocloud.io),国内最大最稳定
希望本文能帮助到同样遇到这个问题的朋友!
参考资料
来源:https://juejin.cn/post/7657021150954635273
作者:用户8350961085262