从国内直接拉 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 单元配置实战。