drawDB v1.8.2 Docker Compose 部署指南
使用官方镜像 ghcr.io/drawdb-io/drawdb:v1.8.2 通过 Docker Compose 一键部署 drawDB:compose.yml 编写、镜像拉取、启动验证、环境变量注入、开发模式与生产模式两种形态及运维命令的完整实测流程。
drawDB v1.8.2 Docker Compose 部署指南
目标:使用官方镜像
ghcr.io/drawdb-io/drawdb:v1.8.2,通过 Docker Compose 在 Ubuntu 服务器上一键部署 drawDB ER 图编辑器:镜像选型 → compose.yml 编写 → 启动 → HTTP 验证 → 环境变量注入 → 常用运维命令,并实测官方仓库自带的开发模式 compose.yml。已在 Ubuntu 22.04(宿主)+ Docker Engine 29.8.1 + Docker Compose v5.5.1 环境全程实测通过。
一、环境信息
- 宿主操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Docker Engine:29.8.1(
docker version实测),存储驱动 overlayfs,cgroup v2 - Docker Compose:v5.5.1(
docker compose version实测) - drawDB 镜像:
ghcr.io/drawdb-io/drawdb:v1.8.2(nginx 1.30.3 stable-alpine3.23 基础,116 MB) - 部署目录:
/opt/drawdb,配置文件docker-compose.yml - 端口映射:宿主 3000 → 实例内 80
- 验证地址:
http://192.168.1.231:3000/(示例地址,下文同,换成部署服务器的实际地址)
drawDB 官方镜像自带 nginx 并已内置 SPA 路由回退与 /config.js 运行时配置端点,部署后无需再改 nginx 配置即可正常使用绘图、导出 SQL、模板等全部核心功能。
二、镜像选型说明
drawDB 官方镜像发布在 GitHub Container Registry(ghcr.io),Docker Hub 上没有官方仓库(实测 docker.io/drawdb/drawdb 返回 0 个 tag)。实测 ghcr.io 全部 tag:
| 镜像 tag | 说明 |
|---|---|
| latest | 跟随主干,版本漂移,不推荐生产 |
| v1.2.0 ~ v1.7.0 | 历史版本 |
| v1.8.0 / v1.8.1 | v1.8 系列旧版 |
| v1.8.2 | 最新正式 tag(镜像构建时间 2026-09-29T21:53:44Z),本文采用 |
镜像关键元数据(docker image inspect 实测):
created=2026-09-29T21:53:44.508946163Z os=linux arch=amd64 exposed=map[80/tcp:{}] env=[PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin NGINX_VERSION=1.30.3 PKG_RELEASE=1 DYNPKG_RELEASE=1 NJS_VERSION=0.9.9 NJS_RELEASE=1 ACME_VERSION=0.4.1 VITE_BACKEND_URL= VITE_GIST_BACKEND_URL=]
选型结论:生产固定 v1.8.2;latest 仅用于体验最新主干。镜像仅暴露 80 端口,VITE_BACKEND_URL/VITE_GIST_BACKEND_URL 两个环境变量默认为空(分享后端地址,见第六章)。
三、前置条件
宿主已安装 Docker Engine 24+ 与 Compose v2 插件。验证:
docker version --format 'Engine {{.Server.Version}}' && docker compose version
实测回显:
Engine 29.8.1
Docker Compose version v5.5.1
验证 registry 连通性(ghcr.io):第四章的 docker compose up -d 会自动拉取镜像,若网络受限先手动拉取验证(见 4.2)。
四、部署步骤(官方镜像方式,推荐)
4.1 创建部署目录与 compose.yml
mkdir -p /opt/drawdb && cd /opt/drawdb
创建 docker-compose.yml(生产推荐形态,固定版本 + 自愈重启):
services:
drawdb:
image: ghcr.io/drawdb-io/drawdb:v1.8.2
container_name: drawdb
ports:
- "3000:80"
environment:
VITE_BACKEND_URL: ""
VITE_GIST_BACKEND_URL: ""
restart: unless-stopped
networks:
default:
driver: bridge
逐项说明:
| 配置项 | 取值 | 说明 |
|---|---|---|
image | ghcr.io/drawdb-io/drawdb:v1.8.2 | 锁定正式 tag,保证多环境一致 |
container_name | drawdb | 固定实例名,便于 docker logs drawdb 查看 |
ports | "3000:80" | 宿主 3000 → 实例 80;改宿主端口只动左侧 |
environment.VITE_BACKEND_URL | "" | 分享后端地址,空 = 不启用分享(保持核心功能) |
environment.VITE_GIST_BACKEND_URL | "" | 分享/版本 gist 后端地址,空 = 跟随 backendUrl |
restart | unless-stopped | 宿主重启后自动拉起,手动 stop 则不拉 |
networks.default.driver | bridge | 单服务默认桥接即可,无需自定义网络 |
💡 技术拓展:
restart策略选择——no(默认,永不重启)/always(总是重启,含宿主开机)/unless-stopped(除手动 stop 外都重启)/on-failure(仅异常退出时重启)。drawDB 是静态站点服务,进程即 nginx,正常不会异常退出,采用unless-stopped可在保留手动停机意图的同时获得开机自启。
4.2 拉取镜像
docker pull ghcr.io/drawdb-io/drawdb:v1.8.2
实测回显(节选末尾):
Digest: sha256:9e370f4f6facf6da04b2576606fde3c0d2debdd56f479a4b5adb61fc2262fcab
Status: Downloaded newer image for ghcr.io/drawdb-io/drawdb:v1.8.2
ghcr.io/drawdb-io/drawdb:v1.8.2
⚠️ 排障实录:拉取超时或
Error response from daemon: Get "https://ghcr.io/v2/": ...时,为 Docker 守护进程配置 HTTP 代理(/etc/docker/daemon.json或/etc/systemd/system/docker.service.d/http-proxy.conf中设置HTTPS_PROXY=http://192.168.1.62:7897,代理地址换成自己环境实际可用的),然后systemctl daemon-reload && systemctl restart docker再拉取。
4.3 启动
cd /opt/drawdb && docker compose up -d
实测回显:
Network drawdb_default Created
Container drawdb Creating
Container drawdb Starting
Container drawdb Started
查看运行状态:
cd /opt/drawdb && docker compose ps
实测回显:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
drawdb ghcr.io/drawdb-io/drawdb:v1.8.2 "/docker-entrypoint.…" drawdb Less than a second ago Up Less than a second 0.0.0.0:3000->80/tcp, [::]:3000->80/tcp
查看实例内 nginx 启动日志:
docker logs drawdb
实测回显(节选末尾):
2026/10/17 02:20:09 [notice] 1#1: start worker process 44
2026/10/17 02:20:09 [notice] 1#1: start worker process 45
2026/10/17 02:20:09 [notice] 1#1: start worker process 46
2026/10/17 02:20:09 [notice] 1#1: start worker process 47
2026/10/17 02:20:09 [notice] 1#1: start worker process 48
4.4 验证
HTTP 状态与响应头(镜像内置 nginx 版本为 1.30.3):
curl -sI http://localhost:3000/ | head -5
实测回显:
HTTP/1.1 200 OK
Server: nginx/1.30.3
Date: Sat, 17 Oct 2026 02:20:18 GMT
Content-Type: text/html
Content-Length: 2292
验证运行时配置端点(镜像启动时由环境变量注入生成):
curl -s http://localhost:3000/config.js
实测回显:
window.__DRAWDB_CONFIG__ = { backendUrl: "", gistBackendUrl: "" };
验证 SPA 路由回退与入口标题:
curl -s -o /dev/null -w '/editor -> %{http_code}\n' http://localhost:3000/editor && curl -s http://localhost:3000/ | grep -o '<title>[^<]*</title>'
实测回显:
/editor -> 200
<title>drawDB | Online database diagram editor and SQL generator</title>
最后用浏览器访问 http://192.168.1.231:3000/(示例地址,换成部署服务器的实际地址),点「Open Editor」进入编辑器验证绘图功能。
4.5 重启恢复验证
模拟宿主重启场景(down 后再 up):
cd /opt/drawdb && docker compose down && docker compose up -d
实测回显:
Network drawdb_default Removing
Network drawdb_default Removed
Container drawdb Started
curl -s -o /dev/null -w 'after restart -> %{http_code}\n' http://localhost:3000/
实测回显:
after restart -> 200
五、数据持久化说明
drawDB 是纯前端静态应用,服务端零数据:用户绘制的图表全部保存在各自浏览器的 IndexedDB 里(浏览器本地库),镜像内只有静态文件与 nginx 配置,没有数据库、没有需要挂载的数据卷。因此:
- 不需要为图表数据配置 volumes——图表数据不在服务器上;
- 重建实例(
down+up)不丢任何用户图表; - 服务器侧唯一有价值的持久化对象是访问日志(nginx 标准日志已输出到实例 stdout,由 Docker 日志驱动接管,无需额外挂载)。
⚠️ 注意:正因为数据存浏览器,用户清理浏览器数据(或 Flush storage)会丢失图表。需要备份图表时使用编辑器内「Export as → JSON」或「Export saved data」导出文件(见《drawDB v1.8.2 进阶实战与运维》)。
六、环境变量表
| 环境变量 | 默认值 | 作用 | 取值示例 |
|---|---|---|---|
VITE_BACKEND_URL | ""(空) | drawdb-server 分享后端地址;实例启动时注入 /config.js 的 backendUrl 字段 | http://192.168.1.100:5000 |
VITE_GIST_BACKEND_URL | ""(空) | gist 风格分享/版本后端地址;为空时回退用 VITE_BACKEND_URL | http://192.168.1.100:5000 |
两个变量都留空时(本文 4.1 配置),前端回落到默认值 http://localhost:5000,仅影响「分享」「版本记录」入口(点击分享会连接失败),绘图与导出功能完全正常。填法:
environment:
VITE_BACKEND_URL: "http://192.168.1.100:5000"
VITE_GIST_BACKEND_URL: "http://192.168.1.100:5000"
改完执行 docker compose up -d 重建实例,然后验证注入结果:
curl -s http://localhost:3000/config.js
实测回显(留空值时的形态):
window.__DRAWDB_CONFIG__ = { backendUrl: "", gistBackendUrl: "" };
七、配置参数说明
官方镜像的 nginx 配置由模板渲染生成,模板位置 /etc/nginx/templates/default.conf.template,内容为:
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
location = /config.js {
default_type application/javascript;
add_header Cache-Control "no-store";
return 200 "window.__DRAWDB_CONFIG__ = { backendUrl: \"${VITE_BACKEND_URL}\", gistBackendUrl: \"${VITE_GIST_BACKEND_URL}\" };";
}
location / {
try_files $uri /index.html;
}
}
要点解读:
| 配置块 | 说明 |
|---|---|
listen 80 | 实例内固定 80,改对外端口只改 compose 的 ports 左侧 |
location = /config.js | 启动时用环境变量渲染成 /config.js 接口并禁止缓存,这是容器化部署注入后端地址的唯一机制 |
try_files $uri /index.html | SPA 路由回退已内置,无需额外配置 |
root /usr/share/nginx/html | 静态文件目录(构建产物已打进镜像),无挂载需求 |
自定义 nginx 行为时,将改好的模板挂载覆盖该路径即可,例如关闭 80 端口上返回的 config.js 注入逻辑:
volumes:
- ./default.conf.template:/etc/nginx/templates/default.conf.template:ro
修改模板后 docker compose up -d 重建生效,验证方式同 4.4。
八、等价启动命令
不使用 Compose 时,与 4.1 配置等价的一条启动命令:
docker run -d --name drawdb-run -p 3001:80 -e VITE_BACKEND_URL='' -e VITE_GIST_BACKEND_URL='' ghcr.io/drawdb-io/drawdb:v1.8.2
实测回显:
7a357085fcf76e0e1aed0292ff56bb65967f7fcadba0da91fa19538e70a75015
docker ps --filter name=drawdb-run --format '{{.Names}} {{.Status}} {{.Ports}}'
实测回显:
drawdb-run Up 2 seconds 0.0.0.0:3001->80/tcp, [::]:3001->80/tcp
curl -s -o /dev/null -w 'docker-run:3001 -> %{http_code}\n' http://localhost:3001/
实测回显:
docker-run:3001 -> 200
验证后清理该临时实例(Compose 与裸命令二选一即可,避免端口冲突):
docker rm -f drawdb-run
九、常用运维命令
以下命令均在 /opt/drawdb 目录执行(compose 项目根)。
查看状态:
docker compose ps
实测回显(运行中):
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
drawdb ghcr.io/drawdb-io/drawdb:v1.8.2 "/docker-entrypoint.…" drawdb 2 minutes ago Up 2 minutes 0.0.0.0:3000->80/tcp, [::]:3000->80/tcp
查看日志(最近 20 行):
docker compose logs --tail 20 drawdb
实测回显(节选):
drawdb | 2026/10/17 02:20:09 [notice] 1#1: start worker process 44
drawdb | 2026/10/17 02:20:09 [notice] 1#1: start worker process 45
重启:
docker compose restart drawdb
实测回显:
Container drawdb Restarting
Container drawdb Started
停止(保留实例定义):
docker compose stop
实测回显:
Container drawdb Stopped
彻底删除(实例 + 网络,不影响镜像):
docker compose down
实测回显:
Container drawdb Stopped
Container drawdb Removed
Network drawdb_default Removed
十、开发模式 compose.yml(官方仓库自带)
官方仓库根目录另有一份 compose.yml,用于源码热更新开发(不是生产部署形态):
services:
drawdb:
image: node:20-alpine
container_name: drawdb
ports:
- 5173:5173
working_dir: /var/www/html
volumes:
- ./:/var/www/html
command: sh -c "npm install && npm run dev -- --host"
networks:
- default
networks:
default:
driver: bridge
把 drawDB 源码克隆到服务器后,在源码目录启动:
git clone -b v1.8.2 --depth 1 https://github.com/drawdb-io/drawdb.git /srv/drawdb && cd /srv/drawdb
docker compose -p drawdb-dev -f compose.yml up -d
首次启动会在实例内执行 npm install,等待约 1~2 分钟后查看日志确认 Vite 开发服务器就绪:
docker compose -p drawdb-dev logs drawdb
实测回显(就绪标志,节选):
drawdb | VITE v8.1.0 ready in 142 ms
drawdb | ➜ Local: http://localhost:5173/
drawdb | ➜ Network: http://172.20.0.2:5173/
curl -s -o /dev/null -w 'dev 5173 -> %{http_code}\n' http://localhost:5173/
实测回显:
dev 5173 -> 200
⚠️ 注意:开发模式改动源码即时生效,仅用于二次开发调试,不要当生产服务用(无构建优化、实例内实时编译)。生产请用第四章官方镜像方式。
十一、常见问题(FAQ)
Q1:docker compose up -d 报 Conflict. The container name "/drawdb" is already in use?
官方 compose.yml 写死了 container_name: drawdb。同一宿主上跑两份(如既跑生产镜像又跑开发模式)必然撞名。实测报错原文:
Error response from daemon: Conflict. The container name "/drawdb" is already in use by container "1b5a95cec8b492f80ddbffe8e0d19b552cc6f9360c0f8fe838d18e1744a70776". You have to remove (or rename) that container to be able to reuse that name.
处理:停掉旧实例(docker compose down)再启动,或给其中一份改 container_name(如 drawdb-dev)。
Q2:开发模式启动后实例反复重启,日志报 EMFILE / errno: -24?
Vite 文件监视器把 inotify 实例数用尽。实测报错原文(节选):
drawdb | errno: -24,
drawdb | syscall: 'watch',
drawdb | code: 'EMFILE',
drawdb | path: '/var/www/html/vite.config.js',
drawdb | filename: '/var/www/html/vite.config.js'
处理:调大内核 inotify 限制后重启实例:
sysctl -w user.max_inotify_instances=1024 && sysctl -w user.max_inotify_watches=524288
实测回显:
user.max_inotify_instances = 1024
user.max_inotify_watches = 524288
随后 docker compose -p drawdb-dev restart drawdb,日志出现 VITE v8.1.0 ready 即恢复(实测验证)。
Q3:拉取镜像超时 / TLS 错误?
ghcr.io 在部分网络环境不稳定。为 Docker 守护进程配代理后重启(见 4.2 ⚠️),或先在有网的机器 docker pull 后用 docker save -o drawdb.tar ghcr.io/drawdb-io/drawdb:v1.8.2 打包,拷贝到目标机 docker load -i drawdb.tar。
Q4:宿主访问 :3000 无响应?
按序检查:① docker compose ps 确认 STATUS 为 Up;② docker logs drawdb 看 nginx 是否报配置错误;③ 宿主防火墙放行(ufw allow 3000/tcp);④ 云服务器还需在厂商安全组放行 3000 端口。
Q5:改了 environment 不生效?
environment 只在创建实例时注入。修改后必须 docker compose up -d(检测到配置变化会自动重建实例),不能只 restart。重建后用 curl -s http://localhost:3000/config.js 核对注入值。
十二、参考链接
- drawDB 官方仓库:https://github.com/drawdb-io/drawdb
- 官方镜像包:https://github.com/drawdb-io/drawdb/pkgs/container/drawdb
- 官方 compose.yml(开发模式):https://github.com/drawdb-io/drawdb/blob/main/compose.yml
- Docker Compose 官方文档:https://docs.docker.com/compose/
- 可选分享后端 drawdb-server:https://github.com/drawdb-io/drawdb-server