我的雇主有兴趣使用 Docker 来容器化他们的 Web 应用程序。我们使用 AWS EC2 来托管我们的应用程序,该应用程序运行服务于多个 WAR 的 Tomcat。我是 Docker 新手,需要弄清楚如何最好地处理这个问题。
据我了解,让单个 Docker 容器运行多个 Web 应用程序是不合适的。因此,对于每个应用程序,我应该从 Tomcat 基础镜像构建一个容器,然后将 WAR 复制到 tomcat/webapps 目录,就像 Dockerfile 中的那样:
FROM tomcat:9.0.44-jdk11-openjdk
COPY ./target/my-app-1.00-SNAPSHOT.war $CATALINA_HOME/webapps/my-app.war
足够简单,效果很好。但是Tomcat镜像是440MB。因此,如果 Tomcat 当前运行 5 个 WAR 文件,每个文件大小为 50 MB 左右,并且每个文件都有自己的容器运行 Tomcat,那么每个应用程序的大小都会增加十倍。看来……效率确实很低。这真的是使用 Docker 容器的成本吗?我怎样才能最大限度地减少这种情况?
我也不确定如何处理端口。现在端口 8080 已映射到 subdomain.mydomain.com。但每个容器显然都会在不同的端口上运行。假设我在端口 8080 上启动 my-app-1 的容器,在 8081 上启动 my-app-2 的容器。我如何允许用户简单地导航到 subdomain.mydomain.com/my-app-1,和 subdomain.mydomain.com/my-app-2?
最佳答案
磁盘存储
Docker 镜像基本上是使用 specification 安装的层列表(参见 union filesystem ) (通常 overlay2 ),这大大减少了所需的物理存储量。较低层是只读的,可以在容器之间共享。
对于 5 个不同的应用程序,您只需要 50 * 5 + 440 MiB。与当前配置的唯一区别是大约 50 MiB 的 Debian 镜像(参见 repo info )。您可以通过将应用程序中使用的公共(public)库导出到 Tomcat 的公共(public)类加载器并创建由应用程序共享的 Docker 镜像来进一步减少它:无论如何,每个 Tomcat 都会有一个应用程序,因此可以保证应用程序之间的隔离。
内存
与当前配置的主要区别是内存消耗:您将运行 5 个 JVM + Tomcat 的库。
网络配置
在内部,每个容器都会监听相同的端口,但位于不同的私有(private)地址(附加到虚拟网络设备,参见 networking )。 Docker 可以配置从主机系统上的端口到 Docker 容器的端口转发 (NAT),但这仅在您想要从 Internet 直接访问容器中运行的服务时才有用。/p>
在您的情况下,您更需要在主机系统上运行反向代理,例如NGINX或Apache Http Server。这将为您的 URL 命名空间提供相当于联合文件系统的功能。 反向代理的选择取决于个人喜好: 然而,Tomcat 正在慢慢放弃 AJP,转而采用纯 HTTP(参见 this talk )。
mod_jk
或更新的 mod_proxy_ajp
模块),该协议(protocol)会将客户端连接的每个细节转发到 Tomcat,无需任何配置。RemoteIpValve
和SSLValve
.
关于amazon-web-services - 对 EC2 : Optimizing container size, 上托管的多个 Web 应用程序进行 Docker 化并处理端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66973386/