资讯动态

Ubuntu 22.04虚拟机Docker部署ERPNext 14完整指南

发布时间:2026/10/16 13:54:14 来源:尧图企业网站定制
简介在VMware虚拟机的Ubuntu22.04.5系统中通过Docker部署ERPNext14是一份面向企业IT运维、开发人员及需要自建ERP系统技术人员的操作指南。资源仅包含1个docx文档压缩包大小321KB内容紧凑但覆盖完整部署链路。文档先介绍虚拟机基础环境配置再逐步讲解Git、Docker及Docker Compose的安装方法包括系统软件源更新、依赖包安装、GPG密钥验证、用户组配置等关键环节针对Docker Hub拉取失败问题专门说明如何编写daemon.json并配置多个镜像加速器地址。随后以gitee上的汉化开箱即用版为基础演示通过docker compose命令一键启动ERPNext14并在浏览器火狐中访问本地地址完成使用验证。部署完成后可管理财务、销售、采购、库存等模块并具备良好扩展性与社区支持。已有629人学习下载适合希望减少配置时间、快速落地ERP系统的入门及中级用户。1. 给 ERPNext 14 装进虚拟机Docker 方案为什么是最省事的路径如果你手头有一台装着 Ubuntu 22.04 的虚拟机又被要求尽快跑起一套 ERPNext 14最直接的选择就是用 Docker 部署。ERPNext 是开源且功能完整的企业资源规划系统涵盖财务、销售、采购、库存和项目管理但它的依赖链相当长直接源码安装光是编译和配 Python 环境就能耗掉大半天。用 Docker 把整个运行环境做成容器一条命令拉起一整套服务时间成本从“小时级”降到“分钟级”。我在这篇文章里完整拆解一次真实操作在 VMware 的 Ubuntu 22.04.5 里装 Git、Docker、Docker Compose配置国内可用的镜像加速再通过 docker compose 把 ERPNext 14 跑起来。适合两类人一是想快速评估 ERPNext 功能、不想陷进环境依赖的运维和开发者二是要给团队搭一套可复现测试环境的人。全程命令行操作没有图形界面也能跟下来。2. 准备好虚拟机环境Ubuntu 22.04 与 Git 安装没有玄学2.1 VMware 里装 Ubuntu 22.04 时我一般怎么分配资源ERPNext 用 Docker 部署会拉起多个容器包含 Web 服务、后台 Worker、数据库和 Redis 缓存整个栈对内存和磁盘都有明确底线。我在 VMware 里创建虚拟机时系统镜像用 Ubuntu 22.04.5内存给到 6GB低于 4GB 的话容器启动后很容易因为内存不足被 OOM Kill表现为前端页面卡死或者 worker 静默退出。CPU 给 4 核磁盘建议 60GBDocker 镜像和容器卷的占用比想象中快20GB 的默认分区很快就到 80%。网络模式我通常选 NAT。NAT 下虚拟机通过宿主机访问外网和宿主机处于一个隔离网段端口映射由 VMware 自动处理部署完直接在虚拟机浏览器访问 localhost 即可。桥接模式会让虚拟机占用局域网独立 IP如果你想让其他机器直接访问这个 ERP 环境桥接更合适但前提是路由器没做端口隔离否则物理机也访问不到。装完系统后第一件事就是打快照后续所有 Docker 操作出了问题回滚成本基本为零。系统装完先做一轮基础更新这一步不能省。Ubuntu 22.04 的默认 apt 源在部分网络环境下速度不稳定我通常会先换成国内源再执行下面的更新命令sudo apt update sudo apt upgrade -y sudo apt full-upgrade -yapt update拉取软件源索引apt upgrade升级所有已安装软件包full-upgrade额外处理依赖变更比如内核升级后需要清理旧包。这里加-y避免升级过程中交互等待。执行完这三行再看/etc/os-release确认系统版本仍是 22.04 系列避免升级过程中引入不兼容的 Docker 依赖。这个基础环境是整个部署的地基后面所有容器都跑在这套内核和库之上。2.2 安装 Git版本控制工具在部署里的真实用途Git 在这个部署流程里不是可有可无的工具ERPNext 的 Docker 部署文件存放在远程仓库里最可靠的方式就是用 git clone 拉取保证文件完整性和后续可更新性。安装命令很简单sudo apt install git -y git --version第一次执行git --version如果显示git version 2.34.1之类的输出说明安装成功。有些旧教程会建议先sudo apt-add-repository ppa:git-core/ppa再安装但在 Ubuntu 22.04 上系统自带的 Git 版本完全够用不需要额外添加 PPA多此一举反而可能引入源冲突。这里我遇到过一个小坑apt 安装 Git 时如果系统源没更新会报Unable to locate package git返回到 2.1 节的apt update重新执行一遍即可这不是 Git 本身的问题。安装完 Git 后建议顺手执行git config --global user.name和user.email虽然克隆仓库用不到但后面如果要在虚拟机里提交修改或者打 tag缺了这两项配置会直接报错趁现在配好免得后面返工。3. 安装 Docker软件源、GPG 密钥与用户组配置是三个关键点3.1 为什么先装依赖包、加 GPG 密钥再添加 Docker 软件源Docker 不在 Ubuntu 默认源里必须手动添加 Docker 官方软件源。这一步涉及三个动作安装 HTTPS 依赖、导入密钥、添加源地址很多人急着装 docker-ce 却跳过依赖包结果 apt 添加源时直接报错。依赖包的作用是用 HTTPS 协议从软件源拉取软件包信息没有apt-transport-https和ca-certificatesapt 无法验证远程源的身份curl用来下载密钥software-properties-common提供add-apt-repository命令。四件套缺一不可sudo apt install -y apt-transport-https ca-certificates curl software-properties-commonGPG 密钥是软件源的信任凭证Docker 发布软件包时用私钥签名apt 用导入的公钥验证两者匹配才允许安装。导入密钥并验证指纹是关键Docker 官方仓库的公钥指纹是0EBFCD88执行验证命令时如果看到这一串说明密钥写入正确curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-ce.gpg sudo apt-key fingerprint 0EBFCD880EBFCD88这里用阿里云镜像站的 Docker GPG 密钥地址比直接访问官方地址在国内网络环境更稳定。第一条命令里的--dearmor参数把下载的 ASCII 格式密钥转为二进制格式并写入 trusted.gpg.d 目录apt 启动时会自动加载这个目录下的所有密钥。第二条命令的0EBFCD88是公钥后八位指纹如果输出结果里有这一串就表示导入成功没有的话重新执行第一条命令大概率是网络连接中断导致密钥文件不完整。添加软件源时用阿里稳定版源理由和 GPG 密钥一样官方源在部分网络环境下会出现连接超时阿里源是同步 Docker 官方源的稳定镜像sudo add-apt-repository deb [archamd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable$(lsb_release -cs)会自动替换为当前系统的代号Ubuntu 22.04 对应的是jammy所以这条命令展开后实际是添加jammy/stable源。这里有个隐藏细节如果当前系统的lsb_release命令输出异常源地址会拼接错误apt update 时直接报 404。遇到这种情况先执行lsb_release -cs确认输出是jammy再手动替换命令里的变量。3.2 安装 docker-ce 与 docker 用户组免 sudo 不是可选项软件源配好后再次更新索引并安装 Docker 核心组件sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.iodocker-ce是 Docker 社区版主程序docker-ce-cli是命令行工具containerd.io是容器运行时负责真正创建和运行容器。三者版本必须匹配apt 会按照源里的依赖关系自动处理。安装完成后先看一眼服务状态确认 Docker 守护进程是否随系统启动而运行sudo systemctl status docker sudo systemctl start docker sudo systemctl enable dockersystemctl status输出里有active (running)表示运行中enable设置开机自启这一步不做的话虚拟机重启后 Docker 不会自动拉起后续 ERPNext 容器也跟着失联。到此 Docker 本身已经可用但每一次操作都要带 sudo对于后面频繁执行的docker compose命令非常痛苦而且某些脚本里直接调用docker不带 sudo 时会报权限错误。把当前用户加入 docker 用户组解决sudo usermod -aG docker 你的用户名 su - 你的用户名 docker imagesusermod -aG docker把用户追加到 docker 组su - 用户名重新加载用户会话让组权限生效。这一步有用户翻车过执行 usermod 后用docker images仍然提示permission denied原因是当前终端会话仍是旧权限必须重新登录或执行newgrp docker。docker images输出一个空表头就算成功说明 Docker 可以正常与守护进程通信。最后执行docker --version确认客户端版本能输出Docker version 24.x.x之类的信息就进入下一步。3.3 Docker 服务管理重启与状态检查的顺序有讲究Docker 安装完成后改配置或升级内核之后通常需要重启服务。这里我踩过的坑是按错误顺序执行命令导致部分容器启动异常。正确顺序是先重启 Docker再检查状态sudo systemctl restart docker sudo systemctl status docker docker --versionrestart会先停止再启动守护进程status验证是否回到运行态。有时候status显示active (running)但容器就是起不来问题往往出在 docker 组权限未刷新或者磁盘空间不足对照这两个方向排查比反复重启更有效。docker --version是为了确认客户端与守护进程版本一致如果客户端版本和服务端版本差距过大某些 compose 文件的高级语法会不识别。4. Docker Compose 与镜像加速配置部署前必做的两件事4.1 安装 docker-compose为什么用二进制而不是 aptERPNext 的 Docker 部署依赖 Compose 来编排多个容器单独docker run逐个启动不现实容器之间的网络和依赖关系很难手动管理。Ubuntu 的 apt 仓库里有 docker-compose 包但版本老旧对pwd.yml里用到的新语法支持不完整所以这里采用从官方发布页下载二进制的方式sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose docker-compose --version第一条命令的$(uname -s)和$(uname -m)分别自动识别操作系统和 CPU 架构在 Ubuntu 22.04 的 x86_64 虚拟机上会拼出docker-compose-linux-x86_64。下载到/usr/local/bin后必须赋予可执行权限否则命令会提示Permission denied。软链接到/usr/bin是为了确保 Compose 被系统 PATH 收录某些发行版默认 PATH 不包含/usr/local/bin不建软链接会出现命令找不到。最后执行docker-compose --version输出Docker Compose version v2.xx.x就是装好了。这里有一个常见误区安装的是独立 Compose 二进制但后续部署命令用的是docker compose带空格两种写法在本质上都调用了 Compose 功能可如果系统里只有独立二进制而没有 Docker 官方插件docker compose子命令会报docker: compose is not a docker command。我在真实环境里遇到这个问题时最省事的办法是部署命令统一用docker-compose而不是docker compose避免因为 Docker 插件缺失而卡住。下面部署章节里我会按docker compose写法给命令因为那是仓库推荐方式但如果你在 4.1 节只装了独立二进制请自行换成docker-compose。4.2 配置 daemon.json 镜像加速拉镜像超时的常规解法Docker 安装好后直接拉取镜像在部分网络环境下会频繁出现dial tcp: lookup registry-1.docker.io或connection timed out之类错误。这也是老生常谈的问题Docker Hub 在国内网络的连接质量不稳定常规做法是配置 registry-mirrors让 Docker 从更近的镜像站拉取。需要说明的是这只解决“下载慢、连接超时”的问题不涉及任何改变网络访问范围的操作。配置文件是/etc/docker/daemon.json默认不存在需要手动创建并写入镜像地址列表sudo touch /etc/docker/daemon.json sudo chmod 777 -R /etc/docker/daemon.json vim /etc/docker/daemon.jsonchmod 777 是教程里为了省事给的权限我自己实际会改成 644因为 Docker 守护进程以 root 身份读取配置普通用户只需要读权限就够了777 给了所有用户写权限属于安全隐患。如果你对文件权限没那么敏感这条可以直接跳过不影响功能。daemon.json 内容如下{ registry-mirrors: [ https://docker.m.daocloud.io, https://mirror.aliyuncs.com, https://docker.mirrors.ustc.edu.cn, https://docker.nju.edu.cn ] }镜像地址放三到四个就够不是越多越好。Docker 会按顺序尝试第一个失败自动切换下一个可如果列表里掺入已失效的地址每次拉取都会先超时再重试反而拖慢速度。我遇到过写了一大串地址结果第一个地址已经停止服务导致每次拉镜像都卡 2 分钟以上才切换成功。所以保持短列表保留两三个长期可用的公共镜像站即可。配置完需要重启 Docker 让配置生效顺序是先daemon-reload再restartsudo systemctl daemon-reload sudo systemctl restart docker docker infodaemon-reload让 systemd 重新读取 Docker 服务的配置文件restart重新启动守护进程。查看是否生效执行docker info关注输出里的Registry Mirrors字段能看到刚才配置的地址就说明加载成功。验证镜像拉取用一个小镜像测试docker pull nginx:alpinealpine版本体积小拉取速度快适合验证加速是否正常。如果这条命令能在几十秒内完成说明镜像加速配置生效可以进入下一步。5. 正式部署 ERPNext克隆仓库、启动容器与避坑记录5.1 用 git clone 拉取部署文件并启动整套容器前面的准备工作全部完成终于到了部署环节。ERPNext 的 Docker 部署文件已经整理到一个名为erpnext_oob_docker的仓库里先用 Git 克隆并进入工作目录git clone https://gitee.com/yuzelin/erpnext_oob_docker cd erpnext_oob_docker这个仓库里包含pwd.yml以及其他配置目录pwd.yml是 Compose 编排文件定义了 ERPNext 14 所有容器服务。进入目录后ls -la可以看到pwd.yml如果存在就说明克隆成功。接着启动整套容器docker compose --project-name erpnext_oob -f pwd.yml up -d--project-name指定项目名所有容器和网络都会以这个前缀命名比如erpnext_oob-web-1、erpnext_oob-db-1同时它也是 Compose 数据卷的命名空间换项目名等同于换了一套数据。-f显式指定 Compose 文件这里用pwd.yml而不是默认的docker-compose.yml是因为仓库作者没有用默认文件名。up -d表示后台启动不加-d的话日志会刷满整个终端关掉终端容器也跟着停。首次启动时 Docker 需要从镜像仓库拉取所有依赖镜像包括 ERPNext 主镜像、MariaDB、Redis 等总大小接近 2GB。这一步耗时取决于带宽和镜像加速效果正常情况 5~15 分钟。拉取完成后 Compose 会创建容器并启动看到Started或Running字样基本就成功了。启动后第一时间检查容器状态docker compose --project-name erpnext_oob -f pwd.yml ps这个命令列出项目内所有容器的状态、端口映射和启动时长。重点关注 STATUS 列如果都是Up而不是Restarting说明容器都在正常运行。如果某些容器反复重启用下面的命令查日志定位docker compose --project-name erpnext_oob -f pwd.yml logs weblogs web只打印 web 服务容器的日志其他服务同理。ERPNext 启动过程中 web 服务需要等待数据库就绪前几次日志里出现数据库连接拒绝是正常现象等待几十秒后会自动重连成功。如果连续几分钟都是这个错误再检查数据库容器是否异常。部署完成后浏览器访问地址由 Compose 映射决定默认情况下http://localhost就是 ERPNext 的 Web 界面不需要在地址后面加/8080 端口的冒号写法只是表示默认端口直接访问根路径即可。初始化界面会要求设置管理员密码、选择语言和时区填完后就进入 ERPNext 14 的主界面。5.2 五个常见问题避坑现象、原因与解决方案我在拆解这套流程时专门对照了几个容易出问题的环节整理成下面五条每一条都值得在动手前先读一遍。第一条执行docker images或docker compose时提示permission denied while trying to connect to the Docker daemon socket。原因是当前用户不在 docker 组或组权限变更未生效。解决方法是执行sudo usermod -aG docker 你的用户名然后完整注销重新登录或运行newgrp docker刷新会话。注意只执行su -不一定刷新所有终端会话我见过重新登录后才生效的情况。第二条apt update执行时报The following signatures couldnt be verified。原因是 GPG 密钥导入不完整或密钥已经轮换。解决方法是重新执行 3.1 节的两条命令重点是先删除旧的.gpg文件再导入新密钥。不要跳过apt-key fingerprint验证曾经见过有人密钥没导成功就直接往下走后面 apt 一直报签名无效。第三条docker compose命令提示docker: compose is not a docker command。原因是系统安装的是独立二进制 docker-compose而不是 Docker 插件。解决方法是把命令改为docker-compose --project-name erpnext_oob -f pwd.yml up -d或者安装docker-compose-plugin后继续用docker compose。这个坑不算严重但会让你误以为部署文件有问题白折腾半天。第四条镜像拉取长期卡在Waiting或报EOF。原因是 daemon.json 里的镜像地址已失效或配置文件格式有误。解决方法是先执行docker info看 Registry Mirrors 是否正常加载再手动 curl 镜像地址确认可用性换掉失效地址后重启。配置 JSON 时特别小心逗号多一个或少一个都会导致 Docker 拒绝启动表现为systemctl status docker里提示failed to load daemon config。第五条浏览器访问http://localhost打不开。原因是容器启动失败或 80 端口被宿主机的其他进程占用。解决方法是先执行docker compose ps确认容器状态再用sudo lsof -i:80检查端口占用。VMware 虚拟机的端口映射不做的话宿主机访问不到虚机里的服务这个也要排查。6. 部署完成后的验证清单与我的维护习惯整套部署跑通之后先别急着关终端。我习惯用一组命令做最终验收确认每个容器都处于健康状态。执行docker compose --project-name erpnext_oob -f pwd.yml ps输出里 STATUS 列应该全是Up且不显示RestartingPORTS 列能看到端口映射。再执行docker compose --project-name erpnext_oob -f pwd.yml top能看到每个容器内的进程列表如果 web 容器里有nginx和bench相关进程说明 ERPNext 的 Web 服务已经完整加载这一步比单纯看状态更可靠。验证页面访问时我一般先在虚拟机内部用火狐打开http://localhost确认初始化页面能加载再用curl -I http://localhost检查 HTTP 响应头是不是200 OK。如果只有curl返回正常而浏览器打不开多半是浏览器代理设置或虚拟机的网络模式问题与 ERPNext 本身无关。从这个项目往后我每次做 Docker 部署都会强制走一遍三件事先确认 daemon.json 里镜像源有效并执行docker info验证再确认用户组权限在当前终端已生效最后才跑docker compose up -d。这三步每一条都交过学费顺序反了或者跳过都会让后面排障多花几倍时间。ERPNext 的容器数据默认写在 Docker 卷里备份时用docker compose的卷名做 tar 包或者直接给虚拟机打快照比备份容器本身可靠得多。升级时先快照再拉新镜像重新 up出问题回滚也兜得住。希望你这次部署一次通过省下来的时间值得用在研究 ERPNext 的功能模块上。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑