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
相关产品推荐
相关产品推荐

