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

Docker容器间连接超时问题求助(DigitalOcean服务器环境)

问题描述

在DigitalOcean Linux服务器上运行基于Docker容器的微服务应用,本地运行正常,服务器上的容器可被公网访问,但容器间无法通信,提示「Connection Timed Out」。具体现象:

  • 容器处于同一网络,在容器内可ping通dev.mydomain.net,但无法用curl访问其他容器;
  • 主机与容器间可互相curl访问。

附Docker Compose配置:

version: '3.4'

services:
  app.identityserver:
    image: registry.digitalocean.com/app/appidentityserver:latest
    build:
      context: .
      dockerfile: App.IdentityServer/Dockerfile
    ports:
        - 6004:6004
        - 6005:6005
        #- 6004:443
        #- 6005:80
    container_name: appidentityserver
    environment:
        - ApiUrl=https://dev.mydomain.net:6000
        - ChatHubApiUrl=https://dev.mydomain.net:6100
        - MediaServerPath=https://dev.mydomain.net:6200
        - MailServiceUrl=https://dev.mydomain.net:6300
        - DefaultConnection=***
        - ASPNETCORE_ENVIRONMENT=Development
        - ASPNETCORE_URLS=https://+:6004;http://+:6005
        - ASPNETCORE_HTTPS_PORT=6004
        - ASPNETCORE_Kestrel__Certificates__Default__Path=/app/sslCert/archive/cert1.pem
        - ASPNETCORE_Kestrel__Certificates__Default__KeyPath=/app/sslCert/archive/privkey1.pem
    volumes:
        - /etc/letsencrypt/archive/dev.mydomain.net/:/app/sslCert/archive/

  app.api:
    image: registry.digitalocean.com/yekka/appapi:latest
    build:
      context: .
      dockerfile: App/Dockerfile
    ports:
        - 6000:443
        #- 6001:80
    container_name: appapi
    environment:
        - IedntityServerUrl=https:dev.mydomain.net:6004
        - DefaultConnection=***
        - ChatHubPath=https://dev.mydomain.net:6100
        - MediaServerPath=https://dev.mydomain.net:6200
        - MailServicePath=https://dev.mydomain.net:6300
        - ASPNETCORE_ENVIRONMENT=Development
        - ASPNETCORE_URLS=https://+;http://+
        - ASPNETCORE_HTTPS_PORT=6000
        - ASPNETCORE_Kestrel__Certificates__Default__Path=/app/sslCert/archive/cert1.pem
        - ASPNETCORE_Kestrel__Certificates__Default__KeyPath=/app/sslCert/archive/privkey1.pem
    volumes:
        - /etc/letsencrypt/archive/dev.mydomain.net/:/app/sslCert/archive/
    depends_on:
        - app.identityserver
排查与解决方案

1. 修正环境变量拼写与格式错误

  • app.api服务的环境变量IedntityServerUrl存在拼写错误,应为IdentityServerUrl;
  • 该变量值的协议部分缺失//,正确值应为https://dev.mydomain.net:6004,格式错误会直接导致请求地址无效。

2. 改用Docker内部网络通信(推荐)

容器通过公网域名访问时,流量会走服务器公网出口,容易被云防火墙/本地防火墙拦截,或因NAT规则导致超时。建议直接使用Docker Compose服务名访问内部网络:

  • 将app.identityserver的ApiUrl改为https://app.api:443(对应app.api容器内的443端口);
  • 将app.api的IdentityServerUrl改为https://app.identityserver:6004(对应app.identityserver容器内的6004端口);
  • 其他服务间的通信地址也按此规则替换,利用Docker内置的DNS解析直接访问容器,无需经过公网,稳定性更高。

3. 检查防火墙配置(若坚持用公网域名)

如果必须通过公网域名通信,需确保:

  • DigitalOcean云防火墙允许容器所在子网(默认是172.17.0.0/16或Compose创建的自定义子网)访问目标端口(如6000、6004等);
  • 服务器本地防火墙(如ufw)添加规则,允许内部子网流量访问对应端口,示例命令:
    ufw allow from 172.17.0.0/16 to any port 6000
    ufw allow from 172.17.0.0/16 to any port 6004
    

4. 验证容器监听地址

确认ASP.NET Core服务监听的是所有网络接口而非仅localhost,当前配置中ASPNETCORE_URLS=https://+:6004;http://+:6005和https://+;http://+是正确的(+表示监听所有接口),无需修改。

5. 确认Docker网络一致性

执行以下命令验证两个容器处于同一网络:

# 查看Compose创建的网络名称
docker network ls
# 检查容器所属网络
docker inspect appidentityserver | grep Networks
docker inspect appapi | grep Networks

若不在同一网络,需检查Compose配置是否有误,或重新部署服务。

内容的提问来源于stack exchange,提问作者Stefan Vukovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:54:26