侧边栏壁纸
博主头像
是羊刀仙啊 博主等级

闲不下来!

  • 累计撰写 186 篇文章
  • 累计创建 51 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

【新人向】NAS上的数据库应用————MariaDB篇

羊刀仙
2025-08-29 / 0 评论 / 0 点赞 / 4 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

说起数据库,玩 Docker 应用时,大家相常见的一般是 MySQL / MariaDB、PostgreSQL、以及一些轻量项目里用到的 SQLite。

Redis会在相对较新的项目中出现,但因为并不属于同类,就暂且略过。

按照官方部署文档一键部署本就不是什么难事。但如果你想要数据库共用,或者部署的多个应用都刚需依赖数据库,那么麻烦可能就来了~本篇文章想梳理的也是这部分内容

MariaDB 作为 MySQL 的分支也算是比较特殊的一个。之所以说它特殊,是因为在威联通 NAS 的官方 App Center 里,就能直接安装 MariaDB 套件版。这意味着很多用户在接触容器化应用之前,可能就已经先接触过它。

也正因为这一点,我打算先从 MariaDB 写起,把它作为整个数据库系列文章的第一篇。

⚠️ 本文涉及的所有部署代码仅为演示,可用性不做保证!!!

版本选择

部署应用时,如果发现依赖数据库,那么一定要阅读该应用的官方文档。下图为 Photoview 的数据库支持,可以看到默认推荐 MariaDB 的 LTS 版本(长期支持版),但也没有强制要求,所以兼容性会较高。

截屏2025-08-28 15.47.42.png

PhotoPrism 明确要求 ≥10.5.12

截屏2025-08-29 15.45.44.png

如果你还用低版本,那么你的项目部署必然会失败。

截屏2025-08-26 16.33.11.png

套件版 MariaDB

商店存在两个版本可选,MariaDB 5 或 MariaDB 10。

截屏2025-08-28 14.41.11.png

两个版本区别

MariaDB 5

这是一个比较老的版本,主要是为了兼容一些旧应用(比如早期的 CMS、论坛程序),它们依赖的数据库语法和特性可能和新版本不完全匹配。

如果你需要跑的应用是比较老的,官方文档里写死了要求 MariaDB 5.x,那就只能选它。

MariaDB 10

这是现在的主流版本,性能更好,功能更全,兼容性也更强。绝大多数新应用(WordPress、Nextcloud、PhotoPrism 等)在官方说明里都会推荐使用 MariaDB 10。

所以,如果没有历史包袱,那就直接选 MariaDB 10。

不过应用商店这款的版本是v10.5.8,属于有些落后的版本。

如何启用

这里仅讲讲基础的使用方法,能让你的项目成功链接它并跑起来。

首先下载安装 MariaDB 10。默认的端口号为3307,我们可以修改。

截屏2025-08-28 18.30.46.png

在账户和数据库中,根密码相当于超级用户密码,可以直接重置成自己熟悉的(建议)。用户密码则为后续你创建的各个数据库的访问密码。

截屏2025-08-28 18.32.52.png

接着还需要下载安装名为 phpMyAdmin 的套件,有了它我们可通过Web端连接并管理数据库,实现图形化。

截屏2025-08-28 18.28.29.png

安装完毕后直接打开,会出现以下界面。用户名:root,密码上文重置后的填入。服务器选择 MariaDB 10。

截屏2025-08-25 15.57.13.png

接着会来到以下界面。

截屏2025-08-25 15.58.44.png

在我们部署依赖MariaDB的项目前,需提前为其创建一个数据库。如下图所示,按箭头所指,创建新的账户。红框内是上篇照片墙所创建的。

截屏2025-08-29 09.13.57.png

假设emby必须绑定数据库才能完成初始化。

一般家庭用户仅需要注意下图红框的内容部分。用户名和密码一般习惯都设置为所部署的应用名,即emby,当然你完全可以自定义。主机名%代表任意主机,也是符合大多数情况的选择。生成密码就是随机生成强密码,个人不喜欢用。勾选「创建与用户同名的数据库并授予所有权限」,然后点击最下方的执行即可。

截屏2025-08-29 09.23.14.png

全局权限保持默认(啥也不勾选),只在数据库级别授予权限。这样用户 emby 不会对系统库有任何权力,只能动自己的制定数据库,更安全一些。如果你有需求,也可勾选 SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX这些项。

当然以上的内容创建完完成后都支持再调整。

创建完毕,可以看到名为emby的数据库和账户已经出现在列表中。至此,已经可以开始使用。

截屏2025-08-29 09.42.53.png

部署调用数据库

以上一篇部署的 Photoview 照片墙为例。

截屏2025-08-29 14.57.01.png

仅截取environment环境变量中相关内容。

      - PHOTOVIEW_DATABASE_DRIVER=mysql
      - PHOTOVIEW_MYSQL_URL=photoview:photoview@tcp(192.168.200.132:3307)/photoview

PHOTOVIEW_DATABASE_DRIVERPHOTOVIEW_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官方文档。

注意这里的端口号,左侧也都是可以自定义的。

截屏2025-08-29 13.45.03.png

部署完毕后,点击容器,点击执行。

截屏2025-08-29 13.52.11.png

进入容器。建议使用/bin/bash。输入命令。

# 以root身份登入
mysql -uroot -p

# 输入根密码,这里跟启用nas的权限一样,不会显示
# 输入完毕后回车

# 创建名为photoview的数据库
CREATE DATABASE IF NOT EXISTS photoview;

截屏2025-08-29 14.05.15.png

# 用户名和密码都是 photoview,允许从任何主机连接
# 单引号中的配置,都可以和套件版对应起来

CREATE USER 'photoview'@'%' IDENTIFIED BY 'photoview';
GRANT ALL PRIVILEGES ON photoview.* TO 'photoview'@'%';
FLUSH PRIVILEGES;

截屏2025-08-29 14.09.24.png

输入exit退出root,我们用新账户进入刚创建的数据库,证明创建成功。

mysql -uphotoview -pphotoview photoview

截屏2025-08-29 14.12.38.png

然后就可以重复上一节内容,修改那两个变量,接着创建相应容器。

截屏2025-08-29 10.26.39.png

打包部署 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。如果你继续用同一个,那注定有一个会报错,导致容器无法成功初始化不能创建和使用。

截屏2025-08-26 16.33.11.png

对与我们普通用户来说,最稳妥的就是像上面整合一键部署,一个项目对应一个数据库容器。

项目 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,这样最简单,也避免端口占用错误。

截屏2025-08-29 15.28.03.png

截屏2025-08-29 15.28.14.png

最后

从个人博客创建开始「被迫」学习使用数据库,一点点积累起来的数据对我来说的确蛮重要~

但一般情况下,个人的看法是能不用就不用,或者使用轻量化的SQLite。除了学习成本高外,还有开头说的各种版本兼容问题,都挺让人头大。

内容就这么多,希望能有所帮助,本文完~

0

评论区