让外部容器了解多个docker-compose项目

时间:2017-04-29 09:12:27

标签: docker-compose

我有一个多客户端设置,每个客户端都有类似的应用程序堆栈。为了简化它,我们假设一个典型的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

1 个答案:

答案 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>