在国内使用Docker时,直接访问 registry-1.docker.io 拉取镜像时通常会因为网络原因导致超时或连接失败。
这是一个典型的 Docker Hub 网络连接超时 问题。由于你的服务器在阿里云(国内),直接访问 registry-1.docker.io 通常会因为网络原因导致超时或连接失败。
核心解决方案:配置阿里云镜像加速器
如果阿里云服务器,最快的解决办法是配置阿里云提供的免费镜像加速器。
1. 获取你的专属加速器地址
a. 登录 阿里云容器镜像服务控制台。
b. 在左侧菜单选择 “镜像加速器”。
c. 你会看到一个专属的加速器地址,格式类似:https://xxxxxx.mirror.aliyuncs.com。
2. 配置 Docker
在你的 Ubuntu 16.04 服务器上执行以下命令:
# 1. 创建或修改 daemon.json 配置文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
# 注意:请将上面的地址替换为你在第一步控制台里获取的真实地址
# 2. 重载配置并重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
3. 再次尝试启动
配置完成后,重新运行你的命令即可:
docker-compose up -d
最终解决方案
有时候,即使配置了加速器也会拉取镜像超时。这种情况就比较棘手,就是阿里云的镜像加速器里没有缓存这个镜像。当 Docker 发现阿里云镜像没有对应的镜像时,它就会尝试直接连接官方的 registry-1.docker.io,导致网络请求超时。
这种情况,我们可以试试以下方法。
1.离线镜像导入
针对单台且无法连接外网的服务器,可在有外网访问能力的设备上提前拉取镜像,导出为压缩包,再导入到目标服务器。
1.1 拉取目标镜像
在可以正常拉取镜像的设备上,拉取下目标镜像,拉取时务必注明目标服务器的CPU架构
# 有外网的设备:拉取镜像
docker pull 镜像名:版本标签
# 示例:拉取nginx最新版
docker pull nginx:latest
# 强制指定架构拉取(跨架构必用,比如 Mac M系列给 amd64 服务器准备镜像)
docker pull --platform=linux/amd64 镜像名:版本标签
# 示例:指定amd64架构拉取mysql 8.0
docker pull --platform=linux/amd64 mysql:8.0
1.2 将镜像导出为完整 tar 包
核心命令是使用 docker save,必须是这个命令。不能使用 docker export,该命令只是导出运行中的容器的文件系统,会丢失镜像的历史层、启动命令、环境变量、端口配置等核心信息;而docker save则是完整导出镜像所有的数据
# 基础导出命令:-o 指定输出的tar包文件名,结尾跟要导出的镜像名:标签
docker save -o 自定义文件名.tar 镜像名:版本标签
# 示例1:导出单镜像
docker save -o nginx_latest.tar nginx:latest
# 示例2:一次性导出多个镜像到同一个tar包(批量迁移更方便)
docker save -o my_service_images.tar nginx:latest mysql:8.0 redis:7-alpine
# 进阶:大镜像压缩导出(节省传输体积,传输时间减半)
docker save 镜像名:版本标签 | gzip > 自定义文件名.tar.gz
1.3 将 tar 包上传到目标服务器
mac 直接使用 scp命令,windows 则要借助文件传输工具。
# scp 本地tar包路径 服务器用户名@服务器IP:服务器存放路径
# 示例:把本地的nginx_latest.tar传到服务器的/root目录下
scp ./nginx_latest.tar root@192.168.1.100:/root/
2.国内镜像同步站拉取
如果服务器能访问外网,那么可以直接到国内一些镜像同步站拉取镜像。这里强烈推荐使用https://docker.aityp.com/
2.1 在服务器拉取镜像
docker pull 镜像名:版本标签
#示例 格式为:仓库地址/命名空间/镜像名:版本标签
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v2.3.2
2.2 修改镜像名
这样拉取的镜像,由于镜像名包含了仓库地址、命名空间所以显得有点长,因此才需要修改一下名称
docker tag 原镜像名:原标签 新镜像名:新标签
#示例
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v2.3.2 nacos/nacos-server:v2.3.2
docker tag只是创建新引用,原镜像依然存在,可通过docker images查看两个镜像的 ID 完全一致.
2.3 删除旧名
若要彻底 “替换” 名字,需先 docker tag 创建新名,再用 docker rmi 删除镜像旧名
# 按镜像名 + 标签删除 语法
docker rmi 镜像名:标签
# 示例:删除nginx最新版镜像
docker rmi nginx:latest
# 示例:删除指定版本的mysql镜像
docker rmi mysql:8.0
#按镜像ID删除 语法
docker rmi 镜像ID
# 示例:删除ID为2d3a9f8e7d6c的镜像
docker rmi 2d3a9f8e7d6c
3.镜像仓库中转同步
如果你有多台服务器、需要长期复用镜像、或者团队共享使用,反复传 tar 包效率太低,推荐用「国内私有镜像仓库中转」的方式,本质是手动把镜像上传到国内的仓库,所有服务器直接从国内仓库拉取,永久解决超时问题。
完整操作步骤
1.准备国内私有镜像仓库:推荐阿里云容器镜像服务 ACR(个人版免费)、腾讯云 TCR 个人版,国内访问无延迟,无需自建服务。
2.【可正常访问外网的设备】拉取目标镜像(和方案一第一步完全一致)。
3.给镜像打国内仓库的专属标签,格式为:仓库地址/命名空间/镜像名:版本标签
# 示例:阿里云仓库的标签命令
docker tag nginx:latest xxx-registry.cn-hangzhou.cr.aliyuncs.com/你的命名空间/nginx:latest
4.登录你的私有仓库,执行登录命令后输入账号密码(阿里云为容器服务的独立登录账号和密码)
docker login 你的仓库地址
# 示例:登录阿里云仓库
docker login xxx-registry.cn-hangzhou.cr.aliyuncs.com
5.把镜像推送到国内私有仓库
docker push 你刚才打的完整镜像标签
# 示例
docker push xxx-registry.cn-hangzhou.cr.aliyuncs.com/你的命名空间/nginx:latest
6.【目标服务器】直接从国内仓库拉取镜像,全程国内网络,无超时问题
docker pull xxx-registry.cn-hangzhou.cr.aliyuncs.com/你的命名空间/nginx:latest