Docker部署Django无法访问外部API:域名解析失败求助
问题解决方案
核心原因
Docker容器的网络环境独立于宿主机,宿主机能正常解析的内网/自定义域名,容器内部可能缺少对应的DNS配置或hosts映射,从而导致域名解析失败。
解决方法
1. 用目标机器IP替换域名
将视图中的域名直接替换为API所在机器的实际IP,比如:
host='http://192.168.1.100:8190'
如果API运行在宿主机上:
- Windows/macOS环境:可以用
host.docker.internal替代IP,代码写成host='http://host.docker.internal:8190' - Linux环境:运行容器时添加参数
--add-host host.docker.internal:host-gateway,之后代码里同样使用host.docker.internal
2. 给容器添加hosts映射
如果必须使用域名,可手动在容器内添加域名到IP的映射:
- 命令行启动容器时:
docker run --add-host my-host:192.168.1.100 [你的容器其他参数] - 使用docker-compose时,在配置文件中添加:
services: your-django-service: # 其他已有配置 extra_hosts: - "my-host:192.168.1.100"
3. 配置容器的DNS服务器
若域名通过内网DNS解析,给容器指定内网DNS服务器:
- 命令行启动容器时:
docker run --dns 192.168.1.1 [你的容器其他参数] - docker-compose配置:
services: your-django-service: # 其他已有配置 dns: - 192.168.1.1
4. 使用host网络模式(慎用)
让容器共享宿主机的网络栈,此时容器的域名解析规则和宿主机完全一致:
docker run --network host [你的容器其他参数]
注意:该模式下容器端口会直接占用宿主机端口,易引发端口冲突,且安全性较低,仅适合测试场景。
额外代码优化提醒
你的请求头中str({token})会生成{'My_Auth_Token'}这类不符合标准认证格式的字符串,建议根据API要求修改,比如Bearer Token格式:
hd = {'Authorization': f'Bearer {token}'}
如果是Token认证格式,改为:
hd = {'Authorization': f'Token {token}'}
内容的提问来源于stack exchange,提问作者VijayGanesh
相关产品推荐
相关产品推荐

