我有一个docker-compose
设置。各种容器相互通信。此外,安装程序应允许动态运行容器。现在,我尝试通过Nginx反向代理服务器公开一些内容。预先对所有具有已知主机的容器运行良好。但是,我想动态地代理所有带有前缀containeraaa-
的容器,如下所示。
docker-compose.yml :
version: '3'
services:
container-api:
build: ./api
containerzzz
build: ./zzz
# the following can change dynamically:
containeraaa-x:
image: nginx:alpine
volumes:
- ./x:/usr/share/nginx/html:ro
containeraaa-y:
image: nginx:alpine
volumes:
- ./y:/usr/share/nginx/html:ro
containeraaa-z:
image: nginx:alpine
volumes:
- ./z:/usr/share/nginx/html:ro
# reverse-proxy:
reverse-proxy:
ports:
- 80:80
image: nginx:alpine
volumes:
- ./reverse-proxy/nginx.conf:/etc/nginx/nginx.conf:ro
nginx.conf :
http {
server {
listen 80;
location ~ ^/aaa/(?<fwd_path>.*)$ {
proxy_pass http://containeraaa-$fwd_path; # error
}
location /aaa {
proxy_pass http://container-api:8080/api/; # resolves correctly
}
location / {
proxy_pass http://containerzzz/; # resolves correctly
}
}
[…]
尽管可以从反向代理容器内部访问http://containeraaa-x
;请求/aaa/x
会导致错误:
no resolver defined to resolve containeraaa-x.
如果我添加
resolver 127.0.0.11
它尝试访问/usr/share/nginx/html/aaa/x
。
将/aaa/x
解析为http://containeraaa-x
的正确方法是什么?或者这根本不可能吗? http://containerzzz/
为什么起作用,如何精确运行,而http://containeraaa-*
却不起作用?
答案 0 :(得分:-1)
您应使用traefik,即“云本地边缘路由器”。 要使用它,请在您的docker-compose设置中启动traefik容器,并将标签添加到要通过traefik公开的容器中。
要启动traefik容器,您应该执行以下操作:
traefik:
image: traefik
command: -c /dev/null --web --docker --docker.domain=basedomain.com
ports:
- 80:80
- 8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
并在反向代理后面放置一个服务:
the_app:
depends_on:
- traefik
ports:
- 80
labels:
- traefik.frontend.rule=Host:the_app.domain
- traefik.port=80
您已经完成了公开服务的工作。