使用单个url docker-compose访问多个服务

时间:2018-02-26 08:32:58

标签: python docker nginx docker-compose microservices

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

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来报告健康检查的结果。如何访问这两项服务的健康检查?

2 个答案:

答案 0 :(得分:0)

正如您所写,您应该使用放在服务前面的负载均衡器。现在,您应该创建一个docker网络而不暴露端口。暴露端口的唯一容器应该是nginx容器,以便处理所有客户端请求。 test-apisearchnginx应该是同一个泊坞网络的一部分,以便允许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的更多信息:

答案 1 :(得分:0)

因此,对于正在寻找快速解决方案的人来说,这是我的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;
        }
    }
}