Docker Compose环境下Django容器与Kroki容器内部连接失败求助
问题根因
Docker Compose 默认会为同一配置下的所有服务创建专属内部网络,服务名即为容器间通信的域名,但容器间通信需要使用目标容器内部监听的端口,而非映射到宿主机的端口。
你配置中kroki服务的ports: 7331:8000规则,仅代表将宿主机的7331端口映射到kroki容器内部的8000端口,因此浏览器通过宿主机IP+7331可以正常访问,但同网络的app容器访问kroki时,需要直接连接kroki容器内部的8000端口,而非宿主机映射的7331端口。
修复方案
- 修改Django请求代码的端口配置,将请求地址从
http://kroki:7331/xxx改为http://kroki:8000/xxx即可,修正后代码示例:
url = 'http://kroki:8000/bytefield/svg/' + base64_var try: response = requests.get(url) return response.text except ConnectionError as e: print("Connection to bytefield module, unavailable") return None
- 可选优化:如果不需要外部网络直接访问kroki服务,可以删除kroki配置中的
ports段,减少端口暴露风险,容器间通信不受影响。 - 验证方式:进入app容器内部执行
curl http://kroki:8000/health,如果正常返回kroki的健康检查结果,说明容器间通信已恢复正常。
其他尝试失败的原因
你之前测试的localhost:7331、127.0.0.1:7331指向的是app容器自身的端口,既不是宿主机端口也不是kroki容器的端口,因此无法连通。
内容的提问来源于stack exchange,提问作者calcif
相关产品推荐
相关产品推荐

