Tomcat 如何将传出主机/端口从容器映射到其他端口

Tomcat 如何将传出主机/端口从容器映射到其他端口,tomcat,docker,mariadb,Tomcat,Docker,Mariadb,我有一个连接到mariadb数据库的小型Web应用程序。我在一个容器中运行Tomcat,在另一个容器中运行mariadb。Tomcat使用Context.xml文件中指定的JDBC url引用mariadb实例,指定当前fqhn和端口3306 我现在必须复制这个配置,这样我就有了两个webapp实例,包括四个容器,两个运行Tomcat,两个运行Mariadb。在“docker run”上进行简单的端口映射非常简单,这样每个Tomcat实例都可以通过不同的端口访问,mariadb实例也是如此 我不

我有一个连接到mariadb数据库的小型Web应用程序。我在一个容器中运行Tomcat,在另一个容器中运行mariadb。Tomcat使用Context.xml文件中指定的JDBC url引用mariadb实例,指定当前fqhn和端口3306

我现在必须复制这个配置,这样我就有了两个webapp实例,包括四个容器,两个运行Tomcat,两个运行Mariadb。在“docker run”上进行简单的端口映射非常简单,这样每个Tomcat实例都可以通过不同的端口访问,mariadb实例也是如此


我不清楚的是如何将传出主机:端口引用从Tomcat容器映射到mariadb实例。图像中的Context.xml文件使用当前完全限定的主机名和默认端口3306指定数据库的JDBC url

我有能力更改单个映像,以便它可以同时处理两个实例,但我仍然必须有一个带有单个JDBCURL的单个映像。对于第一个容器对,它必须到达3306上运行的原始mariadb实例。第二个容器对,即使指定端口3306,也必须连接到端口3307

这是通过“-link”命令行选项实现的吗

更新

如果一个现有的应用程序没有运行,这会更容易,我可以通过黑客攻击直到它工作。我必须确保仔细地完成这一过程,以尽量减少干扰。我必须对图像源代码做一个更改,即context.xml文件中的JDBCURL。我把它改为“
jdbc:mysql://db:3306/estimatordb

尽管我在桌面(或Jenkins实例)上使用Gradle构建应用程序WAR文件,Docker映像只构建在Jenkins实例上。我一直在一个systemd文件中运行目标主机上的容器,只是在执行“docker run…”。在Jenkins构建中,我通过ssh对映像名执行“docker pull”,然后执行“docker stop”以停止现有容器,这样它将使用新映像重新启动

在此期间,我将更改我构建的映像名称(只是在名称中添加“2”),现在我将注释掉“ssh docker stop”。我不确定这会转化成什么。显然,“docker compose stop”是一个起点,但是如果我在这个构建中对compose文件进行更改,这会让人感到困惑

我的“docker compose.yml”文件是我项目中的一个源文件,所以我想我将在我的compose文件中执行一个“ssh docker compose-f-”

以下是我为“docker compose.yml”文件准备的内容,但我根本没有验证这一点:

version: '2'
services:
  estimator:
    image: tomcat-estimator2
    ports:
      - "8889:8080"
      - "445:443"
    volumes:
      - /etc/localtime:/etc/localtime
    depends_on:
      - db
    links:
      - db:db
  db:
    image:  mariadb:10.1.22
    ports:
      - "3307:3306"
    volumes:
      - /etc/localtime:/etc/localtime
      - /opt/app/estimator/databases/estimator/mysql:/var/lib/mysql  
  estimator-automation:
    image: tomcat-estimator2
    ports:
      - "8890:8080"
      - "446:443"
    volumes:
      - /etc/localtime:/etc/localtime
    depends_on:
      - db-automation
    links:
      - db-automation:db
  db-automation:
    image:  mariadb:10.1.22
    ports:
      - "3308:3306"
    volumes:
      - /etc/localtime:/etc/localtime
      - /opt/app/estimator/databases/estimator-automation/mysql:/var/lib/mysql
请注意,端口号是1+现有应用程序的端口号,因为我不想将其降低,直到我确定这会起作用


关于这一点的任何评论都会很有用。

一般来说,这些用例(如指定运行应用程序所需的资源)通常是通过提供一种方式来处理的(尤其是在docker上下文中),例如通过命令行参数或通过环境传递此类信息。有关这方面的更多信息,请查看,尤其是

对于您的具体问题,我确信有一些方法可以将这些信息注入tomcat配置,例如。因此,您可以通过在不同端口上运行两个数据库容器并将相应的连接字符串传递给两个tomcat容器来解决问题


但这还不是完整的解决方案。当您考虑将tomcat容器与数据库组合作为一个部署时,您可以利用docker虚拟网络连接这样的设置,而无需将数据库端口发布到外部世界。当两个容器位于同一网络中时,您可以使用它们的给定名称引用它们,以便在docker虚拟网络中始终可以访问您的数据库,如
mydatabase:3306
。当使用docker compose这样的系统为您处理这样的名称空间并允许您将整个堆栈定义为一个compose文件时,这尤其容易。请看一看,在python应用程序访问redis实例时,它正是这样做的。

您可以使用
-v
选项将一个唯一的
context.xml
绑定到每个容器

例如,在主机上:

$ mkdir /tmp/container
$ cd /tmp/container
$ vi container1_context.xml # Edit JDBC url
$ vi container2_context.xml # Edit JDBC url
$ docker run ... -v /tmp/container/container1_context.xml:<path/to/context.xml> tomcat
$ docker run ... -v /tmp/container/container2_context.xml:<path/to/context.xml> tomcat
$mkdir/tmp/container
$cd/tmp/集装箱
$vi container1_context.xml#编辑JDBC url
$vi container2_context.xml#编辑JDBC url
$docker运行-v/tmp/container/container1_context.xml:tomcat
$docker运行-v/tmp/container/container2_context.xml:tomcat

一个Web应用程序在端口3306上连接到数据库,另一个在端口3307上连接到数据库,这有什么特殊原因吗?如果我正确地回答了您的问题,那么应用程序和数据库之间存在1-2-1映射?也许我不清楚。它是一个webapp和两个webapp实例。图像中的Context.xml文件指定端口3306。我可以运行tomcat的两个实例和mariadb的两个实例,这样它们的侦听端口就不会冲突,但是webapp的两个实例都在尝试无条件地连接到端口3306上的数据库。我需要让其中一个tomcat容器透明地将3306端口的访问映射为3307端口。大卫,这是漫长的一天,但要确认:3306端口上的容器a->数据库a和3306端口上的容器B->数据库B?这里的端口冲突是因为您通过主机上绑定的端口将应用程序连接到数据库,例如,
docker run-p 3307:3306
?映像中的Context.xml文件的JDBC url为“JDBC:mysql://:3306/db”。这在应用程序的一个实例(包括两个容器)中运行良好。我需要使用相同的图像来运行两个additi