ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Docker部署kkFileView 4.4.0:手把手搭建文档在线预览服务

Docker部署kkFileView 4.4.0:手把手搭建文档在线预览服务 开头先聊几句实在的。kkFileView这个项目只要做过系统开发、特别是和OA办公、文件管理沾边的基本都绕不开它。这玩意儿定位非常纯粹给你的系统加一个“在线预览文件”的能力用户不用下载点开链接直接在浏览器里看Office文档、PDF、图片、视频。我在自己负责的项目里被这个需求折磨过好几次从最早的Flash方案到后来的pdf.js方案折腾一圈最后还是回到了kkFileView。今天这篇就专门说一件事怎么用Docker把kkFileView 4.4.0跑起来目标很明确哪怕你之前完全没碰过Docker照着下面的步骤操作5分钟把服务拉起来是完全可以做到的。文章不会只贴命令我会把每一步背后的原因、参数怎么调、遇到问题怎么排查全部摊开讲清楚。1. 项目全景kkFileView到底能干什么为什么用Docker跑它1.1 一句话理解kkFileView的核心价值kkFileView是一个基于Spring Boot的开源文档在线预览项目它的核心思路是你部署好一个服务然后通过请求链接的方式让它把文件转成浏览器可以直接渲染的格式。业务系统只需要把文件地址传给它它帮你把doc、docx、ppt、pptx、xls、xlsx、pdf、图片、音视频、zip压缩包等几十种格式统一处理成可预览的页面前端用iframe或者新窗口打开就行。说直白点它解决的问题是所有开发团队都会遇到的痛点业务系统里的附件用户想快速看一眼内容但你不能指望每个用户电脑都装了Office或PDF阅读器更不可能要求他们下载附件再打开。kkFileView把“文件内容展示”这件事集中成了一个独立服务其他系统对接它瞬间就拥有一致的预览体验。1.2 服务端文件预览的实现原理kkFileView处理不同格式的文件底层走的路径不一样这也是我建议大家都了解一点的原因。Office系列文件doc、docx、xls、xlsx、ppt、pptx等的预览核心依赖OpenOffice或LibreOffice服务端调用它们的headless模式无界面模式把文件转换成PDF格式再利用pdf.js在前端渲染展示。PDF文件则直接走pdf.js渲染。图片类和音视频类走的是浏览器原生能力直接展示或播放。压缩包文件是另一个亮点逻辑kkFileView会解析zip、rar等压缩包内部的目录结构在页面生成一个文件树用户可以展开看包内有什么甚至预览包里的单个图片或文档。这个能力对后台系统的附件管理非常实用省去了“先下载再解压才能看到内容”的痛苦。1.3 4.4.0版本我关注到的几个变化4.x系列和3.x版本相比变化其实不小。3.x时代还需要手动下载Release包依赖环境变量去配置部署稍微繁琐4.x版本直接用Spring Boot打成可执行Jar配合Docker镜像基本做到开箱即用。我测试4.4.0时最直观的感受是启动时间比3.x短资源占用也平稳了一些。另外4.4.0对水印、缓存策略、Office转换超时等都提供了更细粒度的配置项后面我会展开讲。对于大多数团队来说直接用4.4.0的Docker镜像是最省事的选择官方镜像已经把OpenOffice、基础字体、运行环境都打包好了你不再需要自己装一堆依赖这也是我推荐Docker方式部署的核心原因。2. 部署前准备镜像、环境与关键参数2.1 环境要求与资源评估先说你最少需要什么环境。一台能跑Docker的机器Linux服务器、Windows装了Docker Desktop、macOS装了Docker Desktop都行。如果你的机器是新装的确保Docker服务已经起来了docker version能正常输出客户端和服务端版本信息就行。资源方面我建议给这个容器至少分配2GB内存理论上镜像自带OpenOfficeOffice文件转换时会吃一部分内存转大文件时如果内存不够容易出现进程被杀、转换失败的问题。CPU要求不高1核也能跑但转换文件时等待时间会长一些。磁盘主要是镜像本身和缓存文件的占用镜像解压后大概2GB左右再给缓存目录预留5GB以上比较稳妥。我在实际使用中发现kkFileView转化后的文件会缓存在容器内的/opt/kkfileview/bin/cache目录如果预览过的文件很多又不做清理缓存增长会很快。所以只要是正式环境我建议你把缓存目录挂载到宿主机方便定期清理和备份。2.2 镜像选择与版本确认kkFileView官方镜像仓库名为keking/kkfileview版本号对应项目的Release版本4.4.0对应的镜像Tag就是4.4.0。你可以先执行docker pull keking/kkfileview:4.4.0拉取镜像也可以直接运行容器让它自动拉取。这里多说一句Docker镜像的体积不算小因为里面集成了OpenOffice和常用字体首次拉取时间取决于网络。如果是在内网环境后面我会专门讲离线导入镜像的方法。另外我建议你固定使用明确的版本号比如4.4.0而不是用latest标签因为latest指向的版本不可控万一官方更新了配置项可能导致升级后表现不一致。2.3 部署前必须搞懂的三个关键点第一个是端口。kkFileView默认监听8012端口容器内和宿主机都要放出来。访问地址是http://IP:8012如果端口冲突可以用Docker的端口映射把它改成别的宿主机端口比如-p 8012:8012表示宿主机和容器都用8012也可以写成-p 8088:8012宿主机用8088访问容器内部依然是8012。第二个是配置文件。4.x版本的配置集中在application.properties里Docker镜像里已经内置了一份默认配置一般情况下不用改。但水印、字体路径、Office转换超时这些参数需要按需求调整时可以通过挂载配置文件或者设置环境变量的方式覆盖。第三个是字体问题。默认镜像里带的字体少中文字体尤其缺直接预览中文文档时很可能出现“方块字”或乱码。这个问题有两种解法一是挂载宿主机的字体目录进容器二是把中文字体文件复制到容器内部目录后重建镜像。后面我单独开一节讲。3. 5分钟快速部署实操流程3.1 第一步拉取镜像docker pull keking/kkfileview:4.4.0执行完后可以通过docker images | grep kkfileview确认镜像已经存在。如果你在服务器上执行这条命令时网络比较慢可以多等一会儿镜像内容确实有点大。拉取完成后直接进入下一步。3.2 第二步启动容器拉完镜像最快的启动命令是docker run -it -p 8012:8012 keking/kkfileview:4.4.0执行后看到日志输出中有Started KkFileViewApplication或者类似的启动成功信息就说明服务起来了。这个命令用的是前台模式CtrlC会停掉容器适合第一次测试。正式使用时我推荐加参数用后台模式启动docker run -d \ --name kkfileview \ --restartalways \ -p 8012:8012 \ -e KKFILEVIEW_BIN_PATH/opt/kkfileview/bin \ -v /opt/kkfileview/cache:/opt/kkfileview/bin/cache \ keking/kkfileview:4.4.0逐条解释一下。-d表示后台运行--name给容器起个名字方便管理--restartalways让Docker重启或服务器重启后容器自动拉起-p 8012:8012是端口映射-e设置环境变量指定运行目录-v把缓存目录挂载到宿主机的/opt/kkfileview/cache这样即使容器重建之前预览过的缓存还在用户再访问时不用重新转换。3.3 第三步验证服务与回退策略启动成功后浏览器打开http://服务器IP:8012你会看到一个在线预览的Demo页面页面上有文件上传和预览的测试入口。能打开这个页面说明服务已经正常工作了。你可以随便传一个PDF或Word文件上去点击预览能正常渲染就算彻底跑通。顺便提一个我踩过的坑有时候服务已经起来了但浏览器访问不通八成是云服务器的安全组或防火墙没有放行8012端口。排查时先在服务器本地执行curl http://localhost:8012本地通了再检查防火墙和云安全组规则。如果你运行后想停掉容器执行docker stop kkfileview想删除容器用docker rm kkfileview。如果改了配置或者拉了新镜像需要重新创建容器坚持一个原则用docker run创建容器的参数要固化下来不要每次手敲最好写进Compose文件。3.4 用docker-compose固化部署配置如果你的服务器上装了docker-compose插件建议用Compose方式管理命令简单、配置一目了然。创建一个docker-compose.yml文件内容如下version: 3 services: kkfileview: image: keking/kkfileview:4.4.0 container_name: kkfileview restart: always ports: - 8012:8012 environment: - KKFILEVIEW_BIN_PATH/opt/kkfileview/bin volumes: - /opt/kkfileview/cache:/opt/kkfileview/bin/cache然后在文件所在目录执行docker-compose up -d服务就会在后台启动。以后需要看日志就执行docker-compose logs -f kkfileview需要重启就docker-compose restart kkfileview需要更新镜像就docker-compose pull kkfileview docker-compose up -d。我用Compose管理之后最大的好处是配置不再靠脑子记新环境部署直接把文件和命令一执行就完事强烈推荐。4. 生产环境配置与功能扩展4.1 中文字体问题与字体目录挂载刚才提到的中文字体问题这里展开说。默认镜像内置的字体非常少预览包含中文的PDF或Office文件时中文会变成一个个方框或乱码原因就是系统里没有中文字体可渲染。解决办法有两种。第一种最简单把宿主机上的字体目录挂载进容器比如CentOS上一般有/usr/share/fonts执行docker run -d \ --name kkfileview \ -p 8012:8012 \ -v /usr/share/fonts:/usr/share/fonts \ -v /opt/kkfileview/cache:/opt/kkfileview/bin/cache \ keking/kkfileview:4.4.0如果宿主机没有中文字体需要先安装yum install -y fontconfig之后再把Windows系统里的C:\Windows\Fonts\simsun.ttc或msyh.ttc上传到宿主机字体目录重建容器。第二种是直接把字体文件复制进容器并提交为新的镜像适合离线环境或需要保证容器可移植性的场景。做法是先用基础镜像跑一个容器docker cp把字体文件放进去然后docker commit提交之后所有新容器都用这个新镜像。我个人更推荐第一种因为管理宿主机字体比维护自建镜像简单升级kkFileView版本时也不用重新做镜像。4.2 水印功能配置kkfileview 加水印实战水印是很多企业用kkFileView时必配的功能尤其是内部文档预览防止截图外流。4.4.0支持全局水印配置也支持通过URL参数动态控制指定预览链接的水印。全局配置修改镜像内的/opt/kkfileview/bin/conf/application.properties主要参数有# 水印内容 watermark.text内部资料 # 水印字体大小 watermark.fontsize20 # 水印颜色 watermark.colorred # 水印旋转角度 watermark.tolerance0.2 # 水印透明度 watermark.alpha0.3修改后需要重启容器生效。如果是通过Compose管理可以把配置文件也挂载出来比如把宿主机的/opt/kkfileview/application.properties挂到容器内对应路径这样改配置直接改宿主机文件再重启容器。动态水印是更灵活的做法预览地址通过拼接参数即可例如http://IP:8012/onlinePreview?url文件地址watermarkTxt指定水印内容注意这个参数在不同版本里可能略有差异4.4.0实测有效。业务系统集成时可以根据当前登录用户动态生成水印内容比如把用户姓名和工号拼进去这样截图流出去之后还能追溯到人。这个功能我项目里已经上线用了半年效果很直接。4.3 离线内网环境部署很多企业内部服务器是不允许连外网的Docker Hub更是拉不了镜像。这时候有两种方式拿到镜像。一种是在一台能联网的机器上执行docker pull keking/kkfileview:4.4.0 docker save -o kkfileview-4.4.0.tar keking/kkfileview:4.4.0把kkfileview-4.4.0.tar拷贝到内网服务器上再执行docker load -i kkfileview-4.4.0.tar镜像导入后docker images就能看到后面运行容器的步骤和在线环境完全一致。这个过程要注意tar包的体积4GB左右是正常的用U盘拷贝或内网传输都没有问题。另一种方式是企业内部搭建了Harbor或Nexus私服把镜像推到私服内网机器统一从私服拉取。这个方式对后续版本升级更友好但需要有人维护私服。4.4 与Open File View的选型对比最近不少人拿kkFileView和Open File View做对比我也简单说下自己的使用感受。Open File View是基于Go语言实现的优势是镜像体积小、部署更轻量、资源占用低kkFileView是基于Java的功能更丰富支持的格式和可配置项更多。两者的核心区别在于如果你只需要基础的Office文档转PDF预览服务器配置也紧张Open File View值得考虑但如果你要处理压缩包预览、动态水印、更多格式兼容、深度的配置定制kkFileView明显更合适。另外kkFileView的社区活跃度更高遇到问题能找到的解决方案更多这一点对于生产环境选型很重要。我自己的倾向是业务系统内部用kkFileView因为它文档全、参数丰富边缘场景或临时工具类项目用Open File View。两个项目我都部署过都是成熟方案不存在绝对好坏按需求来。5. 常见问题与排查技巧实录5.1 高频问题速查表我把实际部署和使用过程中高频遇到的问题整理成了表格方便大家直接对照排查。现象可能原因解决思路容器启动失败日志提示OpenOffice连接异常内存不足OpenOffice进程被杀增加服务器内存或容器内存限制确保2GB以上预览中文文档出现乱码/方块系统缺少中文字体挂载宿主机字体目录或安装中文字体后重启第一次预览文件等待很久浏览器端首次下载API、转PDF需要时间属正常现象后续走缓存会明显变快预览时提示“文件不存在”网络环境无法访问文件地址或文件地址需要鉴权使用公网可访问的文件地址或确认鉴权链接含有效时效容器正常启动但8012端口无法访问防火墙/安全组未放行服务器本地curl验证再检查防火墙规则上传大文件时预览崩溃容器内存过小转换进程被OOM Kill调整Docker内存限制或调大Office转换超时时间5.2 三个我印象深刻的排障过程第一个是文件预览偶发失败的问题。第一次排查时以为是kkFileView配置问题后来发现是业务系统传给它的文件地址加了防盗链外部请求被拒绝了。这个问题排查技巧是先在浏览器里直接打开kkFileView的Demo页面测试Demo能预览自己的文件但预览业务系统文件就失败那问题肯定出在文件源头的可访问性上而不在kkFileView本身。第二个是服务器重启后容器没有自动启动。我明明加了--restartalways但重启后依然是停止状态。后来发现是Docker服务本身没有设置开机自启先执行systemctl enable docker再把容器重新docker start一次就好了。第三个是磁盘被缓存文件塞满。kkFileView的预览缓存不清理时间久了数量非常可观。我在生产环境给缓存目录挂载了独立磁盘并写了个简单的crontab任务定期清理7天前的文件0 3 * * * find /opt/kkfileview/cache -type f -mtime 7 -delete清理后服务不会受影响最多就是被清理的文件下次预览时需要重新转换而已。5.3 Docker Desktop在Windows上的虚拟化问题如果你是在Windows机器上部署测试可能会碰见一个很经典的问题Docker Desktop启动时报virtualization support not detected或者failed to start because virtualisation support wasnt detected。这个原因一般是Windows的虚拟化功能没有开启。处理步骤是打开“任务管理器”切到“性能”标签页看左下角“虚拟化”一栏是否显示“已启用”。如果显示“已禁用”需要重启电脑进入BIOS找到Intel VT-x或AMD-V相关选项开启后保存退出。开启后重新启动Docker Desktop问题基本就能解决。另外如果你用的是Windows 10/11家庭版建议先确认WSL2已经安装Docker Desktop现在依赖WSL2作为后端。在PowerShell里执行wsl --install安装默认Linux发行版或者直接安装Docker Desktop时勾选“使用WSL 2替代Hyper-V”的选项。按我个人的经验Windows上跑Docker测试kkFileView没问题但如果做线上环境还是推荐Linux服务器稳定性和资源利用率高出一大截。最后再分享一个我的实际操作习惯kkFileView部署好后先把Demo页面收藏起来每次配置改完就在Demo里传各种格式文件做回归测试PDF、Word、Excel、压缩包各来一个确认转换正常再让业务系统接入。这个习惯帮我省下了不少和业务同事扯皮的时间。毕竟工具再成熟接入生产环境的最后一公里永远要靠自己把好关。
返回列表