资讯动态

用Docker Compose部署Ferry开源工单系统完整指南

发布时间:2026/10/6 9:14:04 来源:尧图企业网站定制
如果你需要一套开源的工单管理系统Ferry是个值得考虑的选择。它用Go语言编写前端基于Vue适合企业内部的需求提报、故障报修、任务流转这三大类场景。不过对小白来说最大的门槛不在功能而在于怎么把它跑起来——按传统方式你得装Go、装Node、装MySQL、装Redis手工配一堆环境而用docker部署这些问题都可以被简化成几条命令。这篇文章的目标很明确让一个从没碰过Docker的新手也能用docker compose把Ferry工单系统完整部署起来。我会从零开始先带你把Docker环境准备好再拆解Ferry由哪几个组件构成最后用一份compose文件把MySQL、Redis和Ferry本体一次拉起。每一步的参数、原理和易错点都会讲到你照着做就能跑通不用理解背后所有细节也能顺利完成部署。1. Ferry是什么为什么要用Docker部署1.1 工单系统到底解决了什么问题工单系统这名字听着正式本质就是一个“问题处理流程管理器”。团队里每天都有各种诉求办公电脑坏了要报修、内部系统出了bug要提给研发、跨部门要申请资源、售后要留客户跟进记录。没有统一平台的时候这些事全靠微信群、邮件加口头交代消息一多就乱今天谁提了什么、处理到哪一步没人说得清最后总要靠“人肉翻聊天记录”来复盘。Ferry就是解决这个问题的。它把“谁提的问题→派给谁→处理到什么程度→结论是什么”这条完整链路搬到线上。管理员在后台配置服务树、定义工单模板用户发起工单后自动进入流转环节处理人可以在系统里更新状态、写处理记录发起人打开页面就能看到实时进展。系统还内置了角色权限体系和管理员视图普通用户、处理人、运营、管理员各看各的界面互不干扰。对中小团队来说它就是一套轻量级的内部IT服务台不用自己从零造轮子部署完就能用。1.2 Docker部署比传统部署强在哪Ferry是典型的前后端分离项目后端用Go语言加Gin框架前端是Vue。传统部署意味着你要在服务器上准备Go编译环境、Node环境手动npm install、npm run build再把前端产物拷到后端静态目录最后配置进程守护。这个流程里任意一步出错比如Node版本不对、依赖装不上、前端构建报错都会卡住半天。更别提还得单独装MySQL和Redis配字符集、配密码、配远程访问权限一环扣一环对新手非常不友好。Docker镜像anyulei/ferry则把后端程序和编译好的前端页面打包在了一起。你不需要在宿主机装Go、装Node运行时只要让容器能连上数据库和Redis就行。实际部署动作简化为“拉镜像、写配置、起容器”三步。配合docker composeMySQL、Redis、Ferry三个容器可以一次全部拉起停止和删除也只需一条命令不会在系统里留下凌乱的运行环境。这就是为什么我建议小白直接从Docker入手而不是去折腾源码编译。2. 部署前的环境准备先把Docker跑起来2.1 Windows和Mac安装Docker Desktop的完整步骤Windows用户先到官网下载Docker Desktop安装包Windows 10 64位或Windows 11直接双击安装。安装过程中会询问是否启用WSL 2建议保留勾选Docker Desktop在这套虚拟化内核上运行最稳定。装完按提示重启系统之后桌面会出现Docker Desktop图标双击启动任务栏里能看到小鲸鱼图标等它变成绿色就说明服务正常。首次启动最常遇到的报错是“Virtualization support not detected”原因基本是BIOS里的虚拟化没开。开机时按Del或F2进BIOS找到Intel Virtualization TechnologyIntel CPU或SVM ModeAMD CPU改成Enabled保存重启。Windows任务管理器里的“性能”选项卡可以查看虚拟化状态显示“已启用”说明这一步完成了。如果BIOS已开启但Docker Desktop还是报错检查WSL 2是否完整安装可以打开PowerShell执行wsl --install装完重启再试。Mac用户相对省事一点。官网会自动识别芯片类型Apple Silicon和Intel芯片要下载对应版本选错装不上或运行异常。dmg格式的安装包拖进Applications目录打开后首次启动会提示需要授权输入系统密码即可。系统版本太老的Mac无法安装新版Docker Desktop如果卡在这需要先升级macOS。2.2 Linux服务器命令行安装Docker服务器上部署通常用Linux最常见的是Ubuntu和CentOS。以Ubuntu 22.04为例安装流程是更新apt索引安装curl、ca-certificates等基础依赖添加Docker官方GPG密钥和仓库最后执行apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin。这里特别提醒docker-compose-plugin这个包一定要装它提供的是新版docker compose子命令不是过去那个独立的python脚本docker-compose后面所有命令我都用新版格式。CentOS 7这类老系统相对麻烦容易碰到yum源配置问题。建议先把系统自带的旧版Docker清干净yum remove docker docker-client docker-common再从官方仓库安装。网上有些第三方源提供的docker rpm包版本很旧而且依赖关系混乱尽量不要用。装完后用systemctl enable docker设置开机自启再systemctl start docker启动服务。2.3 验证Docker环境装完先别急着下一步装完后打开终端执行docker version。看到Client和Server两段都输出了版本号才说明客户端和服务端都正常。Linux下如果执行docker ps报permission denied while trying to connect to the docker api原因是当前用户不在docker用户组里。执行sudo usermod -aG docker $USER然后注销重新登录之后运行docker命令不再需要sudo。这里注意加组后必须重新登录或重启会话否则权限不会生效。Windows下在PowerShell里执行同样的docker version做验证。最后再验证一下composedocker compose version输出类似“Docker Compose version v2.x.x”就说明可用。这一步建议不要跳过等写好了compose文件才发现compose不可用会多一道排查问题。3. 理解Ferry的系统组成工单系统由哪几块拼起来3.1 架构拆解前端、后端、数据层分别干什么Ferry整体分三层前端页面、后端API、数据与缓存。理解这个结构后面排查问题会轻松很多。前端是Vue写好的管理界面构建完成后放在后端程序的静态目录里由Go服务直接托管。所以你在浏览器里只需要访问一个端口它既返回页面又处理API请求省掉了单独部署nginx和配置反向代理的步骤。这也是Docker镜像能把事情变简单的原因之一。后端API负责所有业务逻辑登录鉴权、工单增删改查、流程状态更新、角色权限判断、服务树管理。页面上的每一次点击、搜索、提交本质都是调用后端接口。出了问题多数情况下要看后端日志而不是怀疑前端代码。数据层包含MySQL和Redis。MySQL存业务数据工单明细、用户信息、菜单权限、流程模板全在里面Redis负责缓存和轻量级状态比如登录会话、临时数据。容器化部署时这三个服务各自运行在独立容器里通过Docker内部网络通信。记住这个关系页面打不开先看Ferry容器日志登录超时看Redis连没连上数据异常检查数据库表结构。3.2 配置与端口规划部署前想清楚的几件事Ferry的配置集中在config/settings.yml文件里内容包括服务监听端口、数据库连接信息、Redis连接信息、日志路径等。Docker部署时建议把宿主机的config目录挂载到容器的/app/config这样改配置不需要进容器改完重启即可。端口规划方面我使用的anyulei/ferry:1.0.1镜像容器内Go服务默认监听9527端口。docker-compose里我习惯把容器的9527映射到宿主机8888访问http://服务器IP:8888就能打开系统。你当然也可以映射成别的宿主机端口但需要注意宿主端口别被其他程序占用可在启动后用docker ps确认实际映射关系。MySQL的3306和Redis的6379这两个端口是否映射到宿主机完全看需求。如果要用本地数据库客户端连接排查数据映射出来方便如果不打算从宿主机直接连只在compose内部网络中通信就够了不建议把数据库端口无脑暴露到公网安全风险不值得冒。4. 实操部署从拉镜像到打开登录页4.1 准备目录与拉取镜像先在宿主机建一个工作目录以~/ferry-app为例。里面创建config目录用来放Ferry的配置文件再建data目录data下分mysql和redis两个子目录分别存放数据库和缓存数据。这个data目录很关键Docker容器删除后数据不会丢失全靠它做持久化。目录建好后先把需要的镜像拉下来三步docker pull mysql:5.7docker pull redis:6-alpinedocker pull anyulei/ferry:1.0.1如果拉取速度非常慢多半是默认仓库网络不佳。解决方案是配置镜像加速器。Windows的Docker Desktop在Settings→Docker Engine里加registry-mirrorsLinux在/etc/docker/daemon.json里配置。配置完必须重启docker服务才生效。加速器能缓解一部分网络延迟但不是说换上就一定秒下极端情况下换网络环境再拉更实际。4.2 编写docker-compose.yml一份可以直接抄的配置在ferry-app目录下创建docker-compose.yml下面这份是我实测过的完整配置可以直接复制version: 3 services: mysql: image: mysql:5.7 container_name: ferry-mysql restart: always command: --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: ferry ports: - 3306:3306 volumes: - ./data/mysql:/var/lib/mysql redis: image: redis:6-alpine container_name: ferry-redis restart: always ports: - 6379:6379 volumes: - ./data/redis:/data ferry: image: anyulei/ferry:1.0.1 container_name: ferry restart: always ports: - 8888:9527 volumes: - ./config:/app/config depends_on: - mysql - redis environment: - TZAsia/Shanghai这段配置有几个点必须解释清楚。MySQL的command里显式指定utf8mb4字符集。工单系统里全是中文内容MySQL默认的latin1字符集存中文会出现乱码这个参数绝对不能省。容器初始化时会根据MYSQL_DATABASE自动创建名为ferry的数据库root密码这里写123456第一次部署建议用简单密码跑通后再改。Redis选6-alpine是因为镜像小、启动快功能上完全够用。如果网络环境比较开放可以在command里加--requirepass设置密码同时Ferry的配置也得同步修改否则连不上。Ferry容器映射的是“8888:9527”左边宿主机端口、右边容器端口。容器内监听9527是镜像里程序默认行为宿主机端口可以随意调整比如8888被占用就改成8899但访问地址也要跟着变。TZAsia/Shanghai是时区设置少了它容器用UTC时间工单创建时间会跟本地差8小时。4.3 修改Ferry配置数据库地址千万别写错镜像自带一份默认settings.yml但里面数据库地址多半是127.0.0.1放在Docker compose网络里根本连不到mysql容器。所以要在宿主机的config目录下放一份正确的配置。用文本编辑器创建~/ferry-app/config/settings.yml核心内容如下server: host: 0.0.0.0 port: 9527 static: ./static log: ./logs database: host: mysql port: 3306 username: root password: 123456 dbname: ferry prefix: logmode: 1 redis: host: redis port: 6379 password: db: 0 workflow: enable: truedatabase.host必须写成mysqlredis.host必须写成redis千万别写127.0.0.1或localhost。原因是在docker compose网络里容器之间通过服务名互相访问mysql和redis这两个关键字就是对应容器的网络别名。这是新手最容易踩的坑日志里反复出现database connection refused多半就是host写错了。配置文件的挂载路径也要注意。compose里写的是./config:/app/config所以settings.yml必须放在ferry-app/config目录下文件名一字不差。改了宿主机配置不生效时先检查目录挂载路径对不对再看文件名是否符合预期尤其注意别保存成settings.yml.txt这种隐藏后缀。4.4 启动、访问与初始化账号一切就绪后在ferry-app目录下执行docker compose up -d看到容器创建完成的提示后用docker compose ps查看状态。正常情况下mysql、redis、ferry三个容器都是Up。Ferry启动时会自动连接MySQL创建数据表并写入初始数据这个过程需要几十秒别急着立刻打开页面等一会再访问。打开浏览器访问http://localhost:8888服务器部署则换成服务器IP。看到登录页就说明部署成功了。Ferry初始化后的默认管理员账号通常是admin初始密码123456如果实际环境不一致可以直接去数据库里查user表确认。首次登录后第一件事就是改密码默认密码太容易被猜中。后面如果想重新部署执行docker compose down再docker compose up -d就行。down会停止并删除容器但因为数据存在./data目录挂载的卷里下次启动数据还在。升级镜像版本时先docker compose pull anyulei/ferry:1.0.1再up -d容器会自动重建且保留数据。5. 常见问题与避坑指南5.1 高频踩坑问题速查表我把实际操作中遇到过的高频问题整理成一张表碰到对应现象直接查解决方式现象可能原因解决方式Docker Desktop报虚拟化不支持BIOS未开启VT-x/SVM进BIOS开启虚拟化保存重启docker命令报permission denied用户不在docker组执行usermod -aG docker $USER后重新登录ferry容器反复重启数据库连接失败检查settings.yml中database.host是否为mysql登录报错或响应很慢Redis连接异常检查redis.host配置用redis-cli ping验证工单内容中文乱码MySQL字符集不是utf8mb4起容器时指定utf8mb4已建库则ALTER转码镜像拉取速度慢默认仓库网络不佳配置registry-mirrors加速器后重启docker第一行和虚拟化相关的问题集中在Windows环境。Docker Desktop在Windows上依赖虚拟化功能除了BIOS开关老版本Windows的WSL2支持也可能有坑。追求稳定的话建议先把系统更新到Windows 10 21H2以上WSL2的内核组件用wsl --update补齐。第二行是Linux下的经典问题。追加用户组后必须重新登录会话如果用的ssh连接断开重连即可。还有种情况是系统里docker组不存在这时需要确认docker-ce是否安装完整可以dpkg -l | grep docker检查包状态。第三行的数据库连接失败也很多见。除了host配置错误MySQL容器还没就绪、Ferry就抢先启动也是常见原因。depends_on只保证启动顺序不保证mysql内部服务可用。遇到这种可以先docker logs mysql确认MySQL启动完成日志出现再docker restart ferry手动拉起。第四行Redis问题容易被忽略。登录状态和会话都靠RedisRedis没起来或者地址配错页面会卡在登录接口超时。用docker exec -it ferry-redis redis-cli ping返回PONG才正常不然先去查redis容器状态。第五行乱码问题在首次建库时就能避免。如果已经用错误字符集建了库除了修改库表字符集还要重启ferry容器让它重新读取配置。已经存入的乱码数据需要修正数据源没有捷径。第六行镜像加速器配置在Linux下路径是/etc/docker/daemon.json修改后systemctl restart docker重启服务。Windows的Docker Desktop在设置界面里改改完会自动重启引擎。没有加速器可用的话错峰拉取也比一直干等强。5.2 几个等你踩过坑才会懂的细节先讲时区。compose里不加TZAsia/Shanghai容器内默认UTC时间工单记录、日志时间全部比北京时间慢8小时。尤其是你通过日志排查问题时会发现“下午三点的问题”在日志里是早上七点非常容易误判。所以TZ这个环境变量最好一开始就写进去。再说配置文件的引号问题。如果数据库密码是数字开头或包含冒号、井号等特殊字符YAML解析可能会出错或者被截断。稳妥做法是给password统一加双引号写成password: 123456这样不给解析器任何发挥空间。第一次部署我甚至建议就用123456全默认跑通再看资料改密码减少变量。防火墙这个坑服务器部署必看。宿主机端口开了但系统防火墙或云服务器安全组没放行外网依然访问不到。云服务器尤其常见很多同学买完机器安全组默认只开22端口8888端口一直处于封闭状态页面加载不出来排查很久最后发现是规则没加。放行端口时尽量设置来源IP白名单别给整个公网开放。备份习惯也可以建立起来。docker compose down之后、重新部署或升级前顺手打包data目录tar czf ferry-backup.tar.gz data。数据库所有业务数据都在里面这个操作十秒钟但意外删除容器、误操作清库时能省下大麻烦。最后一个技巧是日志查看。docker logs ferry --tail 200只看最近200行比全量刷屏清爽很多。配合docker inspect ferry查看容器挂载、环境变量和端口映射大部分配置类问题一眼就能定位。按这套流程走完你会发现Docker部署Ferry的核心难点其实不在命令本身而在理解容器间的网络关系和配置对应关系。我第一次部署时就卡在database.host半天下不来后来才想明白compose网络里不能用127.0.0.1替代服务名。后面凡是部署多容器应用我都沿用这个思路先画清楚谁连谁再动配置基本不会跑偏。最后分享一个实际心得不要一上来就在生产服务器练手。本地电脑装好Docker Desktop按上面的步骤完整跑一遍把每个报错都亲历一次再上服务器会顺手得多。对小白来说把环境弄坏并不可怕docker compose down一键重置这份试错底气才是Docker带来的最大好处。

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

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

免费获取报价 →
↑