教程:使用数据库

一种非常常见的情况是你的应用可能需要一个数据库来运行。 本教程将演示如何在SECoder平台上启动一个数据库,并在应用中使用它。

概览

Deployer中所言,在SECoder上使用数据库需要注意几点:

  • 容器是易失的,CI流程中的deploy操作会销毁当前运行的应用容器以及其中所有的临时数据。 所以数据库的数据应当放于持久卷中。
  • 容器应当大体与进程相对应,同时由于部署操作是“先启动新容器、后关闭旧容器”的Rolling-Out形式, 两个容器同时打开同一份数据库数据可能会带来未知的问题,因此数据库服务应当置于单独容器中。
  • 数据库和应用可能需要特别的配置,这一点应当通过配置项来完成。
  • 数据库的初始化操作可以手动完成

使用SQLite

SQLite支持将数据存放在本地文件中,为了避免代码更新、容器重启后丢失数据库文件,我们需要将数据库文件放置在单独的目录下,并使用持久卷。

nodejs-example中,config/db.js中将数据库文件指定在./data/db.sqlite3,结合Dockerfile,数据库文件的绝对路径为/opt/app/data/db.js。 为此,我们在 软工平台->项目管理->部署管理 中,创建一个持久卷,点击名为nodejs-example的容器,在 挂载 选项卡中加入刚刚创建的持久卷并保存,挂载点为/opt/app/data,是数据库文件绝对路径的父目录。

Warning

挂载操作会替换挂载点下所有文件,因此,务必将数据库文件放置在单独的目录下。

使用一般数据库

创建应用仓库与数据库容器

我们首先创建应用仓库,这里我们选择“启用部署”。 然后我们开启一个数据库容器,这里我们用PostgreSQL作为例子,使用postgres镜像作为数据库镜像,容器名填写postgres,镜像填写postgres:11.5

Note

假如你需要自己特别配置的数据库镜像,你可以考虑把它上传到SECoder GitLab Registry(拉取镜像需要登录,使用GitLab的用户名密码即可)或者Docker Hub上。

Note

假如你不小心敲错了镜像名或者需要切换镜像,你可能需要执行这样的指令

docker run --rm -e API_SERVER=https://deployer.secoder.net/api/ \ -e DEPLOY_ENV=<environment> \ -e DEPLOY_TOKEN=<token>\ ccr.ccs.tencentyun.com/thusepi/deployer \ deployer config replace <container_name> <new_image> [<username> <password>]

其中<environment>为小组名(例:SECoder-Examples),<container_name>为容器名(例:example-postgres), <token>为部署密钥(可在部署管理页查看),<new_image>为新镜像名, 可选的<username>和<password>为拉取镜像需要的凭据。

SECoder上数据库容器的配置

持久卷的配置

通过查阅PostgreSQL镜像的文档得知,postgres镜像把所有数据置于/var/lib/postgresql/data下,故我们创建一个持久卷挂载到该路径下。

创建持久卷

挂载持久卷

数据库配置文件

Info

该步是可选的。

假如数据库需要特殊的配置文件来运行,你可能需要创建一个配置项。 创建配置项的教程参见这里;

Warning

MySQL/MariaDB注意事项:Docker Hub的mysql镜像需要设置至少一个关于密码的环境变量正常运行,而SECoder暂时不支持给容器挂载环境变量。 可以使用gjz010/mariadb:该镜像设置了环境变量MYSQL_RANDOM_ROOT_PASSWORD=yes。 或者可以根据需要定制自己的镜像。

暴露端口

数据库需要将端口暴露出来给其它的服务访问。Postgres需要5432端口。

暴露端口

数据库的访问不限于命名空间内部,即该端口是对整个内网开放的。假如你需要更高的安全性,可以考虑使用stunnel之类对流量进行加密。

数据库初始化

Warning

该步是可选的,且该步描述的方法不一定是最优方法。 例如,你可能想通过在应用内暴露一个Install方法来完成数据库的初始化,或者使用ORM的Migration自动完成。 这里只是给出一种简单的方法。

可以通过使用终端来初始化数据库。首先打开管理界面,打开容器的终端,然后在终端里执行初始化数据库的命令。

初始化数据库

经过以上配置后,你可以在内网中通过<container_name>.<environment>.secoder.local的内部域名来访问到该数据库。

应用的配置

运行在SECoder上的应用实例与测试环境的应用实例的配置文件应当是不同的,SECoder使用配置项来解决这个问题:配置项允许你将配置文件挂载入容器中。

monolithic-example支持使用Postgres数据库来运行。 为了使用Postgres,需要修改样例配置文件中数据库相关内容。 之后,结合Dockerfile,把修改后的配置文件挂载到/opt/app/config下。 创建配置项的教程参见这里,在 软工平台->项目管理->部署管理 中,点击名为monolithic-example容器,在 挂载 选项卡中加入刚刚创建的配置项并保存,挂载点为/opt/app/config

在样例配置文件中,HOST填写数据库的地址,用户名、密码、数据库名与初始化数据库中的设置一致,样例如下。 上传配置项时,将修改后的local_settings.py.example更名为local_settings.py并和config目录下的run.sh一同作为配置项上传。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'meeting',
        'USER': 'meeting',
        'PASSWORD': 'password',
        'HOST': 'postgres.example.secoder.local',
        'PORT': '5432',
    }
}