Docker-compose,将war部署到Tomcat,运行oracle服务

时间:2017-01-18 10:05:48

标签: tomcat docker deployment docker-compose

鉴于我有以下情况:

我想将Web应用程序部署到Tomcat,Tomcat连接到oracle数据库并向用户显示数据

我需要的是以下内容:

  • Docker撰写yml

  • Tomcat docker image - war部署在这里

  • Oracle docker image

  • fatdb jar部署 - 我有liquibase脚本更新db schema打包为fatdb jar

解决方案可能是:

version: '2'
services:
  web-tomcat:
    image: tomcat:jre8
    depends_on:
      - db-oracle
  db-oracle:
    image: wnameless/oracle-xe-11g

但是,有多个问题需要解决:

  1. 等待oracle服务准备好 - 使用docker docs中建议的等待包装器解决:wait-for-it
  2. 等待用户创建 - 通过等待循环解决,尝试连接到创建用户的oracle db
  3. 等待liquibase fatdb部署准备的db模式,然后将war部署到tomcat
  4. 没有结束的情况我启动单独的容器来进行fatdb部署,之后它会保持在Exited(0)状态,因为fatdb部署是一次性的,而不是服务
  5. 我最终创建了entrypoint.sh脚本,以便在战争部署之前准备好db:

    java -jar fatdb.jar update
    catalina.sh run
    

    并覆盖tomcat图像中的入口点

    在docker-compose战争部署之前,如何准备数据库架构是否有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

我不知道它是否比你现在拥有的“更好”,但我总是认为我有两个部署来完成我的应用程序。我有:

  1. 数据库部署(包括使用Liquibase等更新架构到最新版本)
  2. 应用程序部署(包括部署最新版本的WAR存档或打包)
  3. 当然,第二次部署取决于第一次部署是否完成且成功。

    那么我如何使用docker-compose对其进行建模?我是为了清楚,所以我创建了两个文件:

    1. 搬运工-compose.database
    2. 搬运工-compose.application
    3. 然后我有一个两步部署过程:

      第1步:

      docker-compose -p application-name -f docker-compose.database up -d database
      docker-compose -p application-name -f docker-compose.database run --rm database-migration
      

      首先,我们使用docker-compose up启动数据库。其次,我们运行数据库迁移。

      正如您在问题中指出的那样,docker-compose up返回后数据库实际上已“准备好”会有延迟,因此数据库迁移逻辑将包含在仅运行迁移一次的数据库检查功能中我们很高兴数据库可用。您会注意到我使用--rm选项调用我的数据库迁移容器,这意味着容器在完成执行后会自动删除。一旦完成工作,就不需要让这个容器闲置。

      此处使用docker-compose提供的-p选项也很重要。这指定了部署的project name,并确保在同一docker network上创建所有容器,这意味着按服务名称进行的容器间通信不是问题。

      第2步:

      docker-compose -p application-name -f docker-compose.database -f docker-compose.application up -d application
      

      Docker Compose允许您在命令行上指定多个撰写文件,这就是我在这里所做的。在我的docker-compose.application文件中,我会有类似的内容:

      version: 2
      services:
       application:
        image: my-tomcat-image
        depends_on: database
      

      数据库服务在docker-compose.database文件中定义,我知道它现在已经在运行(因为部署步骤1完全成功)。因此,我可以立即启动Tomcat服务,而无需等待任何事情。这有助于因为我只有一次“等待数据库就绪逻辑”,即数据库迁移。 Tomcat服务本身期望数据库存在,如果不存在,则快速失败。

      步骤周围的包装

      这种方法的明显缺点是,运行部署时突然需要多个命令。每当您尝试进行任何形式的基础架构编排时,这种挑战总是会引起人们的注意,因为服务之间存在依赖关系。

      同样,你可以通过编写一个简单的shell脚本来包装docker-compose命令来保持简单。我喜欢能够对任何包装脚本进行单元测试,所以我倾向于使用ruby来做类似的事情。然后你可以想象:

      ruby deploy.rb
      

      deploy.rb脚本当然包装了多个docker-compose命令。

      其他好方法是使用Jenkins或任何其他CI / CD管道工具为您执行此操作(感谢您可能希望在本地计算机上执行此操作)。

      您也可以开始查看像Terraform这样的工具,这些工具提供了一种“标准化”的方法来处理这样的事情,但是当一个简单的包装脚本可以帮助你时,你可能需要过度杀戮并且正在运行。