“兄弟们,最近搞Docker是不是感觉特别‘酸爽’?docker pull 敲下去,转圈圈转到天荒地老,最后蹦出个 timeout 或者 connection refused... 懂的都懂!🤯 尤其是2024年5月以来,好多之前贼好用的国内镜像加速站点,说关就关,搞得咱们NAS都玩不下去了,部署项目对着免费教程都直接卡壳,瞬间血压飙升!😤

别问我为啥知道,说多了都是泪!为了能顺利用上Docker,我这两天真是把全网翻了个底朝天,挨个测试各种号称‘还能用’的镜像源。踩过坑,也找到了宝!这份攻略,就是把我亲测目前(从2024年6月起)在国内真正可用、速度靠谱的Docker镜像加速地址,以及遇到拉取失败时的几种核心解决办法,都给你整理好了。

目标就一个:帮你省下无谓的折腾时间,快速恢复生产力! 咱不整虚的,直接上干货!👇”

故障现象

  • 继2023年Docker Hub被封锁后,各大NAS的注册表均出现问题,例如群晖的Docker套件注册表无法连接(更新至DSM7.2版本后恢复)。

  • 而在今年2024年6月初(约2024.06.06),NAS中最重要的工具Docker又面临无法使用的问题。

  • 常用镜像站:阿里云、科大、南大、上交等,全部挂掉。

  • 执行docker pull命令拉取docker镜像时无反应,一直在循环尝试。

  • 出现下述错误

猜测原因

  • 下面的说法来源于网络

  • 2024.06.06,上海交大的Docker Hub镜像加速器宣布因为监管要求被下架。

  • index服务器被DNS污染,导致无法拉取镜像。

  • 做好全面脱钩的准备

  • 自主知识产权的国产Docker将会横空出世

  • 临时性管控(过段时间就恢复)

最新解决方法

再次提醒!多种方法自行尝试,总有一款适合你,亲测可行!

镜像地址从旧到新依次尝试,群晖注册表镜像URL在WEB页面最多可添加10个,其他NAS系统或显示为镜像代理地址、镜像加速地址,自行灵活应变!

镜像监控服务

  • 更新的镜像众多,无法确定以下镜像地址当前时间是否可用🤡,因此决定做一个镜像地址状态监控服务。

  • Docker镜像地址使用方法仍然按照本篇教程,在下面的监控页面选几个状态不错的地址即可。

  • 🤖🤖🤖Docker镜像地址状态监控,点击跳转。🤖🤖🤖

  • 👆👆👆-------------------------------------------👆👆👆

添加Docker镜像加速地址(飞牛fnOS)

  1. 演示以飞牛NAS系统上修改为例(其他系统自行探索方法)

  2. 打开飞牛的Docker,先关闭你运行的比较重要的Docker容器。

  3. 点击Docker>镜像仓库>设置>加速源设置。

  4. 点击添加多个可用的镜像地址之后,调整排序,然后点击保存并重启Docker。

增加Docker镜像注册表地址(群晖DSM7.2)

  1. 演示以群晖NAS系统上修改为例(其他系统自行探索方法)

  2. 打开群晖的Container Manager(Docker)套件,点击注册表--设置--Docker Hub(v1)--编辑。

  3. 勾选启用注册表镜像,新增下面两个地址,然后点击应用。

  4. 默认的注册表选择使用Docker Hub(v1),然后再拉取镜像即可。

增加Docker镜像注册表地址(群晖DSM7.1)

  1. 演示以群晖NAS系统上修改为例(其他系统自行探索方法)

  2. 打开群晖的Container Manager(Docker)套件,点击注册表--设置。

  3. 点击Docker Hub的存储库,然后点击编辑。

  4. 点击新增,添加下面两个地址,然后点击应用。

    https://docker.shootchat.top
    
    https://do.nark.eu.org
  5. 看到跳出的提示即可(群晖DSM7.2版本的存储库可选择Docker Hub(v1)

  6. 然后打开群晖的SSH功能,使用终端软件进行连接,并切换到root状态下。
    DSM open SSH.png

  7. 正常拉取镜像即可

    未修改前
    root@nas:# docker pull mysql:8.0
    8.0: Pulling from library/mysql
    07bc88e18c4a: Already exists
    2546f0005eef: Pulling fs layer
    1021dda8eecf: Pulling fs layer
    1bb57662dd7f: Pulling fs layer
    7fb14d8034cd: Waiting
    73124c42ecbe: Waiting
    74830c23cea0: Waiting
    0139fa284505: Waiting
    5165942f42d6: Waiting
    2915d634a344: Waiting
    9a1f1e1ee309: Waiting
    
    修改后
    root@nas:# docker pull mysql:8.0
    8.0: Pulling from library/mysql
    07bc88e18c4a: Already exists
    2546f0005eef: Pull complete
    1021dda8eecf: Pull complete
    1bb57662dd7f: Pull complete
    7fb14d8034cd: Pull complete
    73124c42ecbe: Pull complete
    74830c23cea0: Pull complete
    0139fa284505: Pull complete
    5165942f42d6: Pull complete
    2915d634a344: Pull complete
    9a1f1e1ee309: Pull complete
    Digest: sha256:7cf8a10b3c17273a47c5cd876cdb790c551012b40b36909b8ca0d9ab5721ed2c
    Status: Downloaded newer image for mysql:8.0
    docker.io/library/mysql:8.0
    root@nas:#
    

历史教程(部分可用)

再次提醒!多种方法自行尝试,总有一款适合你,亲测可行!

挂梯子

  • 给自己的NAS/其他系统挂梯子

  • 自行查找方法,敏感内容不在博客展示。

Linux系统手动修改Docker镜像地址

  1. 修改的前提是Linux系统已经安装了Docker,并且正常运行。

  2. 演示是在Debian系统上演示

  3. 使用终端软件连接Linux系统,并切换到root状态下。

  4. 修改/etc/docker/daemon.json文件

    vim /etc/docker/daemon.json
  5. 按字母 i 键进入编辑模式,修改daemon.json文件,改为如下镜像地址,按Esc键退出编辑模式,输入 :wq 保存并退出。
    (镜像地址自行添加/修改,灵活动脑思考。)

    {
     "registry-mirrors": ["https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"]
    }
  6. 重新加载配置文件

    systemctl daemon-reload
  7. 重新启动Docker

    systemctl restart docker
  8. 重新执行命令拉取镜像,可以看到恢复正常。
    (Docker被墙的情况下,拉取镜像会多等一会,非卡死。)

    root@hcss-ecs-4063:/etc/docker# docker pull mysql:8.0
    8.0: Pulling from library/mysql
    2c0a233485c3: Pull complete
    b746eccf8a0b: Pull complete
    570d30cf82c5: Pull complete
    c7d84c48f09d: Pull complete
    e9ecf1ccdd2a: Pull complete
    6331406986f7: Pull complete
    f93598758d10: Pull complete
    6c136cb242f2: Pull complete
    d255d476cd34: Pull complete
    dbfe60d9fe24: Pull complete
    9cb9659be67b: Pull complete
    Digest: sha256:d58ac93387f644e4e040c636b8f50494e78e5afc27ca0a87348b2f577da2b7ff
    Status: Downloaded newer image for mysql:8.0
    docker.io/library/mysql:8.0
    root@hcss-ecs-4063:/etc/docker#
  9. 启动Docker并设置Docker开机自启(扩展命令,非必需执行。)

    # 启动Docker服务
    sudo systemctl start docker
    
    # 设置Docker服务开机自启
    sudo systemctl enable docker

手动导入已有镜像文件

  • 自行获取/微信S20306找我需要使用的docker镜像,然后导入到NAS系统内(大部分NAS系统直接WEB页面导入)。

  • 例如导入一个存放在NAS文件夹内的docker镜像文件(纯命令行操作导入)

  • 进入存放镜像文件的文件夹

    #进入你实际存放文件的文件夹,这只是个演示路径!
    
    cd /volume1/docker
  • 执行命令,导入docker镜像。
    (此命令会按照你docker镜像文件的原格式生成镜像名和版本)

    #格式为 docker load -i "docker镜像文件名"
    
    docker load -i "jellyfin-jellyfin(10-9-2).syno.tar"
  • 然后查看本地docker镜像列表

    docker images

docker代理

  1. 访问下面的网站

    https://dockerproxy.com/

  2. 拉到底部,将你需要拉取的docker镜像名和版本粘贴到里面。
    然后点击获取命令

  3. 然后依次在NAS上使用SSH终端,执行这三个命令。

  4. 上面的全部做完后,就可以正常的使用docker clidocker-compose创建容器了。

  5. 如果有多个docker镜像需要使用,就重复前面的步骤,换成需要的docker镜像名和版本。

GitHub开源docker镜像加速项目

  1. 访问此项目

    https://github.com/DaoCloud/public-image-mirror
  2. 与上面是同样的方法,使用代理名称拉取后再改回去。

  3. 例如拉取Docker Hub仓库的jellyfin/jellyfin:10.9.2版本docker镜像

    #将jellyfin/jellyfin:10.9.2换成你需要的镜像名和版本
    
    docker pull m.daocloud.io/docker.io/jellyfin/jellyfin:10.9.2
  4. 重命名docker镜像

    #格式为 docker tag 代理镜像名:版本 原始镜像名:版本
    
    docker tag m.daocloud.io/docker.io/jellyfin/jellyfin:10.9.2 jellyfin/jellyfin:10.9.2
  5. 删除代理的镜像

    #格式为 docker rmi 代理镜像名:版本
    
    docker rmi m.daocloud.io/docker.io/jellyfin/jellyfin:10.9.2

Windows端Linux子系统导出镜像

  1. 常规的Clash代理并不一定可以帮助你docker pull下来镜像,给各个系统挂梯子也麻烦。
    那就直接给Windows挂梯子,教程最多,也最简单,调试也方便。
    演示将在Windows端的Linux子系统(Ubuntu2404)上进行拉取镜像并导出镜像文件。

  2. 给你的Windows系统挂梯子(自行解决)

  3. 进入Linux子系统,切换到root后正常的docker pull下来你所需的镜像。

    #演示拉取jellyfin官方的10.9.2版本
    
    docker pull jellyfin/jellyfin:10.9.2
  4. 查看镜像列表

    docker images
  5. 导出docker镜像
    (演示以群晖NAS系统上导出的镜像命名格式为例)

    #格式为 docker save 原始镜像名和版本 -o “镜像方-镜像名(版本).syno.tar"
    #需要注意的是前的镜像名是/ 后面的镜像名将/换成-,镜像版本换成-符号代理.符号,并以”“符号圈住后面的镜像文件,
    #左为原始镜像名,右为需要保存的镜像文件名。
    
    docker save jellyfin/jellyfin:10.9.2 -o "jellyfin-jellyfin(10-9-2).syno.tar"
  6. Linux系统上导出的镜像默认保存位置是在/root路径下

    #进入/root路径
    
    cd /root
  7. 查看当前文件夹内的文件

    ls
  8. 带有tag标签的docker镜像文件是包含"符号的

    root@localhost:~# ls
    'jellyfin-jellyfin(10-9-2).syno.tar'   snap
    root@localhost:~#
  9. 将导出的镜像移动到Windows系统上指定的文件夹下

    #将当前目录下的'jellyfin-jellyfin(10-9-2).syno.tar'文件移动到Windows系统C盘的默认下载文件夹下
    #换成你自己实际的文件夹路径,Windows文件夹路径在/mnt/c路径下。
    
    
    #格式为mv docker镜像文件 移动到指定的文件夹路径
    
    mv 'jellyfin-jellyfin(10-9-2).syno.tar' /mnt/c/Users/S20306/Downloads/
  10. 然后你就获取了一个带有TAG标签的docker镜像,可以直接导入到群晖NAS上。
    打开群晖的Docker套件--映像--操作--导入--从文件添加--从本地设备

  11. 如果是其他NAS/Linux系统,可以将文件放到文件夹内,然后进入存放镜像的文件夹路径下,执行下面的命令导入docker镜像。

    #格式 docker load < docker镜像文件
    
    docker load <  'jellyfin-jellyfin(10-9-2).syno.tar'
    
    #完整实例
    root@localhost:~# docker load <  'jellyfin-jellyfin(10-9-2).syno.tar'
    cf8a3233dc27: Loading layer [==================================================>]  2.048kB/2.048kB
    e85f146498c1: Loading layer [==================================================>]  156.4MB/156.4MB
    87ffad5c15db: Loading layer [==================================================>]  57.47MB/57.47MB
    Loaded image: jellyfin/jellyfin:10.9.2
  12. 查看docker镜像列表

    docker images

项目地址

文末

👇👇👇