docker-compose与Nginx代理的微服务容器间api通信

时间:2018-12-19 00:44:20

标签: docker curl docker-compose microservices nginx-reverse-proxy

我正在尝试构建一个docker-compose文件,该文件将通过其各种微服务模仿我的生产环境。我正在使用具有nginx代理的自定义网桥网络,该网络将端口80和443请求路由到正确的服务容器。 docker-compose文件和nginx conf文件一起指定端口映射,该端口映射允许代理容器将每个DNS条目的流量路由到其匹配的容器。

因此,我可以将容器名称用作DNS条目,以从主机浏览器访问每个容器服务。我还可以执行到每个容器中,并通过相同的DNS主机名ping其他容器。但是,仅靠容器名称我无法成功地从一个容器卷曲到另一个容器。

在Docker环境中运行时,似乎需要将代理端口映射附加到每个服务间API调用。在我的生产环境中,每个服务都有其自己的环境,并且可以在端口80和443上进行响应。因此,为每个服务编写的代码将忽略端口规范,而仅通过其DNS主机名调用每个服务。我宁愿不必将端口ID映射附加到整个各种代码库中的每个API调用中,以使我的服务在Docker环境中相互通信。

是否有工具或配置设置可让我的微服务容器在Docker中成功调用彼此而无需代理端口映射?

version: '3'

services:
  #---------------------
  # nginx proxy service 
  #---------------------
  nginx_proxy:
    image: nginx:alpine
    networks:
      - test_network
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "./site1/site1.test.conf:/etc/nginx/conf.d/site1.test.conf"
      - "./site2/site2.test.conf:/etc/nginx/conf.d/site2.test.conf"
    container_name: nginx_proxy
  #------------
  # site1.test 
  #------------
  site1.test:
    build: alpine:latest
    networks:
      - test_network
    ports:
      - "9001:9000"
    environment:
      - "VIRTUAL_HOST=site1.test"
    volumes:
      - "./site1:/site1"
    container_name: site1.test
  #------------
  # site2.test 
  #------------
  site2.test:
    build: alpine:latest
    networks:
      - test_network
    ports:
      - "9002:9000"
    environment:
      - "VIRTUAL_HOST=site2.test"
    volumes:
      - "./site2:/site2"
    container_name: site2.test

# networks
networks:
  test_network:

1 个答案:

答案 0 :(得分:0)

new AmazonEC2()始终表示http://hostname/(即TCP端口80是HTTP URL的默认端口)。因此,如果您希望一个容器能够以http://hostname:80/的身份到达另一个容器,则另一个容器需要在端口80上运行某种HTTP守护程序(这可能意味着它至少需要以root用户身份启动,它的容器)。

如果您的nginx代理成功路由到所有容器,则仅通过它路由所有容器间通信就没错(在上一代技术中,我们将其称为 service bus ) 。在Docker中没有简单的方法可以执行此操作,但是您可以将其配置为标准HTTP代理。

在任何情况下,我建议都将所有出站服务URL配置为可能是环境变量。您可以想象要在开发环境中(在这种情况下,服务URL可能是http://othercontainer/)或在纯Docker环境(如您显示的内容(http://localhost:9002)中一起运行多个服务,或者在混合多主机Docker设置(http://otherservice:9000)或Kubernetes(http://other.host.example.com:9002)中。