WSLC 国内镜像源配置指南:解决 wslc pull 超时问题

1,123 阅读3分钟

前言

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.ioDaoCloud✅ 推荐
docker.1panel.live1Panel✅ 可用
hub.rat.devHub Proxy✅ 可用
hubp.deHubP✅ 可用
docker.1ms.run社区✅ 可用

注意:镜像源可能随时失效,建议定期验证。

常用镜像地址对照表

原始镜像完整拉取命令
alpine:latestwslc pull docker.m.daocloud.io/library/alpine:latest
nginx:latestwslc pull docker.m.daocloud.io/library/nginx:latest
redis:7-alpinewslc pull docker.m.daocloud.io/library/redis:7-alpine
ubuntu:latestwslc pull docker.m.daocloud.io/library/ubuntu:latest
mysql:8.0wslc pull docker.m.daocloud.io/library/mysql:8.0
node:18-alpinewslc pull docker.m.daocloud.io/library/node:18-alpine
python:3.11-slimwslc 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 -o $tarFile
    
    # 导入
    & $wslc load -i $tarFile
    
    # 清理
    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:latest
  • nginx: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。


总结

  1. WSLC 当前不支持 registry mirror 配置,这是功能缺失
  2. 推荐方案:使用完整镜像地址直接拉取(wslc pull docker.m.daocloud.io/library/xxx)
  3. 备选方案:通过 Docker 导出再导入
  4. 推荐镜像源:DaoCloud (docker.m.daocloud.io),国内最大最稳定

希望本文能帮助到同样遇到这个问题的朋友!


参考资料