从国内直接拉 Docker Hub 的镜像,常见的表现是速度只有几十 KB/s,或者干脆卡在 Retrying in 5 seconds 反复重试。解决办法是给 Docker 配一组镜像加速源—— 它们是 Docker Hub 的只读缓存,你 docker pull 时 Docker 先去这些地址找, 找不到才回源。


一、写入 daemon.json

/etc/docker/daemon.json 是 Docker 守护进程的配置文件,registry-mirrors 就是加速源列表。配多个是为了容错:某个源挂了会自动试下一个。

执行以下命令:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.1ms.run",
    "https://dytt.online",
    "https://docker-0.unsee.tech",
    "https://lispy.org",
    "https://docker.xiaogenban1993.com",
    "https://666860.xyz",
    "https://hub.rat.dev",
    "https://docker.m.daocloud.io",
    "https://demo.52013120.xyz",
    "https://proxy.vvvv.ee"
  ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

这些镜像源来自 GitHub 项目 dongyubin/DockerHub, 那里有一份持续更新的可用列表。

两条命令分别在做什么:

命令 作用 不执行会怎样
systemctl daemon-reload 让 systemd 重新读取单元文件 改的是 Docker 自己的配置时其实可以不做,但改过 docker.service 就必须做
systemctl restart docker 重启 Docker 守护进程 daemon.json 不会生效——它只在守护进程启动时读一次

重启 Docker 会停掉所有没有配置重启策略的容器。生产机器上先确认容器都带了 --restart=always,或者挑个没人用的时间做。


二、确认真的生效了

改完必须验一下,不然你不知道是加速源没生效还是源本身太慢:

docker info | grep -A 10 "Registry Mirrors"

能看到刚才那一串地址就说明配置读进去了。再拉个小镜像实测:

time docker pull hello-world

三、几个常见问题

JSON 格式错误会让 Docker 起不来。 daemon.json 里多一个逗号、少一个引号, Docker 会直接启动失败,而且 systemctl status docker 的提示不太明显。 改完先验一下格式:

python3 -m json.tool /etc/docker/daemon.json

这些是第三方源,会失效。 名单里的地址由个人或小团队维护,随时可能关停或限速。 拉取变慢时先回来换一批,不用怀疑是自己配错了。

加速源只对 Docker Hub 有效。 拉 ghcr.io、gcr.io、quay.io 上的镜像 不走这个列表,那些要么配各自的镜像站,要么走代理。

如果要走代理,配的不是 daemon.json,而是 Docker 服务的环境变量:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1"
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

这一处改的是 systemd 单元,所以 daemon-reload 是必须的。关于 systemd 单元 文件的写法,可以看 systemd 单元配置实战。