Harbor服务器重启后无法访问Web页面?可能是服务器自身DNS解析问题!
问题重现
今天,我重启了Harbor服务器后,遇到了无法访问Web界面的问题。按照之前的经验,我检查了所有常见问题点:
Docker服务和所有Harbor容器都运行正常
服务器本地可以正常访问 localhost 和 127.0.0.1
防火墙配置正确
但奇怪的是,Web界面仍然无法访问。更奇怪的是,我注意到Harbor的日志中有一些异常,提示某些服务无法正确解析到其他Harbor组件的地址。
深入排查
通过进一步排查,我发现了问题的根源:Harbor服务器无法正确解析自己的域名!
在Harbor服务器上测试
nslookup harbor.yourcompany.com或者使用ping测试
ping harbor.yourcompany.com结果发现,服务器本身无法解析配置文件中使用的域名。这在某些网络环境中很常见,特别是在:
使用内部DNS但DNS服务启动较慢
域名仅在外部DNS中注册
网络配置更改后
解决方案:修改Harbor服务器自身的hosts文件
关键步骤来了!需要在Harbor服务器的 /etc/hosts 文件中添加记录:
SSH登录到Harbor服务器
编辑hosts文件:
sudo vi /etc/hosts添加以下记录(根据你的实际情况修改):
text
127.0.0.1 localhost localhost.localdomain
添加你的服务器IP和域名
192.168.1.100 harbor.yourcompany.com harbor
保存并退出
注意:有些Harbor配置中可能需要同时解析多个域名或使用FQDN,请确保添加完整的域名。
重启Harbor服务
修改hosts文件后,需要重启Harbor服务使更改生效:
# 进入Harbor安装目录
cd /path/to/harbor
# 停止Harbor
docker-compose down
# 重新启动Harbor
docker-compose up -d为什么需要在服务器自身的hosts中添加记录?
Harbor由多个容器组成(core, portal, nginx, redis, database等),这些容器之间需要相互通信。当Harbor配置中使用了域名而非IP地址时,容器内部需要能够解析这些域名。
例如,在 harbor.yml 配置文件中:
yaml
hostname: harbor.yourcompany.com
这个配置会在多个地方使用,包括:
Nginx配置中的服务器名称
容器间的通信地址
生成的回调URL
如果服务器无法解析这个域名,可能导致:
容器间通信失败
回调URL生成错误
重定向循环
完全无法访问Web界面
更完整的解决方案
对于生产环境,我建议采用更全面的方法:
在服务器hosts中添加必要记录
# /etc/hosts 示例 127.0.0.1 localhost localhost.localdomain 192.168.1.100 harbor.yourcompany.com harbor使用IP地址替代域名(可选)
如果你控制所有配置,可以直接在Harbor配置中使用IP地址:yaml
harbor.yml
hostname: 192.168.1.100
配置容器使用主机的DNS
在 docker-compose.yml 中,可以配置容器使用主机的网络设置:yaml
services:
nginx:
...
dns:- 8.8.8.8
- 8.8.4.4
extra_hosts:
- "harbor.yourcompany.com:192.168.1.100"
确保DNS服务正确配置
如果使用内部DNS,确保:
DNS记录正确配置
DNS服务在Harbor之前启动
考虑在Harbor服务器上运行本地DNS缓存服务(如dnsmasq)
验证解决方案
修改并重启后,进行以下验证:
在Harbor服务器上测试域名解析:
bash
ping harbor.yourcompany.com
curl -I https://harbor.yourcompany.com
检查Harbor日志是否有解析错误:
bash
docker logs harbor-core
docker logs harbor-portal
docker logs harbor-nginx
从客户端测试访问是否正常。
总结
这次经历教会了我一个重要教训:当服务器上运行的服务使用域名进行内部通信时,服务器自身必须能够解析这些域名。特别是在容器化环境中,容器可能继承主机的DNS配置,也可能有自己独立的网络栈。
对于Harbor部署,我的建议是:
始终在服务器hosts文件中添加必要的域名解析
在部署前测试服务器的域名解析能力
对于生产环境,使用可靠的DNS服务
考虑在配置中使用IP地址以避免DNS依赖