共计 1928 个字符,预计需要花费 5 分钟才能阅读完成。
咱们应用容器的形式部署数据库组件,特地是企业有大量的我的项目开发业务的,部署的开发、测试数据库组件较多时。常常会遇到以下问题:
- 业务须要应用数据库,但部署完数据库后,须要在数据库中执行创立 schema 的操作或者一些初始化数据的创立。
- 开发测试多套部署环境,须要多次重复 1 的步骤。
- 我的项目比拟多,工夫久了我的项目须要的数据库 Schema 不分明。
- 我的项目交付时数据库 Schema 管理混乱。
当初如果是应用 Go 等语言研发的业务零碎,都具备了 ORM 层主动初始化和更新 Schema 的能力,如果是这样本文对你无用。但目前大多数其余开发语言的业务都不具备这种能力。
如果咱们把数据库也作为一个业务中的一个服务模块来治理的话,咱们心愿服务启动后即可间接实现 Schema 的初始化,间接提供数据服务能力。
那么在 Rainbond 中如何达成这样的成果呢?
Schema 初始化在传统模式中个别有两种计划:
- 在数据库启动后手动导入;人工通过客户端操作,没有自动化水平可言;
- 在业务服务启动时连贯数据库进行初始化,依赖业务服务端的能力。
能够看出,这两种形式都存在各自的弊病,那么有没有形式可能让数据库启动时主动初始化指定的数据呢?答案是 有!
咱们以 MySQL 为例,官网对于 Docker 有着良好的反对,首先来看 Dockerhub 上 Mysql 官网镜像 的一段形容:
在数据库容器首次启动时,将创立一个指定名称的新数据库,并应用提供的环境变量对其进行初始化。此外,它将执行在 /docker-entrypoint-initdb.d
中找到的扩大名为 .sh
,.sql
和 .sql.gz
的文件。文件将按字母程序执行。默认状况下,SQL 文件将导入到 MYSQL_DATABASE
变量指定的数据库中。因而咱们只须要在 Mysql 镜像工作机制的根底上保护好数据库初始化所须要的 SQL 即可。上文咱们说到把数据库也作为一个独立的服务模块,咱们也能够通过代码把 Sql 等脚步治理起来,划分版本分支。
Rainbond 反对多种组件创立形式,在这里咱们采纳 从源码创立组件 的形式,编写 Dockerfile 并上传至反对 Git/Svn
协定的客户端,即可在平台间接进行构建;这种形式 通明、可复用、并且可能进行自动化构建。
目录构造
./
└── Dockerfile
└── config
├── my.cnf
├── conf.d
├── docker.cnf
└── sql
├── init_database
└── README.md
根底镜像
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
本文作者:张震
3. Rainbond 参考手册选集
2. Rainbond 装置应用
1. Rainbond 官网
Rainbond 云原生利用治理平台,实现微服务架构不必改代码,治理 Kubernetes 不必学容器,帮企业实现利用上云,一站式将任何企业应用继续交付到 Kubernetes 集群、混合云、多云等基础设施。是 Rainstore 云原生利用商店的撑持平台。
以上 MySQL 数据库 仅为参考示例,MongoDB,PostgreSQL 等数据库均反对同类型数据初始化形式。
另外咱们还能够将此组件公布到 Rainbond 外部组件库中,后续开发、测试和交付过程能够间接一键装置此组件即可取得数据初始实现的数据库服务。
通过这种形式进行数据库初始化,不须要批改程序代码,无需借助内部工具,通过平台的能力疾速部署数据库并实现初始化,在后续应用过程中能够通过性能剖析,资源监控,实例伸缩等性能实现服务运行时的全生命周期治理,晋升开发效率,加强业务稳定性。
通过 Web 终端 进入数据库查看相干数据曾经实现初始化
启动实现,进入运行中状态
须要留神的是 MySQL 属于有状态服务,所以在构建前需将组件类型批改为有状态单实例,对于组件状态请参考 组件部署类型。
应用该我的项目在平台进行构建,Rainbond 将会自动检测 Dockerfile 中定义的环境变量,存储,端口等信息,对这些配置项进行自动化配置,在 Dockerfile 构建结束后主动启动数据库。
我的项目地址:https://github.com/Aaron-23/Initialize-db
Dockerfile 文件