资讯详情

资讯详情

Ubuntu上用Docker部署Databaseus:轻量Web数据库管理工具实践

在一台 Ubuntu 机器上折腾数据库管理工具的人应该都经历过这种纠结桌面客户端功能全但每台机器都要装一遍环境phpMyAdmin 老牌但界面和体验总差点意思命令行最自由可团队里不是每个人都愿意敲 SQL。直到我试用了 Databaseus这个基于 Web 的轻量数据库管理工具配合 Docker 一键部署在 Ubuntu 服务器上跑起来之后整个管理体验顺畅了很多。这篇文章就把从部署、连接到后面排查坑的完整过程写一遍适合正在 Ubuntu 上自建服务、或想给团队提供一个统一数据库入口的朋友参考。1. 为什么最终选了 DatabaseusWeb 数据库管理工具的取舍1.1 桌面客户端和传统 Web 工具差在哪里先聊清楚背景。市面上能管数据库的工具非常多大体分三类桌面客户端、传统 Web 工具、现代 Web 数据库管理工具。桌面客户端我最早用的是 DBeaver后来也短暂用过 Navicat。功能确实强能画 ER 图、能导出结构、能连各种奇奇怪怪的数据库。但问题在于只要换一台电脑就要重新装驱动、配 SSH 隧道、导连接配置。尤其是当数据库跑在 Ubuntu 服务器上我又不想给服务器装图形界面的时候桌面客户端只能在本地连离“随时随地都能看数据库”差了一步。传统 Web 工具我也用过phpMyAdmin 主要管 MySQLAdminer 是单文件部署简单但界面比较朴素多用户权限和团队协作基本靠凑合。项目一多了以后你会发现最大的问题不是“能不能连上数据库”而是“团队里每个人分别连了哪个库、跑了什么 SQL、有没有人误删数据”。传统 Web 工具在这种场景下很难给你答案。我用表格把这几类的差异整理一下你感受会更直观类型代表工具优势实际痛点桌面客户端DBeaver、Navicat功能完整、支持多种数据库、可视化强需逐台安装、连接配置不共享、Ubuntu 服务器场景受限传统 Web 工具phpMyAdmin、Adminer部署简单、浏览器即开即用界面陈旧、功能单一、权限和审计能力弱现代 Web 管理工具Databaseus 这类工具轻量容器化、统一入口、支持多用户需要理解 Docker 网络和权限模型上手有一定门槛Databaseus 正好补上最后这一块。它本身是跑在服务器上的 Web 服务团队成员打开浏览器输入地址就能用不需要装任何客户端。我作为管理员只需要在 Ubuntu 上把 Docker 容器拉起来后面的事情都发生在浏览器里。1.2 Databaseus 适合谁用根据我实际使用的体会下面这几类人最值得考虑个人开发者自己在 VPS 或 Ubuntu 服务器上跑了 MySQL、PostgreSQL希望有个界面方便日常查数据、改数据又不想为这事单独装一整套桌面环境。小型团队大家共用一个开发或测试数据库需要统一入口避免数据库密码在群里传来传去。运维和 DBA需要集中管理多个数据库实例同时想知道“谁在什么时候执行了什么 SQL”Databaseus 这类带用户体系的工具比裸的 phpMyAdmin 好用很多。临时演示或交付项目有时候要给别人提供一个只读的数据查看界面用 Docker 起一个 Databaseus配好只读账号用完直接销毁容器非常干净。我当时的使用场景比较典型公司内部数据库跑在 Ubuntu 服务器上团队成员分散在不同网络大家经常找我要查询账号甚至有人直接在生产库上执行 DELETE 时忘加 WHERE。我把 Databaseus 用一个容器部署好给每个人开了独立账号再给非技术人员开只读权限这类事故基本就杜绝了。2. Ubuntu 上用 Docker 部署 Databaseus从零到能访问2.1 先把 Ubuntu 这边的 Docker 环境检查清楚部署之前第一步是确认 Ubuntu 服务器上的 Docker 环境是否正常。很多人在这一步就卡住所以我把检查和安装命令都列出来。docker --version docker compose version如果两条命令都能正常输出版本号说明 Docker 和 Docker Compose 插件已经装好了。如果没有可以用 Ubuntu 官方源安装sudo apt update sudo apt install -y docker.io docker-compose-v2 sudo systemctl enable --now docker解释一下为什么直接用 apt 而不是网上常见的“官方安装脚本”。官方脚本可以装到最新版但在国内服务器上经常遇到下载超时的情况Ubuntu 仓库里的 docker.io 版本虽然不一定最新但胜在稳定和系统自带的 systemd 配合也最省心。对于跑一个 Web 管理工具来说完全够用。检查完版本后我习惯顺手确认 Docker 服务状态systemctl is-active docker如果输出 active就可以继续了。还需要注意一点如果你当前登录的用户不是 root执行 docker 命令时可能会报权限错误。解决办法是把用户加入 docker 组或者直接在命令前面加 sudo。我建议加入 docker 组省得后面每条命令都加 sudosudo usermod -aG docker $USER newgrp docker这里补充一个安全提醒加入 docker 组等价于拿到 root 权限因为 Docker 本来就能挂载宿主机目录、执行容器内命令。所以只给可信的管理员用户加这个组别给普通业务账号开这个权限。2.2 编写 compose 文件与关键参数解读Docker 部署有两种方式直接 docker run或者用 Docker Compose。我推荐 Compose原因很简单docker run 参数一多命令就变得又臭又长团队协作时也很难复制而 Compose 文件是声明式的所有人拉下来跑 docker compose up -d 就能得到同样一套环境。先创建目录mkdir -p ~/databaseus cd ~/databaseus然后新建 docker-compose.yml 文件。不同版本的 Databaseus 镜像参数可能略有差异但整体结构是这样services: databaseus: image: databaseus/databaseus:latest container_name: databaseus restart: unless-stopped ports: - 8080:8080 environment: - TZAsia/Shanghai volumes: - ./databaseus-data:/app/data逐个参数说一下因为这里面藏着后面很多坑的根源。image指定镜像名和标签。latest 适合先体验但如果用于生产建议锁定具体版本号后面方便回滚。container_name容器名固定为 databaseus方便用 docker logs databaseus 这种命令快速查看日志。restart: unless-stopped只要不是手动 stop容器退出后会自动重启。服务器重启后也会自动拉起很省心。ports左边 8080 是宿主机端口右边 8080 是容器内应用端口。如果宿主机 8080 已经被占用就改成 8081:8080。environmentTZAsia/Shanghai 解决时区问题。不设这个容器内的日志时间和监控图会显示成 UTC 时间跟你本地时间差 8 小时排查问题时心态很容易崩。volumes把容器内的 /app/data 映射到宿主机的 ./databaseus-data 目录。这里存的是 Databaseus 自己的配置、用户信息、连接定义。如果不挂这个卷容器一删你配置的所有数据库连接就全没了。目录的具体路径按官方文档为准但原则是凡是工具运行时要写入的数据都必须通过 volume 落到宿主机。写完之后先拉取镜像再启动docker compose pull docker compose up -d启动过程如果网络不好可能会等一会儿。看到容器状态为 running 后浏览器访问 http://你的服务器IP:8080 就能打开登录页。2.3 启动、验证与日常操作第一次启动时我踩过一个不算坑但很影响心情的问题docker compose up 返回了但浏览器一直打不开。这时候不要急着重启容器先用两条命令看状态docker compose ps docker compose logs -f --tail 100 databaseusdocker compose ps 看容器是否 runningdocker compose logs 看应用日志里有没有真正的报错。如果是第一次启动数据库初始化可能需要几十秒日志里会出现类似“initializing database”之类的提示等它结束就好。日常最常用的几个操作我也列一下docker compose stop # 停止容器但保留数据和容器状态 docker compose start # 再次启动 docker compose restart # 重启服务改完环境变量后常用 docker compose down # 删除容器但保留数据卷注意 docker compose down -v 这个命令要非常小心-v 会连带删除数据卷等于把你配置的连接和用户全清掉。我一般只有确定要彻底重置环境时才用。还有个细节如果改了 docker-compose.yml 里的端口或环境变量执行 docker compose up -d 不会自动重建容器。这时候需要加一个参数docker compose up -d --force-recreate这样 Docker 会按新配置重建容器但 volume 里的数据依然保留。3. 连接数据库、查数据、带团队Databaseus 核心功能实操3.1 建立数据库连接时的几个关键选择Databaseus 部署好之后第一件事是配置要管理的数据库连接。支持的数据库类型通常包括 MySQL、PostgreSQL、SQLite、Redis 等具体以界面里的选项为准。新建连接时界面会让你填几项连接名称、数据库类型、主机地址、端口、用户名、密码。看起来很简单实际藏着一个坑如果你的 MySQL 或 PostgreSQL 是直接跑在宿主机 Ubuntu 系统上的而 Databaseus 跑在 Docker 容器里那么主机地址绝对不能填 localhost 或 127.0.0.1。原因不复杂Docker 容器有自己独立的网络命名空间容器内的 localhost 指向的是容器自己不是宿主机。你要填的是宿主机的局域网 IP。先查一下hostname -I假设输出 192.168.1.100那就把数据库地址填成 192.168.1.100。同时数据库那边也要确认两件事监听地址不是只绑了 127.0.0.1以及登录用户的 host 允许远程访问。以 MySQL 为例检查监听sudo netstat -tlnp | grep 3306如果显示 127.0.0.1:3306说明 MySQL 只允许本机连接需要改配置文件里的 bind-address 为 0.0.0.0重启 MySQL。检查连接用户SELECT user, host FROM mysql.user;如果 host 是 localhost而你要从另一台机器连接就要创建一个允许任意 IP 访问的用户或者至少指定宿主机的网段CREATE USER dev192.168.1.% IDENTIFIED BY your_password; GRANT SELECT, INSERT, UPDATE, DELETE ON yourdb.* TO dev192.168.1.%; FLUSH PRIVILEGES;填完这些参数后点“测试连接”如果显示成功说明容器和数据库之间的通路没问题。第一次配置稍微麻烦点但后面再建连接就是复制粘贴的事。3.2 数据浏览、SQL 查询与导入导出连接建立后Databaseus 的界面会展示出数据库的表、视图、存储过程等信息。常用的操作主要集中在这几个地方。数据浏览点击某张表右侧会出现表结构和数据列表。支持按条件过滤、排序也可以直接在里面编辑行数据。编辑时会生成对应的 UPDATE 语句你可以先看到再执行这点比 Navicat 里直接改单元格要安全一点。SQL 查询这是最常用的功能。界面里一般会有一个 SQL 编辑器支持多标签页可以同时写多段 SQL。我举个例子比如要查用户和订单数SELECT u.id, u.email, COUNT(o.id) AS order_count FROM users u LEFT JOIN orders o ON o.user_id u.id GROUP BY u.id, u.email ORDER BY order_count DESC LIMIT 50;执行后结果会直接显示在下方表格里可以复制成 CSV、Excel也可以直接导出完整结果集。对日常运营取数来说非常方便。导入导出也是经常用到的功能。导出时我一般选 CSV 或 Excel注意编码选 UTF-8否则中文可能在 Excel 里变成乱码。导入数据前先在数据库里把表结构建好字段顺序和文件列顺序尽量保持一致。如果字段对不上某些导入工具会报错非常浪费时间。另外提一个加分功能SQL 查询保存。把常用的查询存成“查询模板”下次团队里任何人打开都能直接看到。比如“本周新增用户数”“每日订单量”这种固定查询存好后整个团队拿到的口径就是一致的避免了“同一个指标不同人查出来数字不一样”的尴尬。3.3 多用户、只读账号和团队协作单机自己用Databaseus 只用管理员账号就够了。但一旦要给团队用就必须把用户体系设计好。我的习惯是分三种角色管理员负责管理连接配置、创建用户、分配权限。开发账号可以读写用于调试和修改数据。只读账号只能执行 SELECT用于产品、运营、数据分析师等非开发角色。创建用户时Databaseus 一般会提供“绑定连接”和“限制权限”的选项。我只给业务同学绑定他们需要的那个库不要把所有连接都甩给他们。这样做的好处有两个一是降低了误操作风险二是数据库密码不用在群里传来传去所有人的访问都走 Databaseus 这一层。只读账号尤其重要。运营同学有时候只是想看个数据你给他生产库的写权限万一他手滑在后台点了个删除那场面非常可怕。我在 Databaseus 里给运营开完只读账号后后面很长时间都没再出现过“数据被误改”的情况。如果你比较在意审计可以打开操作日志功能。日志会记录某个用户在哪段时间执行了哪些 SQL。虽然不是所有情况都能完全防住但出了问题至少能追溯而不是只能靠猜。4. 部署后最容易踩的坑排查思路与安全加固4.1 连不上数据库先按这个顺序排查容器跑起来了页面也打开了但“测试连接”就是失败。这种情况我在群里被问过很多次频率最高的原因无非下面几种。整理成一张速查表你遇到问题直接按表检查。症状常见原因检查方式Connection refused数据库只监听了 127.0.0.1netstat -tlnp 查看端口监听地址改 bind-addressConnection refused防火墙或云安全组没放行ufw status、云控制台安全组规则Access denied数据库用户 host 不匹配查询 mysql.user创建 user%连接超时 timeout容器和数据库不在同一网络用宿主机 IP或加入同一自定义网络host 解析失败填写了不存在的容器名确认网络配置避免跨网络用容器名通信还有一个小技巧如果 Databaseus 和你的 MySQL、PostgreSQL 都跑在 Docker 里但属于不同的 compose 项目它们默认不在同一个网络互相之间是访问不到的。最简单的解决办法是创建一个外部网络然后让两个容器都加进去docker network create db-web-net然后在各自的 docker-compose.yml 里给服务增加声明networks: default: external: name: db-web-net这样 Databaseus 容器里填数据库容器名比如 mysql-server作为主机地址就能打通了。4.2 数据容易丢、时区乱、日志疯涨怎么办这几个问题不是同时出现的但都是部署后大概率会遇到的我分开说。数据丢失问题。最典型的表现是容器重新创建后之前配置的连接、用户全没了。原因基本只有一个就是启动容器时没挂 volume。解决方案已经在 2.2 节的 compose 文件里写了目录映射成宿主机路径后卸载容器再重新 docker compose up数据还在。强烈建议部署完就验证一次进入配置页面记住当前状态然后 docker compose down docker compose up -d看看配置是否还在。这一步花不了两分钟但能避免将来升级时措手不及。时区问题。如果创建连接后看到的时间戳和本地时间差了 8 小时十有八九是容器时区没设置。用环境变量 TZAsia/Shanghai 解决。如果容器内的应用有自己的时间配置还需要去页面的设置里把时区也改一下。这个坑不严重但特别影响判断尤其是查日志定位问题的时候。日志疯涨问题。容器运行时间长了docker logs 会积累大量日志不停占磁盘空间。可以在 compose 文件里给服务加一段 log 配置logging: driver: json-file options: max-size: 10m max-file: 3这样单份日志文件最大 10MB最多保留 3 份超过就会滚动清理。对于这种长期跑的 Web 管理工具来说非常实用。4.3 公网访问前必须做的安全配置Databaseus 管的是数据库连接里面存了服务器地址、用户名、密码信息属于高价值目标。如果你只是为了内网访问那基本做好账号密码保护就行。但如果想从公网访问下面这几项一定要做。第一不要直接把 8080 端口暴露到公网。我自己更推荐用 Nginx 反向代理然后对访问加一层 HTTP Basic Auth。即使有人知道了 Databaseus 地址也要再输一次独立的访问密码。Nginx 配置大概是这样location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; auth_basic Restricted; auth_basic_user_file /etc/nginx/.htpasswd; }第二有条件就上 HTTPS。现在 Let’s Encrypt 证书申请很方便用 certbot 就能自动续期。凡是承载用户密码和数据库凭据的 Web 应用没有加密传输就等于裸奔登录时密码会被抓包看到。第三云服务器的话在安全组层面只放行需要的端口。比如只开 80 和 443把 8080 留在内网。这样即使内网某个服务被攻破攻击者也无法直接通过外网探测到管理界面。第四Databaseus 的管理员密码一定要足够强不要用 admin 这种默认用户名能改就改。支持多因素认证的话管理员账号务必开启。安全管理这件事偷懒一时爽出事火葬场。5. 体验复盘与健壮性优化让工具长期稳定跑5.1 资源占用与控制策略部署完用了几天后我对 Databaseus 的资源占用很关注。毕竟它是常驻服务如果吃内存太多会影响同一台 Ubuntu 服务器上的其他业务。查看实时占用用一行命令docker stats databaseus这个命令输出类似 PS 的实时监控界面能看到 CPU、内存、网络 IO。以我用的镜像版本为例空闲状态下内存占用大概在一两百 MB 这个量级具体取决于镜像基于什么语言写的。如果内存占用偏高可以在启动容器时加限制docker run -d --name databaseus --memory512m databaseus/databaseus:latestCompose 文件里可以这样写services: databaseus: image: databaseus/databaseus:latest mem_limit: 512m注意Docker 限制内存后如果工具本身需要做大批量数据导出可能会变慢或报错。所以限制给一个够用的上限即可不要卡太死。我一般设 512M日常使用和导出都能兼顾。另外如果把 Databaseus 部署在低配机器比如 1G 内存的 VPS上建议不要同时运行太多大型 Web 服务否则内存不足时内核会 OOM随机杀进程受害的往往是最安静的那个容器。5.2 数据备份与版本升级的稳妥流程长期使用任何工具都要考虑两件事数据备份和版本升级。Databaseus 的连接配置、用户信息都在我们挂载的数据卷里。备份很简单就是对宿主机上的数据目录打一个 tar 包cd ~/databaseus tar czf databaseus-backup-$(date %F).tar.gz ./databaseus-data建议配合 crontab 定时执行比如每天凌晨备份一次保留最近 7 天的备份0 2 * * * cd /home/yourname/databaseus tar czf backups/databaseus-$(date \%F).tar.gz databaseus-data find backups -type f -mtime 7 -delete升级时注意流程不要一上来就 docker compose pull 然后 up -d。稳妥的顺序是docker compose pull docker compose up -d --force-recreate升级前确保数据卷已经备份。因为我遇到过个别版本升级后数据目录结构有变化旧备份能帮你随时回滚。回滚操作也不复杂重新指定旧版本镜像标签执行 up -d --force-recreate 即可。还有一个很容易忽略的操作升级后去页面上确认一下连接还在不在、能不能正常测试连接。有时候镜像升级会顺带升级底层依赖导致 JDBC 驱动版本变化数据库连接可能会因此出问题。这些情况虽然少见但防范一下总没错。5.3 从单机到团队使用的扩展建议如果你用完觉得不错想进一步把它变成团队级工具下面几个方向可以参考。首先是统一入口。给 Databaseus 配一个内网域名比如 db.internal.example.com通过 Nginx 做 HTTPS 反向代理。这样团队成员只需要记住一个域名不用记 IP 加端口。配合 4.3 节的 Basic Auth管理和使用体验都会好很多。其次是账号规范化。不要让大家用同一个 admin 账号登录。规范化操作分成两步管理员在 Databaseus 里给每个人创建账号把数据库层面的访问账号收敛为只读和读写两种按需分配。这样做以后每个人做了什么操作能查数据库密码也不需要分发给所有人。再一个方向是结合自动化巡检。如果你的 Databaseus 支持 API 或用脚本读取查询结果可以把“当天新增订单量”“数据库连接数”这类监控查询做成定时脚本把结果推到内部通知群。这等于把你的数据库管理工具变成一个轻量数据平台入口比单纯“能查数据”又进了一步。我个人在实际操作中的体会是工具选型不用追求大而全能把“Ubuntu 服务器上统一管数据库”这件事做顺就已经解决了团队里大部分低效问题。Databaseus 加上 Docker 的体积和轻量优势尤其适合不想背上重型平台负担的中小型团队。如果你正纠结选哪款 Web 数据库管理工具可以按照这篇文章的流程先跑一遍遇到连不上库、数据卷丢失、公网访问不安全这些问题回到第 4 节对着排查就行。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →