1、配置国内源
1.1 问题描述
在使用docker时,默认情况下会报超时,比如:
Error response from daemon: failed to resolve reference
或者
read: connection reset by peer
原因是需要从国外网络下载镜像;
而且从 2024 年 6 月起,大量国内公共镜像加速器相继停止服务;
因此,在使用docker下载镜像前,配置、测试国内源
1.2 处理方法
1)添加国内源
编辑 /etc/docker/daemon.json 文件,如果没有则创建;
向 registry-mirrors 字段中添加国内源地址;
常用的国内源如下:
- 轩辕镜像,https://docker.xuanyuan.me,适用于全平台,个人/NAS 首选
- DaoCloud,https://docker.m.daocloud.io 相对稳定
- 毫秒镜像,https://docker.1ms.run,速度较快
- 阿里云,https://<你的ID>.mirror.aliyuncs.com,需登录阿里云控制台获取专属地址
注意:部分云厂商的加速地址(如阿里云、腾讯云)可能限制在对应云平台的内网中使用
daemon.json 示例如下,适用于NVIDIA Orin系列平台
bash
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io"
],
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
},
"ipv6": false
}
2)重启docker来生效
sudo systemctl daemon-reload
sudo systemctl restart docker
3)测试国内源是否配置成功
bash
docker info | grep -A5 "Registry Mirrors"
Registry Mirrors:
https://docker.xuanyuan.me/
https://docker.m.daocloud.io/
https://docker.1ms.run/
4)如果还是报错,逐一测试国内源是否有效,例如
docker pull docker.m.daocloud.io/library/nginx:1.27-alpine
如果出现类似
failed to copy: read tcp 192.168.1.110:60160->172.67.135.145:443: read: connection reset by peer
问题,需要换一个源继续测试
成功会打印类似如下的日志
bash
Digest: sha256:65645c7bb6a0661892a8b03b89d0743208a18dd2f3f17a54ef4b76fb8e2f2a10
Status: Downloaded newer image for docker.m.daocloud.io/library/nginx:1.27-alpine
docker.m.daocloud.io/library/nginx:1.27-alpine
5)查看下载的镜像
docker images
bash
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
docker.m.daocloud.io/library/nginx:1.27-alpine 65645c7bb6a0 76.8MB 22.7MB
2、Cloudflare 问题
2.1 问题描述
如果报错 read tcp xxx 172.67.135.145:443: read: connection reset by peer
建议更换源、或者多试几次。下面分析和IP 172.67.x.x、104.21.x.x 相关的问题
2.2 Cloudflare 简介
Cloudflare 是美国一家全球互联网基础设施公司,核心产品是:CDN、DDoS 防护、DNS,全球几百个边缘节点,几千万网站都挂在它上面。
Cloudflare的工作原理是什么?
用户访问网站,先连接 Cloudflare 就近节点(CDN),如果有缓存,直接返回,如果没有缓存,Cloudflare 节点再去请求网站原始服务器。
Cloudflare的作用是什么?
很多网站不直接暴露自己真实服务器 IP,把流量交给 Cloudflare 的全球节点中转、缓存、防攻击。
- CDN 加速:静态文件缓存到全球各地节点,访问更快
- DDoS 防护:攻击流量先打到 CF 庞大的边缘网络,不会直接打垮源站
- 隐藏真实服务器 IP,增加安全性
很多国内公共 Docker 镜像加速器(比如前面配置的 docker.m.daocloud.io)前端都套了 Cloudflare CDN(为什么要套Cloudflare,不是为了加速吗?)
2.3 怎么判读是Cloudflare的IP
1)可以从官网上查看,https://www.cloudflare.com/ips/
IPv4
bash
173.245.48.0/20
103.21.244.0/22
103.22.200.0/22
103.31.4.0/22
141.101.64.0/18
108.162.192.0/18
190.93.240.0/20
188.114.96.0/20
197.234.240.0/22
198.41.128.0/17
162.158.0.0/15
104.16.0.0/13
104.24.0.0/14
172.64.0.0/13
131.0.72.0/22
IPv6
bash
2400:cb00::/32
2606:4700::/32
2803:f800::/32
2405:b500::/32
2405:8100::/32
2a06:98c0::/29
2c0f:f248::/32
2)使用命令查看,常用命令
curl ipconfig.io/json?ip=172.67.135.145
bash
{
"ip": "172.67.135.145",
"ip_decimal": 2890106769,
"country": "United States",
"country_iso": "US",
"country_eu": false,
"asn": "AS13335",
"asn_org": "Cloudflare, Inc.",
"user_agent": {
"product": "curl",
"version": "7.81.0",
"raw_value": "curl/7.81.0"
}
3、安装docker镜像
1)配置 docker-compose.yml
yaml
services:
nginx:
image: nginx:1.27-alpine
container_name: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./logs:/var/log/nginx
environment:
- TZ=Asia/Shanghai
2)下载镜像
docker compose up
3)失败处理
如果 docker compose up 下载失败;
可以尝试使用 docker pull 命令直接下载
docker pull docker.m.daocloud.io/library/nginx:1.27-alpine
下载成功后,修改 docker-compose.yml 中的 image 字段
yaml
services:
nginx:
image: docker.m.daocloud.io/library/nginx:1.27-alpine
container_name: nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./logs:/var/log/nginx
environment:
- TZ=Asia/Shanghai
然后在尝试使用 docker compose up
4、国内 Docker 加速器为什么关停
1)安全监管
容器镜像里面可以打包任意程序、脚本、工具,镜像内容很难实时全自动审计
2)消耗流量巨大
Docker 镜像体积巨大,镜像要持续同步 Docker Hub 海量仓库,同步消耗大量资源,带宽成本持续暴涨
3)Docker Hub 侧本身的访问限制
Docker 官方对匿名用户做拉取频率限流:匿名 IP 每 6 小时只能拉固定次数镜像。
4)云厂商商业策略调整
云厂商的免费公共镜像加速器,原本是引流福利:
目前只能在云服务器内网中使用,不对外开发;
总之,免费的使用越来越困难,建议使用合法、付费的。