amazon-web-services - 对 EC2 : Optimizing container size, 上托管的多个 Web 应用程序进行 Docker 化并处理端口

标签 amazon-web-services docker tomcat networking amazon-ec2

我的雇主有兴趣使用 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>

在您的情况下,您更需要在主机系统上运行反向代理,例如NGINXApache Http Server。这将为您的 URL 命名空间提供相当于联合文件系统的功能。

反向代理的选择取决于个人喜好:

  • Apache2 可以使用 AJP 协议(protocol)(​​通过 mod_jk 或更新的 mod_proxy_ajp 模块),该协议(protocol)会将客户端连接的每个细节转发到 Tomcat,无需任何配置。
  • NGINX 较小,仅与 HTTP 通信,因此您需要配置 RemoteIpValveSSLValve .

然而,Tomcat 正在慢慢放弃 AJP,转而采用纯 HTTP(参见 this talk )。

关于amazon-web-services - 对 EC2 : Optimizing container size, 上托管的多个 Web 应用程序进行 Docker 化并处理端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66973386/

相关文章:

python-3.x - 使用 boto3 验证 AWS 凭证

c - Linux 系统调用 clock_settime(...) 在 Docker 容器中因 EPERM 失败

java - 如何使用 java -server 选项运行 tomcat 服务?

java - 替换在 contextConfigLocation 参数中配置的 xml 中的占位符时出现问题

ssh - docker容器中基于端口的路由

tomcat - tomcat 日志中 SLF4JBridgeHandler 中的处理程序错误

mysql - AWS RDS 错误 2003

amazon-web-services - 如何修复 aws 区域错误 "ValueError: Must setup local AWS configuration with a region supported by SageMaker"

php - Laravel 与 MySQL 的连接在迁移时有效,但在 Controller 中无效

docker - 如何配置 docker/docker-compose 默认使用 Nexus 而不是 docker.io?