tomcat - 如何将传出主机/端口从容器映射到不同的端口

标签 tomcat docker mariadb

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

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

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

我可以更改单个图像,以便它可以与两个实例一起使用,但我仍然需要一个具有单个 JDBC url 的图像。对于第一个容器对,它必须到达在 3306 上运行的原始 mariadb 实例。第二个容器对,即使它指定了端口 3306,也必须连接到端口 3307。

这是通过“--link”命令行选项以某种方式完成的吗?

更新:

如果现有的应用程序没有运行,这会更容易,我可以破解它直到它工作。我必须确保我小心翼翼地完成这一步,以尽量减少干扰。我必须对图像源代码进行一项更改,即 context.xml 文件中的 JDBC url。我将其更改为“jdbc:mysql://db:3306/estimatordb”。

虽然我在我的桌面上(或在 Jenkins 实例上)使用 Gradle 构建应用程序 WAR 文件,但 Docker 镜像仅在 Jenkins 实例上构建。我一直在 systemd 文件中的目标主机上运行容器,只是执行“docker run ...”。在 Jenkins 构建中,我通过 ssh 执行图像名称的“docker pull”,然后执行“docker stop”以停止现有容器,以便它使用新图像重新启动。

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

我的“docker-compose.yml”文件是我项目中的一个源文件,所以我想我会做一个“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 上下文中)。有关这方面的更多信息,请查看 the great manifesto of the 12 factor app , 特别是 the section on configuration .

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

但这还不是完整的解决方案。当您考虑将 tomcat 容器与数据库组合为一个部署时,您可以利用 docker 虚拟网络并连接这样的设置,甚至无需向外界发布数据库的端口。当两个容器在同一个网络中时,您可以使用它们的给定名称来引用它们,这样您的数据库在 docker 虚拟网络中始终可以作为 mydatabase:3306 访问。当使用像 docker-compose 这样的系统为您处理此类命名空间并允许您将整个堆栈定义为一个 compose 文件时,这尤其容易。请看the getting started for docker-compose这正是通过访问 Redis 实例的 Python 应用程序实现的。

关于tomcat - 如何将传出主机/端口从容器映射到不同的端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45925985/

相关文章:

javascript - Ajax 请求在 spring-mvc 项目中不起作用

java - Tomcat 应用程序和存储在数据库中的全局变量。用于维护服务器和应用程序的管理器应用程序

google-chrome - 在 Apache Tomcat 中部署的 Webapp 登录失败

docker - 通过 jenkins 用新建的镜像重启 Docker 容器(在容器中运行)

mysql - 对于表a中的每条记录,返回表b中日期最接近但大于现在的记录NOW()

php - Laravel 5 原始选择查询不返回任何内容

java - 如何强制 CLOSE_WAIT 停止

spring - 读取 spring 配置 xml 中的上下文参数值

node.js - 即使设置了 -L,Docker Nodemon 也不会在更改时重新加载

docker - Docker-Compose:Tomcat应该等待启动直到(My)SQL Dump准备就绪