Docker构build,部署war到Tomcat,运行oracle服务

鉴于我有以下情况:

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

我需要的是以下几点:

  • Docker撰写yml

  • Tomcat泊坞窗图像 – 战争部署在这里

  • Oracle泊坞窗图像

  • fatdb jar部署 – 我有liquibase脚本更新数据库架构打包为fatdb jar

解决scheme可能是:

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

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

  1. 等待oracle服务准备就绪 – 按照docker文档中的build议,用等待包装器解决: wait-for-it
  2. 等待用户被创build – 通过等待循环尝试连接到oracle数据库与用户被创build解决
  3. 等待由liquibase fatdb部署准备好的数据库模式,然后将战争部署到tomcat
  4. 没有结束的情况下,我旋转了单独的容器做fatdb部署,之后它将保持退出(0)状态,因为fatdb部署是一次性的事情,而不是服务

我最终创build了entrypoint.sh脚本,以便在战争部署之前准备好db:

 java -jar fatdb.jar update catalina.sh run 

并在Tomcat映像中重载入口点

是否有更好的解决scheme如何在warer部署之前准备数据库模式在docker-compose中?

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

  1. 数据库部署(包括使用类似Liquibase的方式将模式更新到最新版本)
  2. 应用程序部署(包括部署我的WAR档案的最新版本或包装)

当然,第二次部署依赖于第一次部署的完成和成功。

那么如何用docker-compose来build模? 我都清楚,所以我创build两个文件:

  1. 泊坞窗,compose.database
  2. 泊坞窗,compose.application

然后我有两个步骤的部署过程:

步骤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构build数据库。 其次,我们运行数据库迁移。

正如你在你的问题中所指出的那样,在docker-compose up返回之后,数据库实际上将被“准备好”,所以数据库迁移逻辑被封装在数据库检查函数中,只有在我们快乐的时候才运行迁移数据库可用。 你会注意到我用--rm选项来调用我的数据库迁移容器,这意味着容器在完成执行后会被自动删除。 一旦完成工作,就不需要将这个容器悬挂起来。

在这里使用docker-compose提供的-p选项也很重要。 这指定了部署的project name ,并确保所有容器都在同一个docker network创build,这意味着通过服务名称的容器间通信不成问题。

第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服务本身期望数据库在那里,如果不是,则快速失败。

在步骤周围包装

这种方法的明显缺点是,运行部署需要突然执行多个命令。 这是一个挑战,无论何时你试图做任何forms的基础架构编排,就像这个服务之间存在依赖关系一样,这个挑战总是会引起人们的注意。

再次,您可以通过编写一个简单的shell脚本来包装docker-compose命令来保持简单。 我喜欢能够unit testing任何包装脚本,所以我倾向于使用ruby的东西。 那么你可以想象一下:

 ruby deploy.rb 

deploy.rb脚本当然包括你的多个docker docker-compose命令。

其他好的方法就像使用Jenkins或任何其他CI / CDpipe道工具为你做的一样(欣赏你可能希望在你的本地机器上这样做)。

你也可以开始看看像Terraform这样的工具,它为这样的事情提供了一种“标准化”的方法,但是当一个简单的包装脚本可以启动并运行时,这可能会被过度杀死。