寻找一种在 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
我有几个 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