寻找一种在 docker 桥接网络中 nginx 后面的多个容器化 spring 启动应用程序之间进行通信的方法

Looking for a way to communicate between multiple containerized spring boot apps behind nginx in a docker bridge network

我有几个 spring 引导应用程序,它们都有 rest API,并且它们是容器化的。我正在编写一个 docker-compose 文件来设置所有容器以通过桥接网络相互通信。在 .env 文件中,我列出了每个应用程序将使用的端口,并将其作为 server.port 作为 entrypoint 参数的一部分传入。它们都在我调用 services_network 的同一个自定义桥接网络上,并且它们都在该网络上 收听,因为它们的端口彼此可用(而不是在外部) docker 网络)通过 expose。我将 nginx 作为反向代理,在端口 443 上提供入口点,将外部请求转发到其中一项服务。从那里,我希望该服务根据需要调用其他服务,并将所有流量保留在该 docker 网络内,直到原始服务 returns 通过 nginx 返回结果。

这些服务通过它们的 application.properties 知道网络上的其他服务,其他服务的 URL 将在那里指定。但是配置不知道分配给服务的端口是什么,因为这是在“组合”时在 docker-compose 中处理的。我意识到我可以让每个服务都在桥接网络之外,让服务之间的任何调用都通过 nginx。但这绝对是我 而不是 想做的。有什么方法可以避免在 application.properties 文件的 URL 中指定端口号,并且仍然可以避免请求从外部发出并通过 nginx 返回?

在Docker内,每个容器都有自己的IP地址。通常这是一个实现细节,你不需要考虑太多。然而,这意味着每个容器也有自己独立的一组 TCP 端口,因此可以让多个容器在各自容器内的同一端口上侦听。

如果您在容器之间进行调用,则这些调用需要使用目标容器中的服务正在侦听的端口。您不需要特别公开端口。如果你使用 ports: 向主机发布一个端口,这将被忽略。与其他 HTTP URL 一样,如果您正在侦听默认的 HTTP 端口 80,则可以在 URL.

中省略它

例如,使用 Nginx 代理的典型的基于 Compose 的设置可能如下所示:

version: '3.8'

services:
  # All external requests go through this Nginx proxy
  nginx:
    image: nginx
    # Make this service (only) be externally visible
    #   http://host-dns-name.example.com:12345
    #   https://host-dns-name.example.com:12346
    ports: ['12345:80', '12346:443']
    # The Nginx configuration includes
    #   proxy_pass http://backend
    volumes: [./nginx.conf:/etc/nginx/nginx.conf]

  # Probably the main application
  backend:
    build: .
    # This is not externally visible; it does not have ports:
    environment:
      - PORT=80    # probably actually in the Dockerfile
      - PGHOST=db  # default PGPORT=5432, don't need to specify it

  # A normal boring PostgreSQL container; the primary data storage
  db:
    image: postgres:13
    # This is not externally visible; it does not have ports:
    volumes: [pgdata:/var/lib/postgresql/data]

volumes:
  pgdata:

# No top-level or per-service networks:; the Compose `default` network is fine