我正在运行许多使用 Consul 进行服务发现的 Spring Boot 应用程序(使用 Actuator)。如果我使用 docker-compose 启动应用程序,为每个容器指定主机和容器端口,那么它们会在 Consul 中正确注册并很快被标记为健康。
spring:
application:
name: myapp-A
profiles:
active: default
cloud:
consul:
enabled: true
host: consul
port: 8500
discovery:
prefer-ip-address: true
healthCheckUrl: http://docker-host:${server.port}/health
“consul”和“docker-host”的主机地址值在启动时作为 docker-compose yml 文件中的环境变量传入,简单来说,与 docker 主机的 IP 地址相关(我在同一台服务器)。
另请注意使用:
${server.port}
变量告诉 Consul 如何连接回容器以检查其健康状况(在这方面它只是使用 Actuator)。这需要是外部可访问的地址和端口,以便 Consul 可以检查服务。
当我在 docker-compose 文件中为容器指定主机和容器端口号时,这一切都很好。
我已经到了想要扩展一些容器的地步,但是当我尝试执行
docker-compose up -d --scale myapp-A=5
命令它告诉我这是不可能的,因为已指定主机端口。如果我将 docker-compose yml 文件更改为仅定义容器端口,并让主机端口动态分配,那么这一切都会出错,因为 Consul(在外部运行)获得了错误的 URL 来连接并将容器标记为不良。
我的问题是如何告诉 Consul 动态和“外部”公开的端口号,以便在容器内运行的应用程序中使用?
有没有办法在创建时获取端口号并将其传递到容器中?
如果可以的话,我想尝试使用 Compose 来破解它(而不是使用 Swarm,或者通过在同一组容器中的另一个容器中运行 Consul)。