将本地域名绑定到Django:Docker多应用域名访问配置求助
问题排查与解决方案
1. 先修复Host文件的泛解析问题
绝大多数系统(Windows、部分Linux发行版)的hosts文件不支持*.mydomain.local这种泛域名写法,你加的这条规则根本不会生效。直接改成具体域名:
127.0.0.1 test1.mydomain.local 127.0.0.1 test2.mydomain.local 127.0.0.1 localhost
修改完刷新DNS缓存:
- Windows:执行命令
ipconfig /flushdns - Linux/macOS:执行
sudo dscacheutil -flushcache或sudo systemctl restart nscd
2. 配置反向代理(核心步骤)
Host文件只是把域名指向本地,但浏览器访问域名默认用80/443端口,你的容器跑在8000、8001端口,必须通过反向代理把不同域名的请求转发到对应容器。这里给出两种常见实现方式:
方式一:用Nginx容器快速搭建代理
- 创建
nginx.conf配置文件:
server { listen 80; server_name test1.mydomain.local; location / { proxy_pass http://host.docker.internal:8000; # 指向宿主机的8000端口(对应test1应用) proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } server { listen 80; server_name test2.mydomain.local; location / { proxy_pass http://host.docker.internal:8001; # 指向宿主机的8001端口(对应test2应用) proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 启动Nginx容器:
docker run -d \ --name nginx-proxy \ -p 80:80 \ -v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf \ nginx:alpine
方式二:Docker Compose整合代理(更适合多应用场景)
在你的docker-compose.yml里添加Nginx服务,同时把所有应用和代理放到同一个网络:
version: '3.8' services: test1-app: # 你的test1应用原有配置 ports: - "8000:80" # 假设应用内部监听80端口 networks: - app-network test2-app: # 你的test2应用原有配置 ports: - "8001:80" networks: - app-network nginx-proxy: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf networks: - app-network depends_on: - test1-app - test2-app networks: app-network: driver: bridge
这种情况下,Nginx配置里的proxy_pass可以直接用容器名,比如http://test1-app:80,无需再用host.docker.internal。
3. 验证与排错
- 访问
test1.mydomain.local,检查是否正常跳转至对应应用 - 如果失败,按以下步骤排查:
- 查看Nginx日志找报错:
docker logs nginx-proxy - 确认宿主机80端口未被防火墙拦截
- 验证应用容器本身是否正常:
docker exec <容器名> curl localhost:80(替换为应用内部实际端口)
- 查看Nginx日志找报错:
4. 关于.env文件的说明
你在.env里配置的域名仅对应用内部生效,和外部域名访问的映射逻辑无关,外部访问的核心是Host解析+反向代理这两步。
内容的提问来源于stack exchange,提问作者Vladislav Mikhailov
相关产品推荐
相关产品推荐

