Docker Nginx代理:如何使用路径而不是主机名将流量路由到其他容器 [英] Docker Nginx Proxy: how to route traffic to different container using path and not hostname
问题描述
让我们说,现在我有不同的应用程序在同一服务器上的不同路径上运行:
lets say that now I have different app running on the same server on different path:
- 10.200.200.210/ app1
- 10.200.200.210/ app2
- 10.200.200.210/ app3
我想使用nginx作为代理在不同的Docker容器上运行每个应用程序.
I want to run each app on a different Docker container using nginx as a proxy.
我尝试了 jwilder/nginx-proxy ,如果我使用其他域名(app1.domain.com,app2.domain.com等),但是我无法使用域,我需要使用相同的IP.
I tried jwilder/nginx-proxy and works great if I use different domain names (app1.domain.com, app2.domain.com, etc), but I'm not able to use domains, I need to use the same IP.
我也不能使用其他端口,例如:
also I can't use different ports like:
- 10.200.200.210:81/ app1
- 10.200.200.210:82/ app2
- 10.200.200.210:83/ app3
所有端口都必须在端口80上工作.
all must work on port 80.
- 是否可以通过配置 jwilder/nginx-proxy 来做到这一点?
- 是否有另一个像 jwilder/nginx-proxy 这样的Docker镜像.
- 或者您能给我一些提示,让我自己构建一个nginx docker容器吗?
- Is there a way to configure jwilder/nginx-proxy to do this?
- Is there another Docker image like jwilder/nginx-proxy that make it.
- or pls could you give me some hint to build an nginx docker container by myself?
推荐答案
如果有人仍在寻找答案.通过jwilder/nginx-proxy,您可以基于代理范围或按VIRTUAL_HOST使用自定义Nginx配置.
In case if somebody is still looking for the answer. jwilder/nginx-proxy allows you to use custom Nginx configuration either a proxy-wide or per-VIRTUAL_HOST basis.
在这里,如何使用Per-VIRTUAL_HOST位置配置来做到这一点.
Here's how can you do it with Per-VIRTUAL_HOST location configuration.
- 在您的poject文件夹内创建另一个文件夹-"vhost.d".
- 使用"vhost.d"文件夹中的自定义nginx配置创建文件"whoami.local".此文件的名称必须与VIRTUAL_HOST相同!
./vhost.d/whoami.local
./vhost.d/whoami.local
location /app1 {
proxy_pass http://app1:8000;
}
location /app2 {
proxy_pass http://app2:8000;
}
- 创建docker-compose.yml文件.
./docker-compose.yml
./docker-compose.yml
version: '3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "8080:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /path/to/vhost.d:/etc/nginx/vhost.d:ro
gateway:
image: jwilder/whoami
environment:
- VIRTUAL_HOST=whoami.local
app1:
image: jwilder/whoami
app2:
image: jwilder/whoami
- 运行docker-compose up
- 检查配置
在bash中运行:
$ curl -H "Host: whoami.local" localhost:8080
I'm 1ae273bce7a4
$ curl -H "Host: whoami.local" localhost:8080/app1
I'm 52b1a7b1992a
$ curl -H "Host: whoami.local" localhost:8080/app2
I'm 4adbd3f9e7a0
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a659a4d4b0a jwilder/nginx-proxy "/app/docker-entrypo…" 54 seconds ago Up 53 seconds 0.0.0.0:8080->80/tcp nginxreverseproxy_nginx-proxy_1
4adbd3f9e7a0 jwilder/whoami "/app/http" 54 seconds ago Up 53 seconds 8000/tcp nginxreverseproxy_app2_1
52b1a7b1992a jwilder/whoami "/app/http" 54 seconds ago Up 53 seconds 8000/tcp nginxreverseproxy_app1_1
1ae273bce7a4 jwilder/whoami "/app/http" 54 seconds ago Up 53 seconds 8000/tcp nginxreverseproxy_gateway_1
您还可以在/etc/hosts文件中添加"whoami.local"域,然后直接调用该域.
You can also add "whoami.local" domain to /etc/hosts file and make calls to this domain directly.
/etc/hosts
/etc/hosts
...
127.0.0.1 whoami.local
...
结果:
$ curl whoami.local:8080
I'm 52ed6da1e86c
$ curl whoami.local:8080/app1
I'm 4116f51020da
$ curl whoami.local:8080/app2
I'm c4db24012582
这篇关于Docker Nginx代理:如何使用路径而不是主机名将流量路由到其他容器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!