不同docker-compose下Django应用跨容器调用报错如何解决
错误根源
- 不同
docker-compose启动的服务默认归属各自独立的 bridge 网络,网络之间默认隔离,应用1的容器无法解析应用2的容器名web,也无法直接访问应用2的内部服务。 - 你使用的端口
8003是宿主机到应用2容器的映射端口,仅适用于宿主机或外部网络访问,容器内部跨服务访问需要使用应用2容器内部监听的端口8000。
解决方案(推荐:共享Docker网络)
- 首先在宿主机执行命令创建公共自定义网络:
docker network create django_shared_net
- 分别修改两个应用的
docker-compose.yml,在根级别添加网络配置,指定所有服务默认使用刚才创建的公共网络:
networks: default: external: true name: django_shared_net
- 修改应用1中的接口请求地址,将端口替换为应用2的内部端口:
# 原错误地址 # http://web:8003/app2_endpoint # 修改后正确地址 http://web:8000/app2_endpoint
- 重启两个docker-compose服务即可正常访问。
备选解决方案(无需调整网络)
如果不想调整Docker网络配置,可以直接通过宿主机IP访问应用2的映射端口:
- 先查询宿主机的内网IP(不要用
127.0.0.1,容器内的127.0.0.1指向容器自身) - 将应用1的请求地址修改为
http://[宿主机内网IP]:8003/app2_endpoint即可。
验证方法
配置完成后可以进入应用1的Django容器手动验证连通性:
# 进入应用1的django容器 docker exec -it <应用1的django容器名/ID> bash # 执行curl测试 curl http://web:8000/app2_endpoint
如果能正常返回接口结果说明配置生效。
内容的提问来源于stack exchange,提问作者Edgar Navasardyan
相关产品推荐
相关产品推荐

