我查看了很多关于 docker 容器、微服务和 nginx 代理的教程。真正引起我注意的一件事是,在 docker-compose.yml 文件中,我想要启动的服务有一个 VIRTUAL_HOST 环境变量。这样我就可以通过直接引用 VIRTUAL_HOST 来启动容器。
但是所有容器都需要指定 VIRTUAL_HOST 吗?例如,假设我有 3 个容器:A、B 和 C。如果我希望所有这 3 个容器都被代理,那么我是否必须在 docker-compose 文件中为所有 3 个容器指定 VIRTUAL_HOST 环境变量?VIRTUAL_HOST 环境变量是否是 Nginx 代理与这些容器正常工作的先决条件?我查看的所有教程都没有回答这个问题。
答案1
我想你说的是jwilder/nginx-proxy图像。
这样我就可以通过直接引用VIRTUAL_HOST来启动容器。
只要您键入,容器就会启动docker-compose up
并且一直在运行。VIRTUAL_HOST
告诉反向代理应该将哪些主机请求转发到这个容器。
例如,如果您有一个带有 的容器VIRTUAL_HOST=foo.example.com
,那么对 revproxy 发出的每个请求foo.example.com
都Host
将转发到此容器,并且其响应将由代理发送到客户端。但如果标Host
头为bar.example.com
,则请求将不会转发到该容器。相反,代理会将其转发到带有 的容器VIRTUAL_HOST=bar.example.com
。如果不存在这样的容器,它将尝试使用代理容器(而不是默认容器)上带有变量指定的默认主机DEFAULT_HOST
。如果未配置默认主机,它将返回错误。
如果没有VIRTUAL_HOST
,代理将不知道Host
该容器对应哪个,因此不会转发任何请求。
答案2
是的。
如果您有三个独立的服务,它们执行不同的任务并希望独立路由 - 为每个服务指定一个唯一的虚拟主机。随后将使用该虚拟主机向该容器发出请求(具有该虚拟主机环境变量的容器将响应)
如果你有相同服务的三个实例 - 那么为每个实例提供相同的虚拟主机环境变量,nginx 将轮询请求