【问题标题】:Accessing multiple services using single url docker-compose使用单个 url docker-compose 访问多个服务
【发布时间】:2018-08-05 15:51:22
【问题描述】:

我正在使用 docker-compose 在烧瓶中部署多个微服务。这是撰写代码

version: '3'

services:
  test-api:
    volumes:
      - ./test-api:/test-api
    build: test-api
    ports:
      - "5000:5000"

  redis:
    image: "redis:alpine"

  search:
    volumes:
      - ./seach:/search
    environment:
      - HTTP_PORT=5000
      - REDIS_URL=redis://redis:6379/0
    build: search
    ports:
      - "5001:5000"
    link:
      - redis

现在我必须从单个 URL 访问此服务,例如:http://example.com/test-apihttp://example.com/search,但我无法弄清楚,因为这 2 个服务在 2 个不同的端口上运行。我知道我需要使用 nginx 并对其进行配置,以便我可以访问它们。但我不知道该怎么做。有人可以帮我解决这个问题,或者至少给我一些文档来阅读以了解路由吗?

另外两个服务都使用 /health 来报告健康检查的结果。如何访问这两项服务的运行状况检查?

【问题讨论】:

    标签: python docker nginx docker-compose microservices


    【解决方案1】:

    正如您所写,您应该使用放置在服务前面的负载平衡器。现在,您应该创建一个不暴露端口的 docker 网络。唯一暴露端口的容器应该是 nginx 容器,以便处理所有客户端请求。 test-apisearchnginx 应该是同一个 docker 网络的一部分,以便允许 nginx 将请求分派到正确的容器。您的 docker-compose 文件应如下所示:

        version: '3'
    
        services:
          loadbalancer:
            image: nginx
          ports:
           - "80:8080"
          networks:
            - my_netowrk
          test-api:
            volumes:
              - ./test-api:/test-api
            build: test-api
            networks:
             - my_netowrk
    
          redis:
            image: "redis:alpine"
            networks:
              - my_netowrk
    
          search:
            volumes:
              - ./seach:/search
            environment:
              - HTTP_PORT=5000
              - REDIS_URL=redis://redis:6379/0
            build: search
            networks:
             - my_netowrk
    
       networks:
         my_netowrk:
           driver: <driver>
    

    我建议您不要再使用links,它们已经过时且已弃用。 您可以通过以下链接了解更多关于 docker networks 的信息:

    【讨论】:

    • 嗨@Giorgio我可以使用docker网络在容器之间进行通信,但仍然无法根据URL将请求路由到特定容器。第二件事是,我对这两项服务都进行了健康检查。如何访问这两个服务的 /health url?
    • 这应该是 nginx 配置相关的。您必须为要与之通信的每个服务创建一个proxy_pass 规则。 Docker 允许您仅使用服务名称与已连接到同一网络的 ache 容器进行通信。这个link 可以帮助您实现这一目标。
    【解决方案2】:

    所以对于正在寻找快速解决方案的人来说,这是我的 nginx 文件

    http {
    
    
        server {
    
            listen 80;
    
            location /test {
                proxy_pass http://test-api:5000;
            }
            location /search {
                proxy_pass http://search:5000;
            }
            location /health-test {
                proxy_pass http://test-api:5000/health;
            }
            location /health-search {
                proxy_pass http://search:5000/health;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2021-10-26
      • 2021-04-10
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多