docker-编写微服务容器间api与nginx代理通信

docker-compose microservice inter-container api communication with nginx 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:

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

如果您的 nginx 代理成功路由到所有容器,则仅通过它路由所有容器间流量并没有错(在上一代技术中,我们将其称为 服务总线).在 Docker 中没有简单的方法可以做到这一点,但您可以将其配置为标准 HTTP 代理。

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