You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法访问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 8090
      
      确保结果显示监听0.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:55:04