我有一个网站,我正在尝试转换为docker-compose解决方案。
网站的一部分是CMS(特别是WordPress),还有一些目前由tomcat处理的Java Web应用程序。
目前的方法是我有一个官方的WordPress容器和一个官方的Tomcat容器。我将自定义内容加载到WordPress中(通过MySQL容器,这不是这个问题的一部分)和WAR文件加载到tomcat中。
问题是这样的:
WordPress网站的部分内容包含指向Java应用程序的链接。以前,其中一些链接是相对链接,就像/Application1
一样简单,用户可以访问Java应用程序。
现在,由于它们托管在不同的容器中,我不能这样做,因为WordPress容器中没有任何名为“Application1”的东西。我用这样的RewriteRules修改了WordPress容器的htaccess文件:
# Tomcat exposes port 8085
RewriteRule ^.*Application1/(.*)$ http://localhost:8085/Application1/$1 [R,L]
但是这意味着如果用户在wordpress中单击Application1的链接,他们的浏览器会将它们重定向到localhost:8085
- 如果您在本地运行这组容器,它可以正常工作,但对远程用户不起作用。
我可以将localhost
更改为将运行的服务器的实际名称。但是,需要为每个运行此堆栈的服务器手动更新,或者为开发人员重置为localhost。
我可以将WordPress和Tomcat合并到一个容器中,但是我们希望将它们分开,这样当我们需要升级时,我们只需更改我们正在提取的容器的版本,而不必重建自定义容器。划伤。
是否有更无缝的方法来执行此操作,以便用户浏览器中的URL永远不会更改?有没有办法使这个工作,以便远程用户甚至不知道该网站的不同部分托管在不同的容器?
答案 0 :(得分:0)
假设你在开发和生产中进行了docker-compose,你将localhost
替换为相应上游的servicename
。
可以说,你有3个容器:httpd,fpm(wordpress)和java(tomcat)。您配置httpd,如果其domain.tld / php重定向到fpm:9000
,如果请求是domain.tld / Application1,则重定向到java:8086
。
您需要了解的是,您在docker-compose中拥有的实际服务名称可以作为容器中的主机名(所有容器)使用 - 因此容器可以使用另一个容器的服务名称来访问自己 - 这使得容器间通信变得非常简单和可预先配置,而不需要知道实际的容器IP(在开发/生产和主机迁移期间会发生变化)
答案 1 :(得分:0)
我想我明白了:我应该使用代理而不是RewriteRule。
这似乎让我得到了我想要的东西:
ProxyPass "/Application1" "http://my-tomcat-server:8080/Application1"
ProxyPassReverse "/Application1" "http://my-tomcat-server:8080/Application1"