说起数据库,玩 Docker 应用时,大家相常见的一般是 MySQL / MariaDB、PostgreSQL、以及一些轻量项目里用到的 SQLite。
Redis会在相对较新的项目中出现,但因为并不属于同类,就暂且略过。
按照官方部署文档一键部署本就不是什么难事。但如果你想要数据库共用,或者部署的多个应用都刚需依赖数据库,那么麻烦可能就来了~本篇文章想梳理的也是这部分内容
MariaDB 作为 MySQL 的分支也算是比较特殊的一个。之所以说它特殊,是因为在威联通 NAS 的官方 App Center 里,就能直接安装 MariaDB 套件版。这意味着很多用户在接触容器化应用之前,可能就已经先接触过它。
也正因为这一点,我打算先从 MariaDB 写起,把它作为整个数据库系列文章的第一篇。
⚠️ 本文涉及的所有部署代码仅为演示,可用性不做保证!!!
版本选择
部署应用时,如果发现依赖数据库,那么一定要阅读该应用的官方文档。下图为 Photoview 的数据库支持,可以看到默认推荐 MariaDB 的 LTS 版本(长期支持版),但也没有强制要求,所以兼容性会较高。
PhotoPrism 明确要求 ≥10.5.12
如果你还用低版本,那么你的项目部署必然会失败。
套件版 MariaDB
商店存在两个版本可选,MariaDB 5 或 MariaDB 10。
两个版本区别
MariaDB 5
这是一个比较老的版本,主要是为了兼容一些旧应用(比如早期的 CMS、论坛程序),它们依赖的数据库语法和特性可能和新版本不完全匹配。
如果你需要跑的应用是比较老的,官方文档里写死了要求 MariaDB 5.x,那就只能选它。
MariaDB 10
这是现在的主流版本,性能更好,功能更全,兼容性也更强。绝大多数新应用(WordPress、Nextcloud、PhotoPrism 等)在官方说明里都会推荐使用 MariaDB 10。
所以,如果没有历史包袱,那就直接选 MariaDB 10。
不过应用商店这款的版本是
v10.5.8
,属于有些落后的版本。
如何启用
这里仅讲讲基础的使用方法,能让你的项目成功链接它并跑起来。
首先下载安装 MariaDB 10。默认的端口号为3307
,我们可以修改。
在账户和数据库中,根密码相当于超级用户密码,可以直接重置成自己熟悉的(建议)。用户密码则为后续你创建的各个数据库的访问密码。
接着还需要下载安装名为 phpMyAdmin 的套件,有了它我们可通过Web端连接并管理数据库,实现图形化。
安装完毕后直接打开,会出现以下界面。用户名:root,密码上文重置后的填入。服务器选择 MariaDB 10。
接着会来到以下界面。
在我们部署依赖MariaDB的项目前,需提前为其创建一个数据库。如下图所示,按箭头所指,创建新的账户。红框内是上篇照片墙所创建的。
假设emby必须绑定数据库才能完成初始化。
一般家庭用户仅需要注意下图红框的内容部分。用户名和密码一般习惯都设置为所部署的应用名,即emby
,当然你完全可以自定义。主机名%
代表任意主机,也是符合大多数情况的选择。生成密码就是随机生成强密码,个人不喜欢用。勾选「创建与用户同名的数据库并授予所有权限」,然后点击最下方的执行即可。
全局权限保持默认(啥也不勾选),只在数据库级别授予权限。这样用户 emby 不会对系统库有任何权力,只能动自己的制定数据库,更安全一些。如果你有需求,也可勾选 SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX
这些项。
当然以上的内容创建完完成后都支持再调整。
创建完毕,可以看到名为emby的数据库和账户已经出现在列表中。至此,已经可以开始使用。
部署调用数据库
以上一篇部署的 Photoview 照片墙为例。
仅截取environment
环境变量中相关内容。
- PHOTOVIEW_DATABASE_DRIVER=mysql
- PHOTOVIEW_MYSQL_URL=photoview:photoview@tcp(192.168.200.132:3307)/photoview
PHOTOVIEW_DATABASE_DRIVER
、PHOTOVIEW_DATABASE_DRIVER
这两项,每个应用的开发者会定义不同的变量名,有自己的规范,因此要提前看使用文档~
第一项:MariaDB 是 MySQL 的分支,完全兼容 MySQL 协议和驱动,因此驱动部分要填写mysql
。
第二项:用户名:密码@tcp(IP:端口)/数据库名
。Photoview 要用 用户 photoview,密码 photoview 去连接你 NAS 上的 MariaDB10 (192.168.200.132:3307),并且使用数据库 photoview。帐密统一可能算偷懒?但是方便太多~
使用套件版,在yaml
这里精简不少,完成这俩的配置基本就可以部署使用了。
Docker版 MariaDB
提前部署 MariaDB
部署10.6版本:
services:
mariadb:
image: mariadb:10.6
container_name: mariadbtest # 自定义
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=mypass # root 用户密码
ports:
- "3306:3306" # 映射到宿主机3306端口,不需映射就删掉
volumes:
- /share/Container/mariadb:/var/lib/mysql # 数据持久化目录
上面部署的为10.6,10.2 和 10.5 等也是有效的目标版本,看需求指定版本。
默认情况下,MariaDB 官方 Docker 镜像的root
用户是没有密码的,或者说不允许直接登录,所以必须通过环境变量MYSQL_ROOT_PASSWORD
设置root
密码。
环境变量可以自行加入时区之类的变量,这个参考MariaDB官方文档。
注意这里的端口号,左侧也都是可以自定义的。
部署完毕后,点击容器,点击执行。
进入容器。建议使用/bin/bash
。输入命令。
# 以root身份登入
mysql -uroot -p
# 输入根密码,这里跟启用nas的权限一样,不会显示
# 输入完毕后回车
# 创建名为photoview的数据库
CREATE DATABASE IF NOT EXISTS photoview;
# 用户名和密码都是 photoview,允许从任何主机连接
# 单引号中的配置,都可以和套件版对应起来
CREATE USER 'photoview'@'%' IDENTIFIED BY 'photoview';
GRANT ALL PRIVILEGES ON photoview.* TO 'photoview'@'%';
FLUSH PRIVILEGES;
输入exit
退出root,我们用新账户进入刚创建的数据库,证明创建成功。
mysql -uphotoview -pphotoview photoview
然后就可以重复上一节内容,修改那两个变量,接着创建相应容器。
打包部署 MariaDB
一般应用的发布者会直接提供一个成品yaml
文档,在环境变量直接完成了全部的配置,仅需我们简单修改变量后就能一键部署并启用。就是我们常说的开箱即用。
确实很省事儿,但为了长久考虑,不太推荐这样干,除非你后续不部署强绑同类数据库的应用。
这里依然放一个Photoview的部署代码。
services:
# 应用本体
photoview:
image: photoview/photoview:2
container_name: photoview
restart: unless-stopped
ports:
- "8797:80" # 浏览器访问 http://NAS_IP:8797
depends_on:
mariadb:
condition: service_healthy
environment:
- TZ=Asia/Shanghai
- PHOTOVIEW_DATABASE_DRIVER=mysql
- PHOTOVIEW_MYSQL_URL=photoview:photoview@tcp(db:3306)/photoview # 注意这个端口号
- PHOTOVIEW_LISTEN_IP=0.0.0.0
# - MAPBOX_TOKEN=your_mapbox_token # 可选
# - PHOTOVIEW_VIDEO_HARDWARE_ACCELERATION=qsv # 可选
volumes:
- /etc/localtime:/etc/localtime:ro
- /share/Container/photoview:/home/photoview/media-cache
- /share/Phone/picture:/photos:ro # 照片目录
# MariaDB 数据库
mariadb:
image: mariadb:10.6
container_name: photoview-db
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=rootpassword # 根用户密码,自行更改
- MYSQL_DATABASE=photoview # Photoview 数据库
- MYSQL_USER=photoview # Photoview 数据库用户名
- MYSQL_PASSWORD=photoview # Photoview 用户密码
volumes:
- /share/Container/photoview/mysql:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
可以发现上面的部署代码,增加的仅有后半截内容,前半截除了增加容器启动顺序depends_on
外毫无变化。healthcheck
为数据库健康检查。
多个应用,但数据库版本不兼容
上一节的情况延伸。
假设一下,项目 A 仅支持 MariaDB 10.5,项目 B 仅支持 MariaDB 10.6。如果你继续用同一个,那注定有一个会报错,导致容器无法成功初始化不能创建和使用。
对与我们普通用户来说,最稳妥的就是像上面整合一键部署,一个项目对应一个数据库容器。
项目 A 使用 MariaDB 10.5:
services:
mariadb-emby:
image: mariadb:10.5
container_name: mariadb-emby
restart: always
environment:
- MYSQL_ROOT_PASSWORD=qnap1234
- MYSQL_DATABASE=embyserver
- MYSQL_USER=embyserver
- MYSQL_PASSWORD=embyserver
volumes:
- /share/Container/mariadb/emby:/var/lib/mysql
项目 B 使用 MariaDB 10.6:
mariadb-jellyfin:
image: mariadb:10.6
container_name: mariadb-jellyfin
restart: always
environment:
- MYSQL_ROOT_PASSWORD=qnap1234
- MYSQL_DATABASE=jellyfin
- MYSQL_USER=jellyfin
- MYSQL_PASSWORD=jellyfin
volumes:
- /share/Container/mariadb/jellyfin:/var/lib/mysql
像这种一键整合部署,一般情况下,不需要映射 MariaDB 端口。
容器之间会通过容器名+内部端口(3306) 通信,两个 MariaDB 容器都用 3306
也不会冲突。
只有在需要宿主机或外部设备直接访问数据库时,才需要显式映射端口,例如:
ports:
- "3307:3306"
否则,请不要加 ports
,这样最简单,也避免端口占用错误。
最后
从个人博客创建开始「被迫」学习使用数据库,一点点积累起来的数据对我来说的确蛮重要~
但一般情况下,个人的看法是能不用就不用,或者使用轻量化的SQLite。除了学习成本高外,还有开头说的各种版本兼容问题,都挺让人头大。
内容就这么多,希望能有所帮助,本文完~
评论区