Docker 拉取镜像超时问题

在国内使用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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容