无法访问GCP虚拟机上部署的Docker容器问题求助
GCP虚拟机容器端口外部访问故障排查与解决
问题概述
使用以下docker-compose.yml在GCP虚拟机部署容器:
services: demoapi: container_name: demoapi image: demoapi:latest volumes: - ./demoapi:/app/demoapi environment: - TZ=Asia/Taipei ports: - "8090:8090" demoDB: image: mcr.microsoft.com/mssql/server:2022-latest container_name: demoDB user: root networks: - demonetwork ports: - "1433:1433" environment: - ACCEPT_EULA=Y - SA_PASSWORD=P@ssword - TZ=Asia/Taipei volumes: - /mnt/c/dbdata:/var/opt/mssql/data # - C:/dbdata:/var/opt/mssql/data deploy: resources: limits: memory: 2GB networks: demonetwork: driver: bridge
已创建VPC防火墙规则允许TCP 1443和8090端口,目标IP范围设为VM外部IP,规则关联VM实例,但外部IP访问两个端口均失败,SSH登录VM确认容器状态正常。
排查与解决步骤
1. 修正端口匹配错误
- 容器
demoDB的端口映射为1433:1433,但防火墙规则开放的是1443端口,属于笔误。需将GCP防火墙规则中的1443改为1433,保持端口一致。
2. 调整GCP防火墙规则目标IP范围
- GCP防火墙规则的目标IP范围需设置为VM的内部IP(而非外部IP),或设置为
0.0.0.0/0(允许所有外部IP访问,按需选择)。外部IP是GCP分配的公网IP,防火墙规则的目标是匹配VM的内部IP,填外部IP会导致规则无法生效。
3. 验证VM本地端口监听状态
- SSH登录VM,执行以下命令检查端口是否被Docker代理监听:
正常结果应显示ss -tulpn | grep -E "8090|1433"docker-proxy进程监听对应端口的0.0.0.0地址。若未监听,重启Docker服务或重新部署容器:sudo systemctl restart docker sudo docker-compose down && sudo docker-compose up -d
4. 检查VM本地防火墙
- GCP VM默认可能启用
ufw或iptables,需确认本地防火墙允许目标端口的入站流量:- 查看
ufw状态:sudo ufw status - 若
ufw开启,添加端口允许规则:sudo ufw allow 8090/tcp sudo ufw allow 1433/tcp - 若使用
iptables,确认对应端口的入站规则存在:sudo iptables -L INPUT -n | grep -E "8090|1433"
- 查看
5. 确认容器内服务监听地址
- 容器内服务需监听
0.0.0.0而非仅localhost,否则仅能容器内部访问:- 进入
demoapi容器检查监听地址:
确保结果显示监听sudo docker exec -it demoapi ss -tulpn | grep 80900.0.0.0:8090(若服务仅监听localhost,需修改服务配置绑定0.0.0.0)。 - 检查SQL Server监听地址:
正常结果应显示非sudo docker exec -it demoDB /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P P@ssword -Q "SELECT local_net_address FROM sys.dm_exec_connections WHERE session_id = @@SPID"127.0.0.1的地址,代表监听所有IP。
- 进入
6. 验证端口占用情况
- 确认VM主机上的8090和1433端口未被其他服务占用:
若有其他进程占用,停止对应服务或修改容器端口映射。sudo lsof -i :8090 sudo lsof -i :1433
内容的提问来源于stack exchange,提问作者WilliamChen
相关产品推荐
相关产品推荐

