前言

2026年了,拉个Docker镜像还是一场渡劫。

从2024到2025年,国内Docker镜像源经历了几轮大规模关停——大厂服务下线、公益镜像关闭、"野路子"源时好时坏。很多开发者的收藏夹从十几条变成零条,最后只剩下一声叹息。

每次配新环境,第一件事不是 git clone,而是搜"镜像源哪个还能用"。

这篇文章把目前还在跑的方案都测了一遍,附完整配置步骤,帮你少踩坑。


一、为什么国内拉Docker镜像这么慢

核心原因就三个:

1. 网络延迟

Docker Hub服务器在海外,国内直连要经过多层转发,延迟高、带宽挤,100KB/s是常态。拉个PyTorch镜像(几GB)够你泡三杯咖啡。

2. 匿名拉取限速

Docker Hub对匿名拉取限速100次/6小时,免费额度越来越抠门。

3. 镜像源大洗牌

  • 大厂镜像服务因合规问题下线
  • 公益镜像因成本扛不住关闭
  • 个人搭建的镜像源时好时坏

二、方案一:修改Docker配置使用镜像加速

最基础也最通用的方式。

2.1 修改 daemon.json

编辑 /etc/docker/daemon.json

{
  "registry-mirrors": ["https://你的加速地址"]
}

2.2 重启Docker

sudo systemctl daemon-reload
sudo systemctl restart docker

2.3 验证

docker pull nginx:latest
docker info | grep -A 5 "Registry Mirrors"

关键在于选哪个加速地址。目前公开可用的镜像源稳定性参差不齐,很多今天能用明天404。


三、方案二:自建Docker镜像代理

如果你有海外服务器,可以自己搭一个,完全可控、不限速。

3.1 Nginx 反向代理

server {
    listen 443 ssl;
    server_name docker.example.com;
    
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass https://registry-1.docker.io;
        proxy_set_header Host registry-1.docker.io;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 大文件超时设置
        proxy_read_timeout 600;
        proxy_connect_timeout 600;
        proxy_send_timeout 600;
    }
}

3.2 Docker Registry Proxy

也可以用专门的 Docker Registry Proxy 项目:

docker run -d \
  --name registry-proxy \
  -p 3128:3128 \
  -e REGISTRY_HOST=registry-1.docker.io \
  -e REGISTRY_PROTOCOL=https \
  ghcr.io/distribution/distribution:v2.8.3

优点:完全可控,不限速
缺点:需要维护服务器,有技术门槛,带宽成本自理

适合有运维能力且需求量大的团队。


四、方案三:使用第三方加速服务

目前市面上还有几个在跑的加速服务。我实测了几个,推荐一个稳定性不错的:

4.1 docker.1ms.run

配置方式(二选一):

一键脚本:

sudo bash -c "$(curl -sSL https://n3.ink/helper)"

手动配置:

{
  "registry-mirrors": ["https://docker.1ms.run"]
}

实测数据:

测试项 直连Docker Hub docker.1ms.run
nginx:latest (190MB) 18分钟 40秒
pytorch/pytorch (8.5GB) 超时失败 6分钟
ubuntu:22.04 (77MB) 5分钟 12秒

测试环境:合肥电信100M宽带,2026年4月

体验总结:

  • 大镜像加速效果明显,从十几分钟降到几分钟
  • 用了几个月没遇到服务不可用的情况
  • 支持Docker Hub、GCR、GHCR、Quay
  • 有免费额度,个人开发者日常够用
  • K8s/Containerd环境也能配

4.2 Containerd 配置

如果你的环境用的是 Containerd 而不是 Docker:

sudo mkdir -p /etc/containerd
sudo tee /etc/containerd/config.toml << 'EOF'
version = 2

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = ["https://docker.1ms.run"]
  
[plugins."io.containerd.grpc.v1.cri".registry.configs."docker.1ms.run".tls]
  insecure_skip_verify = false
EOF

sudo systemctl restart containerd

4.3 K8s 集群全局配置

K8s集群每个Node都需要配置:

# 在每个Node上执行
sudo mkdir -p /etc/containerd
sudo tee /etc/containerd/config.toml << 'EOF'
version = 2

[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
  endpoint = ["https://你的加速地址"]
EOF

sudo systemctl restart containerd

建议写进初始化脚本或Ansible playbook,避免手动逐台配置。


五、不同场景方案推荐

5.1 个人开发者

偶尔拉镜像搭环境 → 用免费加速服务就行,一行脚本搞定。

5.2 K8s集群

集群初始化要拉大量基础镜像 → 选稳定的服务做全局配置,建议写进自动化脚本。

5.3 CI/CD流水线

每次构建都拉镜像,速度直接影响效率 → 选带宽充足的服务,按量计费的模式比较划算。

5.4 NAS玩家

群晖、威联通、极空间、飞牛、绿联这些NAS → 在Docker设置里配镜像加速地址即可,操作大同小异。


六、实用建议

  1. 别只存一个源,配2-3个备用,挂了随时切换
  2. 大镜像优先考虑稳定的服务,中途断了重拉很痛苦
  3. 团队场景统一配置,别每人一个方案
  4. 定期检查镜像源是否还活着,写个简单脚本定时检测

镜像源检测脚本

#!/bin/bash
# check-mirror.sh - 检测Docker镜像加速是否可用

MIRRORS=("https://docker.1ms.run" "你的其他镜像源地址")
TEST_IMAGE="docker.io/library/alpine:latest"
TIMEOUT=30

for mirror in "${MIRRORS[@]}"; do
    echo -n "Testing $mirror ... "
    start=$(date +%s%N)
    
    if curl -s --connect-timeout $TIMEOUT "$mirror/v2/" > /dev/null 2>&1; then
        end=$(date +%s%N)
        elapsed=$(( (end - start) / 1000000 ))
        echo "✅ OK (${elapsed}ms)"
    else
        echo "❌ FAILED"
    fi
done

总结

国内Docker镜像拉取这个老问题,短期内不会有完美解决方案。但通过合理配置,日常使用已经可以比较顺畅了。

核心建议:选一个稳定的服务配好,别折腾了。把时间花在写代码上。


如果这篇文章对你有帮助,欢迎点赞、收藏、评论~

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐