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
但是,还是有许多问题需要解决:
- 等待oracle服务准备就绪 – 按照docker文档中的build议,用等待包装器解决: wait-for-it
- 等待用户被创build – 通过等待循环尝试连接到oracle数据库与用户被创build解决
- 等待由liquibase fatdb部署准备好的数据库模式,然后将战争部署到tomcat
- 没有结束的情况下,我旋转了单独的容器做fatdb部署,之后它将保持退出(0)状态,因为fatdb部署是一次性的事情,而不是服务
我最终创build了entrypoint.sh脚本,以便在战争部署之前准备好db:
java -jar fatdb.jar update catalina.sh run
并在Tomcat映像中重载入口点
是否有更好的解决scheme如何在warer部署之前准备数据库模式在docker-compose中?
我不知道它是否比现有的“更好”,但我始终认为我有两个部署来完成我的应用程序。 我有:
- 数据库部署(包括使用类似Liquibase的方式将模式更新到最新版本)
- 应用程序部署(包括部署我的WAR档案的最新版本或包装)
当然,第二次部署依赖于第一次部署的完成和成功。
那么如何用docker-compose来build模? 我都清楚,所以我创build两个文件:
- 泊坞窗,compose.database
- 泊坞窗,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这样的工具,它为这样的事情提供了一种“标准化”的方法,但是当一个简单的包装脚本可以启动并运行时,这可能会被过度杀死。