docker - 为什么 docker 容器只能使用 0.0.0.0 连接?
问题描述
我有一个 docker-compose 包含两个服务:
- 一个 Python uWSGI 应用
port 5000
程序 - 一个 Nginx 反向代理
port 433
(带有自签名证书)。后者已设置为将请求代理到在第一个容器中运行的服务中,这很好。
Python 服务有一个端点,它接收一个带有 JSON 有效负载(一个对象)的 POST 请求,其中包含一个$schema
允许服务对其进行验证的属性:
"$schema": "https://localhost/schemas/schema.json"
有趣的是,该模式已在服务本身上设置,这意味着传入的属性(如 URL 所示)正在由它提供服务。当服务尝试针对无法 GET(请求上面的 URL)的模式验证有效负载时,就会出现问题。
我的结论
- 我可以理解为什么从
localhost
失败中获取,因为在 localhost, 443 上没有任何服务在相应的容器中运行:
jsonschema.exceptions.RefResolutionError: HTTPSConnectionPool(host='localhost', port=443):
Max retries exceeded with url: /schemas/schema.json
(Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f7c26d9f5b0>:
Failed to establish a new connection: [Errno 111] Connection refused'))
- 作为替代方案,我尝试使用 Nginx 容器 (
https://nginx/schemas/schema.json
) 的 IP,它实际上找到了容器,但通过了自签名证书的 SSL 验证。
jsonschema.exceptions.RefResolutionError: HTTPSConnectionPool(host='nginx', port=443):
Max retries exceeded with url: /schemas/schema.json
(Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate (_ssl.c:1108)')))
- 在第三次尝试中,我使用
0.0.0.0
了正确路由请求并正确验证对象的方法。
但是,我不明白为什么它会起作用。以及为什么服务能够通过代理发出请求,但我无法在 Python 服务容器内简单地使用 CURLcurl --insecure https://0.0.0.0/...
任何有助于找出真正原因或更好地理解网络应该如何在这里工作的帮助将不胜感激。
解决方案
推荐阅读
- python - 在 scipy 的最小二乘函数中使用 Levenberg-Marquardt 方法
- sql - 如何获取带有 id 的表中的公共字段
- java - 批量分配不安全的活页夹配置 Rest 框架,JSON http 请求:我没有使用 Spring MVC
- python - 如何用白色窗口替换图像的一部分?
- php - 使用动态数据自动刷新 div
- cloudkit - ckWebAuthToken 使用 CloudKit Web 服务通过 postMessage 检索
- r - 如何在闪亮的模块化函数上使用 RenderUI?
- c# - AWS Lambda 中的空白环境变量
- javascript - 如何将存储在模型中的 json 数组绑定到 SAPUI5 中的列表控件?
- jquery - 如何在 post 方法中传递参数以进行数据表 ajax 调用