公认的答案很好,但由于我现在正处于这个问题的困境中,我将通过我的调试步骤对其进行扩展,希望它可以帮助某人(我自己在未来?)
Docker-compose 项目经常使用 nginx 作为反向代理来将 http 流量路由到其他 docker 服务。 nginx 是我的projectfolder/docker-compose.yml 中的一个服务,它连接到两个 docker 网络。
一个是我在projectfolder/docker-compose.yml 上使用docker-compose up 时创建的默认网络(它被命名为projectfolder_default 并且服务默认连接到它,除非您有一个networks 属性用于您的服务与另一个网络,然后确保将 - default 添加到列表中)。当我运行 docker network ls 时,我在列表中看到了 projectfolder_default,当我运行 docker network inspect projectfolder_default 时,我看到了 nginx 容器,所以一切都很好。
另一个是我自己建立的名为my_custom_network 的网络。我有一个启动脚本,如果它不存在使用 https://stackoverflow.com/a/53052379/13815107 创建它,我需要它来与 otherproject/docker-compose.yml 中的 web 服务对话。我已将my_custom_network 正确添加到:
-
nginxprojectfolder/docker-compose.yml 的服务网络列表
- 底部
projectfolder/docker-compose.yml
-
webotherproject/docker-compose.yml 中的服务网络
- 底部
otherproject/docker-compose.yml
网络出现并使用docker network ls 和docker network inspect my_custom_network 拥有正确的容器
但是,我假设 server.conf 中的 proxy_pass 到 http://web 将映射到 docker 服务 web.projectfolder_default。我错了。为了测试这一点,我在 nginx 容器 (docker exec -it nginx sh) 上打开了 shell。当我使用ping web(可能需要apt-get update,apt-get install iputils-ping)时它成功了,但是它打印了一个带有my_custom_network的url,这就是我发现错误的方式。
更新:我尝试在server.conf.template 中使用http://web.my_custom_network,它的路由效果很好,但是我的webapp(基于Django)被url 中的下划线阻塞了。我在otherproject/docker-compose.yml 中将web 重命名为web2,然后使用docker stop otherproject_web 和docker rm otherproject_web 之类的东西来摆脱坏的。
项目文件夹/docker-compose.yml
services:
# http://web did NOT map to this service!! Use http://web.main_default or change the names
web:
...
nginx:
...
links:
- web
networks:
- default
- my_custom_network
...
networks:
- my_custom_network
external: true
其他项目/docker-compose.yml
services:
# http://web connected to this service instead. You could use http://web.my_custom_network to call it out instead
web:
...
networks:
- default
- my_custom_network
...
networks:
- my_custom_network
external: true
projectfolder/.../nginx/server.conf.template(在 Dockerfile 旁边)
...
server {
...
location /auth {
internal;
# This routed to wrong 'web'
proxy_pass http://web:9001;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
}
location / {
alias /data/dist/;
}
location /robots.txt {
alias /robots.txt;
}
# Project Folder backend
location ~ ^/(api|login|logout)/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300s;
proxy_read_timeout 300s;
# This routed to wrong 'web'
proxy_pass http://web:9001;
}
# Other project UI
location /other-project {
alias /data/other-project-client/dist/;
}
# Other project Django server
location ~ ^/other-project/(rest)/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300s;
proxy_read_timeout 300s;
# nginx will route, but won't work some frameworks like django (it doesn't like underscores)
# I would rename this web2 in yml and use http://web2
proxy_pass http://web.my_custom_network:8000;
}
}