我有一个多客户端设置,每个客户端都有类似的应用程序堆栈。为了简化它,我们假设一个典型的tomcat web应用程序正在使用db。
客户端必须彼此完全隔离,每个客户端都有其应用程序堆栈,包括独立的tomcat)。
通过AJP将httpd映射域上的 VirtualHost
配置到相应的tomcat实例。
例如:
client1.example.com -> 172.18.0.2:8009
client2.example.com -> 172.19.0.2:8009
我发现docker-compose
在每个客户端都非常有用。我喜欢的一件事是,它甚至负责为每个客户端创建私有子网,并且该客户端中的容器甚至不需要知道其他容器的IP地址,但可以使用由{{自动设置的别名1}}配置。非常整洁。
links
现在问题。 httpd(我也想要dockerize)需要为所有客户端访问tomcat。但是,它不知道他们的IP。
如何在httpd
clients
client1
docker-compose.yml
tomcat
db
client2
docker-compose.yml
tomcat
db
中实现此映射?即如何解决下面的问号?
VirtualHost
我尝试过的一件事是拥有一些全局的env文件,所有子网和IP都是显式的,例如:
<VirtualHost *:443>
ServerName client1.example.com
..
ProxyPass / ajp://?????:8009/
..
</VirtualHost>
并在每个客户端的yml和httpd yml中使用它。 但这很丑陋,因为yml中的自定义IP配置要么是全部服务,要么不服务。我希望我可以为tomcat设置一个并让其他人自动,但它们最终会重叠。突然之间,为所有服务和所有客户指定IP配置,使整个事情变得不那么优雅。
我也知道可以像这样检查容器的IP:
CLIENT1_TOMCAT=172.18.0.2
CLIENT2_TOMCAT=172.19.0.2
但是,这需要容器已经存在。此外,如果我使用此方法,则每次重新创建容器时都必须修改httpd的配置,因为它可能会更改IP。
我想不知怎的,我会像httpd的yml一样“包含”客户端的那些,以便它可以了解他们的子网。仍然,保持客户的子网分离。
知道我应该如何处理这个问题吗?
更新 基于@ tcnj答案的工作设置:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' client1_tomcat
的内容:
httpd/docker-compose.yml
答案 0 :(得分:2)
解决问题的最简单方法是将httpd放在客户端网络的所有上,然后按名称引用tomcat容器。
例如:
您的client1具有网络client1_default,并且容器为client1_tomcat。 您还有client2,网络client2_default,容器client2_tomcat。
如果您从命令行启动httpd,则可以在图像名称之前将--network client1_default --network client2_default
添加为docker run
的额外选项。如果您正在使用docker compose for httpd,那么您可以使用以下内容:
httpd:
...
networks:
- client1_default
- client2_default
...
在您的httpd配置中,您可以拥有:
<VirtualHost *:443>
ServerName client1.example.com
...
ProxyPass / ajp://client1_tomcat:8009/
...
</VirtualHost>
<VirtualHost *:443>
ServerName client2.example.com
...
ProxyPass / ajp://client2_tomcat:8009/
...
</VirtualHost>