.NET环境下Docker容器间SSL连接被拒绝问题排查
问题排查与解决方案
核心问题
同一Docker Compose服务组内,FrontEnd容器可Ping通DataLayer容器,但通过RestSharp调用https://DataLayer:8081时出现Connection refused (datalayer:8081)错误。
排查思路与解决办法
1. 检查DataLayer的Kestrel监听地址
ASP.NET Core服务默认可能仅绑定localhost(127.0.0.1),导致仅容器内部可访问,同组其他容器无法连接。
- 打开DataLayer的
appsettings.json,确认Kestrel配置的监听地址为*或0.0.0.0:"Kestrel": { "Endpoints": { "Https": { "Url": "https://*:8081", "Certificate": { "Path": "/app/certs/DataLayer.crt", "KeyPath": "/app/certs/DataLayer.key" } } } } - 启动DataLayer容器后,查看日志是否包含
Now listening on: https://[::]:8081,若显示https://127.0.0.1:8081则说明监听地址错误,需修改为*。
2. 验证容器内网络连通性(排除RestSharp代码问题)
在FrontEnd容器内执行curl命令直接测试DataLayer服务:
# 进入FrontEnd容器 docker exec -it <front-end-container-id> bash # 忽略证书验证测试HTTPS连接 curl -k https://DataLayer:8081
- 若curl也返回连接拒绝,说明问题出在DataLayer服务或容器网络配置;
- 若curl成功,则排查RestSharp的代码配置:
- 确认BaseUrl拼写无误(端口、协议、服务名);
- 检查是否有自定义代理、超时设置干扰连接;
- 尝试显式设置RestSharp的Client配置,临时关闭证书验证以排除信任问题:
var client = new RestClient("https://DataLayer:8081") { RemoteCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true };
3. 检查Docker Compose网络配置
- 确认两个服务处于同一Docker网络:默认情况下Docker Compose会为所有服务创建并加入默认网络,若手动指定了网络,需确保
FrontEnd和DataLayer都在同一个network块中; - 检查服务名称大小写:Docker DNS解析大小写不敏感,但部分配置可能严格匹配,确认docker-compose.yml中DataLayer的服务名与调用URL一致。
4. 检查DataLayer容器的端口与服务状态
- 查看DataLayer容器内8081端口是否被服务占用:
docker exec -it <data-layer-container-id> netstat -tulpn | grep 8081 - 查看DataLayer容器日志,确认服务无启动异常:
重点检查是否有证书加载失败、端口绑定失败等错误信息。docker logs <data-layer-container-id>
5. 排查容器内防火墙限制
若Debian容器启用了ufw防火墙,需确认8081端口允许入站:
# 进入DataLayer容器 docker exec -it <data-layer-container-id> bash # 查看防火墙状态 sudo ufw status # 若开启,允许8081端口 sudo ufw allow 8081/tcp
内容的提问来源于stack exchange,提问作者Leandro Bardelli
相关产品推荐
相关产品推荐

