Docker容器间请求报错:Connection refused问题求助
问题排查与解决方案
核心问题
你在container_1里用http://127.0.0.1:8001请求认证服务,但容器内的127.0.0.1是容器自身的回环地址,并非宿主机,因此无法连接到宿主机映射8001端口的container_2。
解决步骤
1. 修改请求地址为容器名称
Docker同一网络下的容器可直接通过容器名互相访问,无需使用宿主机端口。将代码中的host修改为:
host = 'http://container_2:8000'
注意使用container_2的内部端口8000(而非宿主机映射的8001),容器间直接通信走内部暴露的端口。
2. 确认服务监听地址
检查container_2内的Django服务是否监听在0.0.0.0:8000(若仅监听127.0.0.1,容器外无法访问)。进入container_2执行:
netstat -tulpn | grep 8000
确保输出中的地址为0.0.0.0:8000或:::8000。
3. 验证容器间连通性
进入container_1内部,先测试与container_2的连通性:
docker exec -it container_1 ping container_2
若ping通,再用curl测试API接口:
curl http://container_2:8000/api/v1/auth/sign_in -X POST -d '{"your":"data"}' -H "Content-Type: application/json"
4. 修正Docker Compose配置缩进错误
你的container_2配置存在缩进问题,修正后如下:
container_2: build: context: ./container_2 dockerfile: Dockerfile env_file: 'accounts/settings/.env' stdin_open: true tty: true environment: - 'DJANGO_SETTINGS_MODULE=project.settings' expose: - 8000 ports: - "8001:8000" volumes: - ./data:/app networks: - web
缩进错误可能导致容器构建异常,修正后重启容器。
总结
最关键的修复点是避免在容器内用宿主机的127.0.0.1访问其他容器,改用Docker网络内的容器名+内部端口即可解决连接拒绝问题。
内容的提问来源于stack exchange,提问作者Vladislav Mikhailov
相关产品推荐
相关产品推荐

