动态容器的反向代理

时间:2018-07-11 11:29:20

标签: docker nginx reverse-proxy

我有一个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-*却不起作用?

1 个答案:

答案 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

您已经完成了公开服务的工作。