咱们使用容器的方式部署数据库组件,特别是企业有大量的项目开发业务的,部署的开发、测试数据库组件较多时。常常会遇到如下问题:mysql
- 业务须要使用数据库,但部署完数据库后,须要在数据库中执行建立schema的操做或者一些初始化数据的建立。
- 开发测试多套部署环境,须要屡次重复1的步骤。
- 项目比较多,时间久了项目须要的数据库Schema不清楚。
- 项目交付时数据库Schema管理混乱。
如今若是是使用Go等语言研发的业务系统,都具有了ORM层自动初始化和更新Schema的能力,若是是这样本文对你无用。但目前大多数其余开发语言的业务都不具有这种能力。git
若是咱们把数据库也做为一个业务中的一个服务模块来管理的话,咱们但愿服务启动后便可直接完成Schema的初始化,直接提供数据服务能力。github
那么在Rainbond中如何达成这样的效果呢?sql
Schema初始化在传统模式中通常有两种方案:docker
- 在数据库启动后手动导入;人工经过客户端操做,没有自动化程度可言;
- 在业务服务启动时链接数据库进行初始化,依赖业务服务端的能力。
能够看出,这两种方式都存在各自的弊端,那么有没有方式可以让数据库启动时自动初始化指定的数据呢?答案是 有!数据库
咱们以MySQL为例, 官方对于 Docker 有着良好的支持,首先来看 Dockerhub上 Mysql官方镜像 的一段描述:bash
在数据库容器首次启动时,将建立一个指定名称的新数据库,并使用提供的环境变量对其进行初始化。 此外,它将执行在 /docker-entrypoint-initdb.d
中找到的扩展名为 .sh
,.sql
和 .sql.gz
的文件。 文件将按字母顺序执行。 默认状况下,SQL文件将导入到MYSQL_DATABASE
变量指定的数据库中。所以咱们只须要在Mysql镜像工做机制的基础上维护好数据库初始化所须要的SQL便可。上文咱们说到把数据库也做为一个独立的服务模块,咱们也能够经过代码把Sql等脚步管理起来,划分版本分支。架构
Rainbond 支持多种组件建立方式,在这里咱们采用 从源码建立组件 的方式,编写 Dockerfile 并上传至支持 Git/Svn
协议的客户端,便可在平台直接进行构建;这种方式 透明、可复用、而且可以进行自动化构建。app
目录结构微服务
./ └── Dockerfile └── config ├── my.cnf ├── conf.d ├── docker.cnf └── sql ├── init_database └── README.md
Dockerfile文件
#基础镜像 FROM mysql:latest MAINTAINER Aaron <Aaron_ops@163.com> #把sql文件拷贝到/docker-entrypoint-initdb.d/目录下,以便启动时自动执行这个sql COPY ./sql/*.sql /docker-entrypoint-initdb.d #拷贝mysql配置文件 COPY ./config/ /etc/mysql/ #Mysql密码 ENV MYSQL_ROOT_PASSWORD rainbond #数据持久化目录 VOLUME [ "/var/lib/mysql" ] #端口 EXPOSE 3306
项目地址:https://github.com/Aaron-23/Initialize-db
使用该项目在平台进行构建,Rainbond 将会自动检测 Dockerfile 中定义的环境变量,存储,端口等信息,对这些配置项进行自动化配置,在 Dockerfile 构建完毕后自动启动数据库。
须要注意的是 MySQL 属于有状态服务,因此在构建前需将组件类型修改成有状态单实例,关于组件状态请参考 组件部署类型。
启动完成,进入运行中状态
经过 Web终端 进入数据库查看相关数据已经完成初始化
经过这种方式进行数据库初始化,不须要修改程序代码,无需借助外部工具,经过平台的能力快速部署数据库并完成初始化,在后续使用过程当中能够经过性能分析,资源监控,实例伸缩等功能完成服务运行时的全生命周期管理,提高开发效率,加强业务稳定性。
另外咱们还能够将此组件发布到 Rainbond 内部组件库中,后续开发、测试和交付过程能够直接一键安装此组件便可得到数据初始完成的数据库服务。
以上 MySQL数据库 仅为参考示例,MongoDB,PostgreSQL等数据库均支持同类型数据初始化方式。
Rainbond 云原生应用管理平台,实现微服务架构不用改代码,管理 Kubernetes 不用学容器,帮企业实现应用上云,一站式将任何企业应用持续交付到 Kubernetes 集群、混合云、多云等基础设施。是 Rainstore 云原生应用商店的支撑平台。
本文做者:张震