Docker部署GitLab:容器内curl返回200但主机/浏览器无法访问
1. 检查Docker容器端口映射配置
先确认容器是否将内部端口正确映射到主机的8081端口,执行命令:
docker inspect gitlab2 | grep -A 10 "Ports"
查看输出中是否存在类似"8081/tcp": [{"HostPort": "8081"}]的配置。如果没有端口映射,需重启容器并添加映射(假设GitLab内部使用80端口,根据实际情况调整):
docker stop gitlab2 docker run -d -p 8081:80 --name gitlab2 gitlab/gitlab-ce
若映射存在但HostPort非8081或为空,修正映射配置后重启容器。
2. 验证主机端口监听状态
在主机上检查8081端口是否被Docker进程监听:
netstat -tulpn | grep 8081 # 或使用ss命令 ss -tulpn | grep 8081
若输出中无0.0.0.0:8081或:::8081的监听记录,说明端口映射未生效,回到第一步检查容器配置。
3. 确认mon-gitlab.local的DNS解析正确性
在主机上执行以下命令,验证域名解析结果:
ping mon-gitlab.local # 或用nslookup nslookup mon-gitlab.local
若解析结果为容器内部IP,需修改本地hosts文件(Linux为/etc/hosts,Windows为C:\Windows\System32\drivers\etc\hosts),将mon-gitlab.local指向主机自身IP(如127.0.0.1或局域网IP)。
4. 检查主机防火墙/安全组规则
确认主机防火墙是否允许8081端口的入站流量:
- Linux(ufw):执行
sudo ufw status,查看是否允许8081/tcp - Linux(firewalld):执行
sudo firewall-cmd --list-ports,检查8081/tcp是否在列表中 - Windows:打开防火墙高级设置,确认存在允许8081端口的入站规则
若未配置,添加对应规则:
- ufw:
sudo ufw allow 8081/tcp - firewalld:
sudo firewall-cmd --add-port=8081/tcp --permanent && sudo firewall-cmd --reload
5. 检查容器内GitLab监听配置
进入容器,检查GitLab的外部地址配置:
docker exec -it gitlab2 bash cat /etc/gitlab/gitlab.rb | grep external_url
确保配置为external_url 'http://mon-gitlab.local:8081',若不正确,修改后执行gitlab-ctl reconfigure生效。
同时检查Nginx监听地址,确认是否监听所有IP:
cat /var/opt/gitlab/nginx/conf/gitlab-http.conf | grep listen
需存在类似listen 0.0.0.0:80;的配置。
6. 跳过域名直接用主机IP测试
直接使用主机IP访问,排查域名解析问题:
curl -I http://<主机IP>:8081/users/sign_in
若返回200 OK,说明问题出在mon-gitlab.local的DNS解析上,回到第三步修正。
内容的提问来源于stack exchange,提问作者It Engineer

