1789 字
9 分钟
国内使用 Docker 太慢?Docker Desktop 与 Linux 镜像源配置教程

在国内使用 Docker 时,最常遇到的问题不是命令不会写,而是镜像拉不下来:docker pull 长时间没有进度,最后出现超时、连接重置,或者访问 Docker Hub 失败。

一种常见解决办法是给 Docker 配置国内镜像加速地址。本文以 https://docker.1ms.run 为例,分别介绍 Docker DesktopLinux Docker Engine 的配置方法。

使用前说明

docker.1ms.run 是第三方镜像服务,并非 Docker 官方服务。服务的可用性、免费额度和使用规则可能变化,请以镜像站当前说明为准。生产环境还应考虑镜像可信度、供应链安全和内部缓存方案。

镜像加速的原理#

正常情况下,执行下面的命令会从 Docker Hub 拉取镜像:

Terminal window
docker pull nginx:latest

配置 registry-mirrors 后,Docker 守护进程会优先尝试指定的镜像站。日常命令通常不用改变,仍然可以继续执行 docker pull nginx:latest

本文使用的配置内容是:

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

如果你的 Docker 已有其他配置,需要把 registry-mirrors 合并进去,不能直接用上面的内容覆盖整个文件。

一、Docker Desktop 配置方法#

这一方法适用于 Windows 和 macOS 上的 Docker Desktop,Linux 版 Docker Desktop 的设置界面也基本相同。

1. 打开 Docker Engine 设置#

启动 Docker Desktop,然后依次进入:

Settings → Docker Engine

右侧会显示 Docker Engine 当前使用的 JSON 配置。默认内容可能不止一项,以你电脑上的实际内容为准。

2. 添加镜像地址#

如果当前配置接近下面这样:

{
"features": {
"containerd-snapshotter": true
}
}

可以在顶层加入 registry-mirrors

{
"features": {
"containerd-snapshotter": true
},
"registry-mirrors": [
"https://docker.1ms.run"
]
}

注意 JSON 格式:相邻字段之间要有英文逗号,最后一个字段后面不要多写逗号。

3. 保存并重启#

点击 Apply & restart。Docker Desktop 会校验配置并重启 Docker Engine。

重启完成后,在 PowerShell、Windows Terminal 或 macOS 终端中执行:

Terminal window
docker info

在输出中找到 Registry Mirrors。如果能看到以下地址,说明配置已经被 Docker 读取:

Registry Mirrors:
https://docker.1ms.run/

然后实际拉取一个小镜像测试:

Terminal window
docker pull hello-world
docker run --rm hello-world

Docker Desktop 配置失败怎么恢复#

如果点击保存后 Docker 无法启动,重新进入 Settings → Docker Engine,删除刚才加入的 registry-mirrors 字段,恢复原来的 JSON 后再次应用。

最常见的原因是 JSON 少了逗号、多了逗号,或者误删了原有的大括号。修改前可以先把原配置复制到记事本中备份。

二、Linux Docker Engine 配置方法#

普通 Linux Docker Engine 默认读取:

/etc/docker/daemon.json

如果该文件不存在,可以创建;如果已经存在,需要在原配置中合并字段。

1. 备份已有配置#

先查看文件是否存在:

Terminal window
sudo ls -l /etc/docker/daemon.json

如果存在,先备份:

Terminal window
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak

2. 编辑 daemon.json#

创建配置目录并使用编辑器打开文件:

Terminal window
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json

新文件可以直接填写:

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

如果原文件中已经设置了日志、存储目录或其他参数,应保留这些字段。例如:

{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"registry-mirrors": [
"https://docker.1ms.run"
]
}

在 nano 中按 Ctrl+O 保存,按回车确认文件名,再按 Ctrl+X 退出。

3. 重启 Docker#

对于使用 systemd 的 Ubuntu、Debian、CentOS、Rocky Linux 等常见发行版,执行:

Terminal window
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl status docker --no-pager

如果状态显示 active (running),说明 Docker 已正常启动。

4. 验证配置#

执行:

Terminal window
docker info | sed -n '/Registry Mirrors/,+3p'

正常情况下会显示:

Registry Mirrors:
https://docker.1ms.run/

再拉取镜像测试:

Terminal window
docker pull hello-world
docker run --rm hello-world

三、Linux rootless Docker 的区别#

如果你安装的是 rootless Docker,即 Docker 守护进程以普通用户身份运行,配置文件通常不是 /etc/docker/daemon.json,而是:

~/.config/docker/daemon.json

配置内容相同:

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

然后重启用户级 Docker 服务:

Terminal window
systemctl --user daemon-reload
systemctl --user restart docker

如果设置了 XDG_CONFIG_HOME,实际路径应为 $XDG_CONFIG_HOME/docker/daemon.json

四、不修改全局配置,直接替换镜像地址#

如果只是临时下载一个镜像,也可以在镜像名称前直接加镜像站域名:

Terminal window
docker pull docker.1ms.run/nginx:latest

compose.yaml 中也可以显式填写:

services:
web:
image: docker.1ms.run/nginx:latest

这种方式简单直接,但镜像名称会变成带有第三方仓库域名的完整名称。以后切换镜像站时,还要修改命令或 Compose 文件。

五、GHCR、Kubernetes 等镜像怎么处理#

registry-mirrors 主要用于 Docker Hub,不能默认认为它会透明加速所有仓库。

例如,原镜像来自 GitHub Container Registry:

Terminal window
docker pull ghcr.io/linuxserver/webtop:latest

按照毫秒镜像当前说明,需要显式替换为对应通道:

Terminal window
docker pull ghcr.1ms.run/linuxserver/webtop:latest

registry.k8s.iogcr.ioquay.io 等也各有不同的替换域名和权限要求,其中部分通道可能需要付费。使用前应查看镜像站最新支持列表,不要简单地把所有域名都替换成 docker.1ms.run

六、常见问题排查#

docker info 中没有 Registry Mirrors#

先确认修改的是当前 Docker 实例所使用的配置:

  • Docker Desktop 应在 Settings → Docker Engine 中修改;
  • 普通 Linux Docker Engine 通常使用 /etc/docker/daemon.json
  • rootless Docker 通常使用 ~/.config/docker/daemon.json
  • 修改后需要重启对应的 Docker Engine。

Docker 重启失败#

查看日志:

Terminal window
sudo journalctl -u docker -n 100 --no-pager

如果提示无法解析配置,通常是 JSON 格式错误。可以恢复备份:

Terminal window
sudo cp /etc/docker/daemon.json.bak /etc/docker/daemon.json
sudo systemctl restart docker

配置成功但拉取仍然很慢#

可能原因包括:

  • 镜像站暂时不可用、拥堵或触发额度限制;
  • DNS 解析异常;
  • 要拉取的镜像并不在 Docker Hub;
  • 镜像包含较大的层,首次回源仍需等待;
  • 公司、校园或云服务器网络策略限制了相关域名。

可以先测试镜像站是否能够访问,再查看 Docker 日志中的实际错误。不要随意加入 insecure-registries,本文示例使用 HTTPS,不需要关闭 TLS 校验。

docker pull 和 docker compose 是否都生效#

只要 Compose 使用的是同一个 Docker Engine,针对 Docker Hub 的 registry-mirrors 配置通常会同时作用于 docker pulldocker compose pull。如果 Compose 文件已经写了其他仓库的完整域名,则仍会访问那个仓库。

七、如何删除镜像源#

不再使用时,从 Docker Engine JSON 中删除:

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

注意同时处理相邻字段的逗号,然后重启 Docker。

Linux 用户也可以恢复之前的备份:

Terminal window
sudo cp /etc/docker/daemon.json.bak /etc/docker/daemon.json
sudo systemctl restart docker

总结#

如果你使用 Docker Desktop,进入 Settings → Docker Engine 添加 registry-mirrors;如果使用普通 Linux Docker Engine,则编辑 /etc/docker/daemon.json 并重启 Docker。

配置后不要只看命令是否执行成功,最好同时使用 docker info 检查镜像源是否被读取,再拉取 hello-world 做实际测试。镜像站是解决网络问题的实用工具,但第三方服务状态可能变化,重要环境应保留恢复方案,并优先考虑可信的企业镜像仓库或自建缓存。

参考资料#