Harbor服务器重启后无法访问Web页面?可能是服务器自身DNS解析问题!

Harbor服务器重启后无法访问Web页面?可能是服务器自身DNS解析问题!

OWLSAMA
1年前发布

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界面

更完整的解决方案
对于生产环境,我建议采用更全面的方法:

  1. 在服务器hosts中添加必要记录

    # /etc/hosts 示例
    127.0.0.1   localhost localhost.localdomain
    192.168.1.100   harbor.yourcompany.com harbor
  2. 使用IP地址替代域名(可选)
    如果你控制所有配置,可以直接在Harbor配置中使用IP地址:

    yaml

    harbor.yml

    hostname: 192.168.1.100

  3. 配置容器使用主机的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"
  4. 确保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依赖

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏
评论 抢沙发
OωO
取消