【Linux】解决Docker-Compose拉取Jenkins时失败问题。

一、问题现象

在本地虚拟机部署Jenkins时,执行docker\-compose up后,Docker守护进程无法连接到官方镜像仓库

二、排查

1. 查看DNS

复制代码
vi /etc/resolv.conf

打开文件,发现内容为空,无任何DNS配置,只有一行这个

初步判断是可能是因为

该文件为空 → 系统无可用DNS服务器 → 无法解析Docker官方仓库域名(registry-1.docker.io) → 拉取镜像失败。

补充:一般来说系统通过NetworkManager管理网络,默认依赖DHCP自动获取DNS,此次失败是因为DHCP分配DNS失败,导致NetworkManager生成了空的resolv.conf文件。

三、解决流程

第一步:临时配置DNS

临时配置DNS,步骤如下:

  1. 编辑resolv.conf文件,进入编辑模式:
bash 复制代码
  vi /etc/resolv.conf
  1. i进入插入模式,粘贴国内稳定公共DNS(推荐阿里+114备用):
bash 复制代码
 nameserver 223\.5\.5\.5
nameserver 223\.6\.6\.6
nameserver 114\.114\.114\.114
  1. 保存退出:按ESC退出编辑模式,输入:wq(w=保存,q=退出),按回车完成保存。

  2. 验证DNS是否生效,执行以下命令:
    nslookup registry\-1\.docker\.io✅ 成功标志:输出中能解析出Docker仓库的IP地址,说明DNS配置正常;❌ 失败:若仍提示超时,检查DNS配置是否输入正确,重新编辑即可。

第二步:配置永久DNS(避免重启后被清空)

由于系统通过NetworkManager管理网络,直接修改resolv.conf会被自动覆盖,重启虚拟机后会再次变为空文件,因此需要给网卡配置永久DNS。

修改NetworkManager配置
  1. 确认网卡名称(一般就是ens33,或者ens什么的),查看网卡名称
bash 复制代码
ip addr

这里我的是ens160

  1. 执行以下命令,给ens160配置固定DNS,忽略DHCP自动获取的DNS:
bash 复制代码
# 给ens160设置固定DNS,忽略DHCP自动获取的DNS
nmcli connection modify ens160 ipv4.dns "223.5.5.5,223.6.6.6,114.114.114.114" ipv4.ignore-auto-dns yes
  1. 重启NetworkManager服务,使配置生效:
bash 复制代码
systemctl restart NetworkManager

第三步:配置Docker国内镜像加速(彻底解决拉取慢/失败)

DNS配置正常后,若拉取Docker镜像仍较慢(国内访问官方源不稳定),配置国内镜像加速,大幅提升拉取速度,步骤如下:

  1. 编辑Docker配置文件:
bash 复制代码
vi /etc/docker/daemon.json
  1. 粘贴以下国内镜像源配置(阿里、百度、中科大源,稳定可用):
bash 复制代码
{
  "registry-mirrors": [
    "https://mirror.baidubce.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}

}注:若daemon\.json文件已有其他配置,只需添加registry-mirrors`节点,保持JSON格式正确即可。

  1. 重启Docker服务,使镜像源配置生效:
bash 复制代码
systemctl daemon\-reload
systemctl restart docker

第四步:重新执行docker-compose up,启动服务

所有配置完成后,重新执行拉取启动命令:

bash 复制代码
docker-compose up

✅ 成功标志:镜像正常拉取,无解析超时、连接被拒绝报错,Jenkins(或其他Docker应用)正常启动。

执行成功

四、避坑注意事项

  • 临时DNS配置仅临时生效,重启虚拟机后会失效,必须配置永久DNS(方案A或B),否则问题会复发;

  • 国内用户务必配置Docker国内镜像加速,不仅解决拉取失败,还能大幅提升拉取速度,避免官方源访问不稳定;

  • 若配置后仍无法解析,可检查虚拟机网络模式(推荐NAT模式),并确认防火墙已关闭(systemctl stop firewalld),避免拦截网络连接。

相关推荐
AlfredZhao1 天前
生产环境里,为什么不建议把普通端口直接暴露到公网?
linux·https·443·80
戴为沐2 天前
Linux内存扩容指南
linux
zylyehuo3 天前
Linux 彻底且安全地删除文件
linux
用户805533698033 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297913 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
Patrick_Wilson4 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy4 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭4 天前
运行你的第一个Docker容器
后端·docker·容器
Web3探索者5 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo5 天前
Linux系统中网线与USB网络共享冲突
linux