Docker 实战案例解析,实现自动化数据库迁移

640?wx_fmt=jpeg

出品丨Docker公司(ID:docker-cn)

编译丨小东

每周一、三、五晚6点10分  与您不见不散


说在前面


在 Phorest Salon Software 公司,我们是在 AWS 上运行我们的平台。该平台由 VPC 内的许多 AWS 资源(实例,数据库)组成。我们的大部分服务都运行在由亚马逊 ECS 管理的 Docker 容器上。

&


迁移的挑战


我们有三个专用环境:开发、分段构建和生产。每个环境都有自己的专用 VPC,因此 VPC 中的资源不能直接从外部访问,通常来说这是很好的。

问题是我们有时需要修改某些组件的模式结构,例如:添加一个新的表或列。在 Java-ish 中,我们使用 Liquibase 来管理 DDL / DML 的更改。同样的,通常来说这是很好的。但是我们要如何才能使这些更改通过持续交付的方式应用到各个不同的环境中呢?


我们针对上述问题,提出了几种解决方法:


1、在启动时执行


您可以让您的组件执行此操作。例如,您可以将应用程序配置为在启动时应用它。对于 Spring Boot 应用程序来说,这非常简单。您只需将 liquibase jar 添加到环境变量并配置一些配置属性即可实现此目的。


这种方法对于在本地的开发或开发环境来说可能是很好的,但是对于分段构建或生产呢?问题在于,您的数据库迁移脚本可能很慢,执行它们可能需要几分钟、几个小时甚至几天的时间。


对于上述情况,使用 ECS 的效果就不太理想了,因为在那里部署服务时,您定义了 ECS 将用于验证组件的运行状态,在执行数据库迁移脚本的情况下启动它,会导致整个迁移过程被认为是不健康的。而且 ECS 可能会在迁移过程中杀死您的容器。您可以为 ECS 服务配置一个宽限期,但这可能很难预测到它的值,因为每个迁移都可能不同。


2、手动应用


另一种选择是 SSH 连接到与服务在同一个 VPC 中运行的EC2实例,并从那里手动运行迁移脚本(你可能知道这种做法有多糟糕)。


3、使用 docker 容器


另一个选择是创建一个专用的 docker 镜像来运行迁移脚本。我们选择了这个选项:


定义 docker 镜像:


640?wx_fmt=png


我们使用了一个开源的基础镜像,它为我们提供了一种执行 Liquibase 更改日志的方法。我们所要做的就是定义一些环境变量并将 Liquibase 更改日志复制过去。空变量是故意放进去的,以便大家在运行容器时记得替换掉它们。

640?wx_fmt=png

我们将镜像定义文件与我们的代码库一起存储,因此在发布时会对其进行版本控制和标记。有了这一点,我们更新了 Jenkins 的工作,作为工作流程的一部分来构建和推动新的 docker 镜像。


下一步是更新 Jenkins 的工作来触发使用我们的新镜像迁移数据库的 ECS 任务。为此,我们使用了自己的框架,但您可以使用 Terraform 或K8s,或者您甚至可以使用以下命令手动运行它(请不要在生产中执行!)

 

docker run your-image-tag liquibase update

 

640?wx_fmt=png

使用新步骤构建管道

640?wx_fmt=png


这种方法的好处


由于我们不在容器启动时运行迁移,所以我们不再有与长时间运行的迁移相关的问题,从而导致 ECS 运行状况检查失败。但好处是,我们的迁移现在已经与我们的部署分离了(这是一篇很好的文章,解释了从应用程序部署中分离数据库迁移的好处)。


使用这种新方法,我们必须确保我们的迁移始终与当前在生产中运行的代码兼容。它需要一些额外的工作,但现在意味着我们可以毫不费力地回滚我们的版本。

 

解决这个问题可能还有许多其他(也许更好)的方法,但是这种方法对我们更有效。如果你对这个话题有任何想法或想法可以在文尾处留言与我们探讨。

640?wx_fmt=png


点击下列标题,阅读更多干货



如果本文对你有帮助,欢迎分享到朋友圈!获取更多Docker实用技巧,扫描下图二维码!

    640?wx_fmt=png

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
Jenkins和Docker与GitLab结合使用,可以实现自动化部署流程。以下是实现自动化部署的步骤: 1. 创建GitLab仓库:在GitLab中创建一个仓库,用于存放项目代码。 2. 设置Webhook:在GitLab仓库的设置中,配置Webhook,将其与Jenkins服务器关联起来。这样在GitLab中代码更新时,会触发Webhook,通知Jenkins执行构建任务。 3. 安装Jenkins:在服务器上安装Jenkins,并配置相应的插件,如Docker Pipeline插件。 4. 创建Jenkins Pipeline:在Jenkins中创建Pipeline,此Pipeline包含了构建、测试和部署的各个阶段。通过Jenkinsfile,可以定义Pipeline的各个阶段的具体步骤和顺序。 5. 执行构建任务:当GitLab仓库中的代码发生变化,Webhook会通知Jenkins服务器执行构建任务。Jenkins会拉取代码,并执行构建过程,如编译、运行测试等。 6. 打包Docker镜像:构建成功后,Jenkins会使用Docker Pipeline插件打包Docker镜像,将应用程序和其依赖项封装到一个镜像中。 7. 推送镜像到镜像仓库:Jenkins会将构建好的Docker镜像推送到镜像仓库,如Docker Hub或私有的Docker Registry中。 8. 部署到生产环境:一旦镜像推送完毕,Jenkins可以触发部署任务将镜像部署到生产环境中,可以使用Docker Compose或者Kubernetes进行容器编排和部署。 通过以上步骤,可以实现自动化部署流程,当代码发生变化时,Jenkins会自动执行构建任务、打包镜像和部署到生产环境,提高了部署的效率和可靠性。同时,使用Docker可以提供隔离性和可移植性,使得应用程序的部署更加方便和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值