本文使用的 Docker 镜像
本文基于 dolibarr/dolibarr:22.0.5,以 22.0.5 版本实测,测试平台 Ubuntu 24.04 Linux。
小公司开报价单还在 Word 里改抬头,客户电话散在销售微信与旧 Excel;仓库盘点一张纸,财务月底再手工对一遍发票号。换人交接时说不清「哪份才是最终版」,催款也要对着聊天记录翻。业务体量不大,却已经需要联系人、报价、订单、库存和简单财务在同一处。
把整套系统塞进公有云 SaaS,客户资料与发票附件会出域;自己从源码装 PHP、配 Apache、再手搓 MySQL,对只要先有一个内网网址的人成本太高。机房或家里已经有一台跑 Docker 的 Ubuntu,缺的是:镜像能拉下来、库和应用一起起来、浏览器打开就能建公司与客户。
Dolibarr(官网、GitHub · dolibarr/dolibarr、镜像页)是开源 ERP / CRM:客户与供应商、报价与发票、库存、费用报销、休假等能力按模块开关。官方镜像 dolibarr/dolibarr 只带 Web(PHP + Apache),不内置数据库,需外挂 MariaDB / MySQL。本文使用 dolibarr/dolibarr:22.0.5 版本实测:Compose 拉起 Web 与 MariaDB 后自动建库建管理员,附件与外部模块落在本机目录。
跑通之后,可以在浏览器里完善公司资料、按需打开模块,再建客户、开报价,或先走费用报销 / 休假这类人事流程——业务数据都在自己的盘上。
一、环境要求
| 项目 | 建议 |
|---|---|
| 系统 | Linux,建议 Ubuntu 24.04;macOS 目录用 ~/docker/dolibarr |
| Docker | Engine + Compose V2 |
| 架构 | linux/amd64、linux/arm64(22.0.5 均有) |
| 内存 | 建议 ≥ 2 GB 空闲(Web + MariaDB) |
| 磁盘 | 应用 DISK 1.33 GB / CONTENT 319 MB;MariaDB DISK 455 MB / CONTENT 108 MB;业务数据另计 |
| 端口 | 宿主机 8088 → 容器 80 |
| 工作目录 | /www/wwwroot/dolibarr |
bashdocker --version docker compose version
Linux 未装 Docker 可使用轩辕镜像一键安装脚本:
bashbash <(wget -qO- https://get.xuanyuan.cloud/docker.sh)
备用地址:
bashbash <(wget -qO- https://get.xuanyuan.me/docker.sh)
更多见 轩辕镜像使用手册。
二、拉取镜像
2.1 标签怎么选
| 标签 | 说明 | 本文是否采用 |
|---|---|---|
22.0.5 | 22.x 较新的具体稳定版;amd64 / arm64 | 采用 |
22.0.5-php8.2 | 与 22.0.5 同源,标明 PHP 8.2 | 可等价选用 |
22.0.4 及更早 | 旧补丁 | 仅回退时用 |
develop | 开发线 | 勿写入生产命令 |
latest | 浮动标签 | 勿写入文中命令 |
完整列表见 标签页。升级时只改 Compose 里的应用标签,保留 mariadb、documents、custom 三个目录,并处理 install.lock(见 FAQ)。
2.2 用轩辕镜像加速拉取
bashdocker pull docker.xuanyuan.run/dolibarr/dolibarr:22.0.5 docker pull docker.xuanyuan.run/library/mariadb:11.4.13
Ubuntu 24.04 实测:
text22.0.5: Pulling from dolibarr/dolibarr ... Digest: sha256:a9f033f7a37a8270d6190c477cb0510fbe3e7da77384715e7773856894cd13ec Status: Downloaded newer image for docker.xuanyuan.run/dolibarr/dolibarr:22.0.5 docker.xuanyuan.run/dolibarr/dolibarr:22.0.5
text11.4.13: Pulling from library/mariadb ... Digest: sha256:70cc072b29b4a89ae07abb2d4da2c64678a7f2dfe092751bb51c87d67dc1338b Status: Downloaded newer image for docker.xuanyuan.run/library/mariadb:11.4.13 docker.xuanyuan.run/library/mariadb:11.4.13
textIMAGE DISK USAGE CONTENT SIZE docker.xuanyuan.run/dolibarr/dolibarr:22.0.5 1.33GB 319MB docker.xuanyuan.run/library/mariadb:11.4.13 455MB 108MB
三、Docker Compose 部署(主路径)
顺序:建目录 → 写入 compose.yaml → up -d → 等自动安装完成 → 浏览器登录。
数据目录用 /www/wwwroot/dolibarr;宿主机映射 8088(避免与本机 80 上的面板 / Nginx 冲突);镜像固定 22.0.5 与 MariaDB 11.4.13。
3.1 准备目录
bashsudo mkdir -p /www/wwwroot/dolibarr/{mariadb,documents,custom} sudo chown -R 1000:1000 /www/wwwroot/dolibarr/documents /www/wwwroot/dolibarr/custom cd /www/wwwroot/dolibarr
macOS 把路径换成 ~/docker/dolibarr,chown 数字与 id -u / id -g 一致。
| 宿主机目录 | 容器路径 | 用途 |
|---|---|---|
./mariadb | /var/lib/mysql | 数据库 |
./documents | /var/www/documents | 附件与 install.lock |
./custom | /var/www/html/custom | 外部模块 |
3.2 写入 compose.yaml
把 DOLI_URL_ROOT 改成你实际访问地址(含端口)。下文局域网示例为 http://192.168.1.35:8088。
bashcd /www/wwwroot/dolibarr cat > compose.yaml <<'EOF' services: mariadb: image: docker.xuanyuan.run/library/mariadb:11.4.13 container_name: dolibarr-mariadb restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: change-me-root-pass MYSQL_DATABASE: dolidb MYSQL_USER: dolidbuser MYSQL_PASSWORD: change-me-db-pass volumes: - ./mariadb:/var/lib/mysql healthcheck: test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] interval: 10s timeout: 5s retries: 10 web: image: docker.xuanyuan.run/dolibarr/dolibarr:22.0.5 container_name: dolibarr-web restart: unless-stopped depends_on: mariadb: condition: service_healthy environment: DOLI_INSTALL_AUTO: "1" DOLI_INIT_DEMO: "0" DOLI_PROD: "1" DOLI_DB_HOST: mariadb DOLI_DB_NAME: dolidb DOLI_DB_USER: dolidbuser DOLI_DB_PASSWORD: change-me-db-pass DOLI_URL_ROOT: "http://192.168.1.35:8088" DOLI_ADMIN_LOGIN: admin DOLI_ADMIN_PASSWORD: change-me-admin-pass DOLI_COMPANY_NAME: "MyCompany" DOLI_COMPANY_COUNTRYCODE: "CN" DOLI_CRON: "0" WWW_USER_ID: "1000" WWW_GROUP_ID: "1000" PHP_INI_DATE_TIMEZONE: "Asia/Shanghai" PHP_INI_MEMORY_LIMIT: "256M" ports: - "8088:80" volumes: - ./documents:/var/www/documents - ./custom:/var/www/html/custom EOF
要点:
DOLI_DB_PASSWORD必须与MYSQL_PASSWORD一致- 管理员账号由
DOLI_ADMIN_LOGIN/DOLI_ADMIN_PASSWORD在首次安装时创建;上线前改成强密码,登录后再改一次 DOLI_INIT_DEMO=1才会灌演示数据;正式环境保持0- 需要定时任务时设
DOLI_CRON=1,并配置DOLI_CRON_KEY
3.3 启动并查看状态
bashcd /www/wwwroot/dolibarr docker compose up -d docker compose ps docker compose logs -f web
实测:MariaDB 约 46 s 变为 healthy 后 Web 才启动。首次会导入大量 llx_*.sql,可能持续数分钟,等日志出现就绪句再开浏览器。
text[+] up 3/3 ✔ Network dolibarr_default Created ✔ Container dolibarr-mariadb Healthy ✔ Container dolibarr-web Started
textNAME IMAGE STATUS PORTS dolibarr-mariadb docker.xuanyuan.run/library/mariadb:11.4.13 Up … (healthy) 3306/tcp dolibarr-web docker.xuanyuan.run/dolibarr/dolibarr:22.0.5 Up … 0.0.0.0:8088->80/tcp
logs -f web 摘录(中间建表日志已省略):
textdocker-run.sh started Current Version of files is : 22.0.5 DOLI_INSTALL_AUTO is on, so we check to initialize or upgrade mariadb database No table found, we launch initializeDatabase Importing table from llx_accounting_account.sql ... ... Create SuperAdmin account ... Activating module User... OK Configuring for country : 9:CN:China Database Version is : 22.0.5 Files Version are : 22.0.5 Schema update is not required ... Enjoy ! *** You can connect to the running Dolibarr web application with: http://127.0.0.1:port Apache/2.4.68 (Debian) configured -- resuming normal operations
出现 You can connect to the running Dolibarr web application 且 Apache 已就绪后,Ctrl+C 退出跟随即可。mkdir … conf: File exists 与 AH00558 可忽略(见 FAQ)。
bashcurl -sI http://127.0.0.1:8088/ | head -n 5
textHTTP/1.1 200 OK Date: Thu, 24 Sep 2026 07:15:53 GMT Server: Apache Set-Cookie: DOLSESSID_…=…; path=/; HttpOnly; SameSite=Lax Expires: Thu, 19 Nov 1981 08:52:00 GMT
四、浏览器初始化
打开 http://192.168.1.35:8088(换成你的 IP 或域名)。用 Compose 里的管理员登录:用户名 admin,密码为 DOLI_ADMIN_PASSWORD(示例 change-me-admin-pass)。

登录后先到「设置」:页面会提示完善公司 / 组织,并启用模块——侧栏菜单要等对应模块打开后才会出现。

在「公司 / 组织」核对公司名、国家(本文为 China / CN)等。主币种若仍是欧元,可按本地业务改成人民币后保存。

再到「模块 / 应用」按需打开:例如第三方(客户)、商业提案 / 发票、产品与库存,或人事里的费用报销、休假。用户模块在自动安装时已启用。

「主题 → 语言和呈现」可调默认语言;浏览器已是中文时,保持「自动检测」即可。

最后立刻改管理员密码,并确认地址栏与 DOLI_URL_ROOT 一致,避免生成错误链接。
五、功能演示
「我的看板」汇总逾期、报销、休假等卡片;新装多为 SuperAdmin,业务计数为 0。

启用人事相关模块后,顶栏会出现「人事管理」。费用报销、休假列表在新装时为空属正常——可从「+」新建单据做冒烟。


销售与库存侧常见路径:启用「第三方」等模块后,新建客户 / 供应商 → 报价或订单 → 发票;库存模块打开后再维护产品与出入库。合同、PDF 等附件落在 documents 卷,备份时连同 mariadb、custom 一起打包即可。
更细模块说明见 Dolibarr Wiki。
六、备选:docker run
仅适合临时试玩。若已按第三节 Compose 在跑,先 docker compose down,避免容器名冲突。
bashsudo mkdir -p /www/wwwroot/dolibarr/{mariadb,documents,custom} sudo chown -R 1000:1000 /www/wwwroot/dolibarr/documents /www/wwwroot/dolibarr/custom docker network create dolibarr-net docker run -d \ --name dolibarr-mariadb \ --network dolibarr-net \ --restart unless-stopped \ -e MYSQL_ROOT_PASSWORD=change-me-root-pass \ -e MYSQL_DATABASE=dolidb \ -e MYSQL_USER=dolidbuser \ -e MYSQL_PASSWORD=change-me-db-pass \ -v /www/wwwroot/dolibarr/mariadb:/var/lib/mysql \ docker.xuanyuan.run/library/mariadb:11.4.13 # 等数据库就绪后再启动 Web(约数十秒) docker run -d \ --name dolibarr-web \ --network dolibarr-net \ --restart unless-stopped \ -p 8088:80 \ -e DOLI_INSTALL_AUTO=1 \ -e DOLI_DB_HOST=dolibarr-mariadb \ -e DOLI_DB_NAME=dolidb \ -e DOLI_DB_USER=dolidbuser \ -e DOLI_DB_PASSWORD=change-me-db-pass \ -e DOLI_URL_ROOT=http://192.168.1.35:8088 \ -e DOLI_ADMIN_LOGIN=admin \ -e DOLI_ADMIN_PASSWORD=change-me-admin-pass \ -e DOLI_COMPANY_NAME=MyCompany \ -e DOLI_COMPANY_COUNTRYCODE=CN \ -e WWW_USER_ID=1000 \ -e WWW_GROUP_ID=1000 \ -v /www/wwwroot/dolibarr/documents:/var/www/documents \ -v /www/wwwroot/dolibarr/custom:/var/www/html/custom \ docker.xuanyuan.run/dolibarr/dolibarr:22.0.5
bashdocker ps --filter name=dolibarr docker logs --tail 100 dolibarr-web
七、常见问题
为什么不用 latest?
浮动标签会静默更新,界面与迁移步骤可能和文档脱节。正文使用 22.0.5;升级时主动改标签并先备份。
为什么宿主机是 8088?
容器内监听 80;宿主机 80 常被 Nginx、宝塔占用。空闲时可改 "80:80",并同步改 DOLI_URL_ROOT。
和 tuxgasy/dolibarr 有什么区别?
社区曾常用 tuxgasy/dolibarr;本文用官方坐标 dolibarr/dolibarr(见 dolibarr-docker)。两套不要共用同一份 documents / 库目录。
和 Odoo / ERPNext 怎么选?
Dolibarr 更轻,模块可逐步打开,适合中小团队先跑通销售与库存。Odoo / ERPNext 能力面通常更广,学习与运维成本也更高。按团队规模选型即可,不要和本文 Compose 混部。
国家选了 China,主币种仍是欧元?
自动安装会写入国家代码,币种仍可能保持默认欧元。到「公司 / 组织」改成人民币(或所需币种)后保存。
页面空白或安装很久?
看 docker compose logs web / mariadb:库未就绪、密码不一致、documents 权限不对都会卡住。首次冷启动导入数百个 SQL,可能要数分钟;等就绪句与 Apache 起来再访问。
日志里 mkdir: … conf: File exists?
脚本尝试创建已存在的 conf,可忽略。
日志里 AH00558 / ServerName?
Apache 未设全局 ServerName 的提示,可忽略;要消除可按上游说明挂载 servername.conf。
升级大版本怎么做?
- 备份
mariadb、documents、custom - 删除
documents/install.lock - 改 Compose 镜像标签后:
docker compose pull && docker compose up -d - 保持
DOLI_INSTALL_AUTO=1自动迁移,或访问/install向导升级
如何启用演示数据?
仅首次安装前设 DOLI_INIT_DEMO=1。库已建好后,改环境变量不会补灌演示数据。
可以用 PostgreSQL 吗?
设 DOLI_DB_TYPE=pgsql 并改连 PostgreSQL。官方要求首次走网页 /install,并自行维护 install.lock。本文主路径用 MariaDB。
密码能否用 Docker Secrets?
部分变量支持 _FILE 后缀(如 DOLI_DB_PASSWORD_FILE),见上游 with-secrets。
八、命令速查
bash# 拉取 docker pull docker.xuanyuan.run/dolibarr/dolibarr:22.0.5 docker pull docker.xuanyuan.run/library/mariadb:11.4.13 # Compose cd /www/wwwroot/dolibarr docker compose up -d docker compose ps docker compose logs -f web docker compose down # 探测 curl -sI http://127.0.0.1:8088/ | head -n 5
九、延伸阅读
阅读原文
评论交流
免责声明
本博客文章所提供的内容、技术方案、配置示例及部署指南等信息,仅供学习交流和技术参考使用。文章内容基于发布时的技术环境和版本信息编写,可能因时间推移、技术更新或环境差异而存在不适用的情况。
用户在参考本博客内容进行部署操作前,应当充分了解相关技术风险,并建议在测试环境中进行充分验证和测试,确认无误后再考虑在生产环境中使用。生产环境部署前,请务必进行数据备份,并制定相应的回滚方案。
用户因使用本博客内容进行部署操作而产生的任何损失、数据丢失、系统故障、安全风险或其他问题,均由用户自行承担全部责任。轩辕镜像官方不对因使用本博客内容而产生的任何直接或间接损失承担责任。
本免责声明的最终解释权归轩辕镜像官方所有。
