鉴于我有以下情况:
我想将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
但是,有多个问题需要解决:
我最终创建了entrypoint.sh脚本,以便在战争部署之前准备好db:
java -jar fatdb.jar update
catalina.sh run
并覆盖tomcat图像中的入口点
在docker-compose战争部署之前,如何准备数据库架构是否有更好的解决方案?
答案 0 :(得分:1)
我不知道它是否比你现在拥有的“更好”,但我总是认为我有两个部署来完成我的应用程序。我有:
当然,第二次部署取决于第一次部署是否完成且成功。
那么我如何使用docker-compose对其进行建模?我是为了清楚,所以我创建了两个文件:
然后我有一个两步部署过程:
第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这样的工具,这些工具提供了一种“标准化”的方法来处理这样的事情,但是当一个简单的包装脚本可以帮助你时,你可能需要过度杀戮并且正在运行。