如何将一个外出的主机/端口从一个容器映射到另一个端口

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

我现在必须复制这个configuration,这样我就有两个webapp的实例,包括四个容器,两个运行的Tomcat和两个正在运行的Mariadb。 在“docker run”上执行简单的端口映射是很容易的,这样每个Tomcat实例都可以通过不同的端口访问,对于mariadb实例也是如此。

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

我有能力改变单个图像,所以它可以使用这两个实例,但我仍然必须有一个单一的JDBCurl的图像。 使用第一个容器对,它必须到达在3306上运行的原始mariadb实例。第二个容器对,即使指定了端口3306,也必须连接到端口3307。

这是用“–link”命令行选项完成的吗?

更新

如果现有的应用程序没有运行,这将会更容易,我可以直接破解它,直到它正在工作。 我必须确保我仔细地通过这一点,以尽量减less干扰。 我必须对图像源代码进行一次更改,作为context.xml文件中的JDBC url。 我改变了“ jdbc:mysql://db:3306/estimatordb ”。

尽pipe我在桌面上(或在Jenkins实例上)使用Gradle构build了应用程序WAR文件,但Docker图像仅构build在Jenkins实例上。 我一直在系统文件中的目标主机上运行容器,只是做“docker运行…”。 在Jenkins构build中,通过ssh执行映像名称的“docker pull”,然后执行“docker stop”来停止现有容器,以便重新启动新映像。

在此期间,我将更改我创build的图像名称(只需在名称中加上“2”),现在我正在注释“ssh docker stop”。 我不确定那会是什么意思。 显然,“docker-compose stop”是一个起点,但是如果我在这个版本中对组合文件进行了更改,那么这会变得混乱。

我的“docker-compose.yml”文件是我的项目中的一个源文件,所以我想我会做一个“ssh docker-compose -f – ”,在我的撰写文件中滚动。

以下是我一起为“docker-compose.yml”文件抛出的,但是我没有完全validation过这个:

 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上下文中)。 有关这方面的更多信息,请查看12因子应用程序的伟大宣言 ,尤其是configuration部分 。

对于你的具体问题,我敢肯定有办法将这个信息注入到tomcatconfiguration中,例如在这个问题中 。 所以你可以通过在不同的端口上运行两个数据库容器来解决你的问题,并将相应的连接string传递给你的两个tomcat容器。

但是这还不是完整的解决scheme。 当你考虑把tomcat容器和数据库结合起来作为一个部署的时候,你可以利用docker虚拟networking并连接这样一个设置,甚至不需要将数据库的一个端口发布到外部世界。 当两个容器位于同一networking中时,可以使用它们的给定名称引用它们,以便在docker虚拟networking中始终可以使用mydatabase:3306访问数据库。 当使用像docker-compose这样的系统来处理这样的命名空间,并且让你将整个堆栈定义为一个组合文件时,这个工作特别容易。 请查看docker-compose的入门知识 ,它正是通过访问redis实例的python应用程序完成的。

您可以使用-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