摘要:按照官方部署文档一键部署本就不是什么难事。但如果你想要数据库共用,或者部署的多个应用都刚需依赖数据库,那么麻烦可能就来了~本篇文章想梳理的也是这部分内容
说起数据库,玩 Docker 应用时,大家相常见的一般是 MySQL / MariaDB、PostgreSQL、以及一些轻量项目里用到的 SQLite。
Redis会在相对较新的项目中出现,但因为并不属于同类,就暂且略过。
按照官方部署文档一键部署本就不是什么难事。但如果你想要数据库共用,或者部署的多个应用都刚需依赖数据库,那么麻烦可能就来了~本篇文章想梳理的也是这部分内容
MariaDB 作为 MySQL 的分支也算是比较特殊的一个。之所以说它特殊,是因为在威联通 NAS 的官方 App Center 里,就能直接安装 MariaDB 套件版。这意味着很多用户在接触容器化应用之前,可能就已经先接触过它。
也正因为这一点,我打算先从 MariaDB 写起,把它作为整个数据库系列文章的第一篇。
部署应用时,如果发现依赖数据库,那么一定要阅读该应用的官方文档。下图为 Photoview 的数据库支持,可以看到默认推荐 MariaDB 的 LTS 版本(长期支持版),但也没有强制要求,所以兼容性会较高。
PhotoPrism 明确要求 ≥10.5.12
如果你还用低版本,那么你的项目部署必然会失败。
商店存在两个版本可选,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)/photoviewPHOTOVIEW_DATABASE_DRIVER、PHOTOVIEW_DATABASE_DRIVER这两项,每个应用的开发者会定义不同的变量名,有自己的规范,因此要提前看使用文档~
第一项:MariaDB 是 MySQL 的分支,完全兼容 MySQL 协议和驱动,因此驱动部分要填写mysql。
第二项:用户名:密码@tcp(IP:端口)/数据库名。Photoview 要用 用户 photoview,密码 photoview 去连接你 NAS 上的 MariaDB10 (192.168.200.132:3307),并且使用数据库 photoview。帐密统一可能算偷懒?但是方便太多~
使用套件版,在yaml这里精简不少,完成这俩的配置基本就可以部署使用了。
部署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;输入exit退出root,我们用新账户进入刚创建的数据库,证明创建成功。
mysql -uphotoview -pphotoview photoview然后就可以重复上一节内容,修改那两个变量,接着创建相应容器。
一般应用的发布者会直接提供一个成品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。除了学习成本高外,还有开头说的各种版本兼容问题,都挺让人头大。
内容就这么多,希望能有所帮助,本文完~
来源:小茵论科技