drawDB v1.8.2 Docker Compose 部署指南

使用官方镜像 ghcr.io/drawdb-io/drawdb:v1.8.2 通过 Docker Compose 一键部署 drawDB:compose.yml 编写、镜像拉取、启动验证、环境变量注入、开发模式与生产模式两种形态及运维命令的完整实测流程。

drawDBdrawDBDockerDocker ComposeLinux2026/10/17

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.1v1.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

逐项说明:

配置项取值说明
imageghcr.io/drawdb-io/drawdb:v1.8.2锁定正式 tag,保证多环境一致
container_namedrawdb固定实例名,便于 docker logs drawdb 查看
ports"3000:80"宿主 3000 → 实例 80;改宿主端口只动左侧
environment.VITE_BACKEND_URL""分享后端地址,空 = 不启用分享(保持核心功能)
environment.VITE_GIST_BACKEND_URL""分享/版本 gist 后端地址,空 = 跟随 backendUrl
restartunless-stopped宿主重启后自动拉起,手动 stop 则不拉
networks.default.driverbridge单服务默认桥接即可,无需自定义网络

💡 技术拓展: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_URLhttp://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.htmlSPA 路由回退已内置,无需额外配置
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 核对注入值。

十二、参考链接