在不同的docker集装箱中无缝地托pipe网站的不同部分

我有一个网站,我正试图转换为docker解决scheme。

网站的一部分是CMS(特别是WordPress),还有一些目前由tomcat处理的Java web应用程序。

目前的做法是我有一个官方的WordPress容器和一个官方的Tomcat容器。 我将自定义内容加载到WordPress(通过一个不是真正属于这个问题一部分的MySQL容器),并将WAR文件加载到Tomcat中。

所以问题是这样的:WordPress网站的部分链接到Java应用程序。 以前,其中一些链接是相对链接,就像/Application1一样简单,用户可以访问Java应用程序。

现在,因为它们被托pipe在不同的容器中,所以我不能这样做,因为WordPress容器中没有任何名为“Application1”的东西。 我已经用这样的RewriteRules修改了WordPress容器的htaccess文件:

 # Tomcat exposes port 8085 RewriteRule ^.*Application1/(.*)$ http://localhost:8085/Application1/$1 [R,L] 

但是这意味着如果用户在wordpress中点击Application1的链接,他们的浏览器就会把它们redirect到localhost:8085 – 如果你在本地运行这个容器集合,但是不能用于远程用户,那么这个工作正常。

我可以将localhost更改为将运行的服务器的实际名称。 但是,这将需要手动更新此堆栈将运行的每个服务器,或重置为本地主机的开发人员。

我可以将WordPress和Tomcat结合到一个容器中,但是我们希望将它们分开,以便在我们需要升级时,只需更改我们正在提取的容器的版本,而不必从头重新构build自定义容器。

有没有一个更无缝的方式来做到这一点,以便用户的浏览器中的URL永远不会改变? 有没有办法让这个工作,以便远程用户甚至不知道该网站的不同部分被托pipe在不同的容器?

假设你在开发和生产中做docker-compose,你用相应上游的servicenamereplacelocalhost

可以说,你有3个容器:httpd,fpm(wordpress)和java(tomcat)。 你configurationhttpd,如果domain.tld / phpredirect到fpm:9000如果请求是domain.tld / Application1,则redirect到java:8086

所有你需要明白的是,你在docker-compose中的实际服务名称是作为容器(所有容器)中的主机名提供的 – 因此容器可以使用另一个容器的服务名称来访问它自己 – 这使得inter容器通信非常容易且可预先configuration,而无需知道实际的容器IP(在开发/生产和主机迁移期间将会改变)

我想我知道了:我应该使用代理而不是RewriteRule。

这似乎得到了我想要的:

 ProxyPass "/Application1" "http://my-tomcat-server:8080/Application1" ProxyPassReverse "/Application1" "http://my-tomcat-server:8080/Application1"