如何使用docker-compose管理多个数据库
1. 概述
应用程序使用多个数据库的情况并不少见。我们可能需要将敏感信息放在具有自己凭据的不同数据库中。或者,也许我们的应用程序是多租户的,我们希望每个租户一个数据库。
在这篇简短的文章中,我们将了解如何使用docker-compose 和 MariaDB 运行我们的服务来访问多个数据库。
此外,以下说明不包括数据库的增量升级。这可以通过迁移 在应用层上实现。
2. 使用 MariaDB 导出模式和数据
我们将在本教程中采用的方法是备份两个已经存在的数据库。然后,我们将使用该备份作为基础,在使用docker-compose的新系统上从头开始重建这些数据库。
假设我们的开发环境中已经有了数据库db1和db2。我们可以使用mariadb-dump来备份它们。
$ mariadb-dump --skip-add-drop-table --databases db1 db2 > databases-backup.sql
该命令将备份模式和数据。如果我们只想要模式,我们可以添加*–no-data*参数。
我们需要–skip-add-drop-table*参数来跳过删除表命令*。之后,docker-compose应该只初始化一次数据库。但是即使它再次尝试初始化数据库,我们的表和数据也不会被删除。
这是上面命令中的databases-backup.sql:
...
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1`
USE `db1`;
CREATE TABLE `table1` ( ...
...
INSERT INTO `table1` VALUES ( ...
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db2`
USE `db2`;
...
CREATE TABLE `table2` ( ...
...
INSERT INTO `table2` VALUES ( ...
这一备份包含两个数据库。它将是我们docker-compose配置的主要部分,以创建一个新环境。
3. 创建docker-compose文件
让我们从显示docker-compose.yml文件开始。稍后我们将解释主要部分。
version: '3.8'
services:
db:
image: mariadb
environment:
MYSQL_ALLOW_EMPTY_PASSWORD
volumes:
- databases:/var/lib/mysql
- ./databases-backup.sql:/docker-entrypoint-initdb.d/databases-backup.sql
app:
build: ./app
ports:
- 80:80
volumes:
databases:
我们可以通过执行以下命令来启动服务:
$ docker-compose up
让我们关注 YAML 文件末尾的卷部分。Docker 容器是短暂的,我们所做的任何更改都不会在重启后继续存在。volumes 通过在容器外部提供独立于容器的存储来解决这个问题。 在上面的示例中,我们请求了一个卷并将其命名为databases。之后,我们需要在*/var/lib/mysql中为 MariaDB 安装卷。这可以在我们的数据库服务中的卷*部分中看到。
volumes中的第二行不要求卷,但仍然非常重要。它将最后一部分的备份挂载到容器中的特定位置。这取自 MariaDB Docker 映像文档 。要初始化一个新实例,我们需要/docker-entrypoint-initdb.d*文件夹*中的备份文件。
一旦我们的 docker-compose 启动,我们就可以通过引用它的服务名称来访问数据库。例如,在app服务内部,我们可以执行 MariaDB 终端客户端来访问两个数据库:
$ mariadb -h db
> USE db1;
> SELECT * FROM table1;
...
> USE db2;
> SELECT * FROM table2;
...
在docker-compose.yml文件中,我们只在app服务上暴露了 80端口,而在数据库中没有端口。这意味着 MariaDB 只能被docker-compose中的其他服务访问,而应用程序可以从外部访问。