2026/8/5 7:12:29

Docker部署dzzoffice与onlyoffice私有化办公套件全攻略

Docker部署dzzoffice与onlyoffice私有化办公套件全攻略 1. 项目概述为什么选择Docker部署dzzofficeonlyoffice最近在折腾私有化办公套件想把文档协作和文件管理都搬到自己的服务器上。市面上开源的方案不少但能像dzzoffice和onlyoffice这样一个负责文件管理、一个负责在线编辑还能无缝集成的组合确实不多见。dzzoffice是一个功能相当全面的开源企业网盘界面清爽权限管理也做得不错可以把它理解成一个私有化的“百度网盘”或“坚果云”。而onlyoffice则是开源的在线Office套件能直接在浏览器里编辑Word、Excel、PPT体验上非常接近微软Office 365或Google Docs。把它们俩用Docker部署起来最大的好处就是“隔离”和“便捷”。以前在物理机或虚拟机上直接装光是环境依赖比如PHP版本、数据库、各种扩展就能把人折腾得够呛一个配置不对两个服务可能都跑不起来。用Docker相当于给每个服务都准备了一个自带所有运行环境的“集装箱”。dzzoffice的PHP环境、onlyoffice的文档服务环境各自独立互不干扰。部署时你只需要几条docker run命令或者一个docker-compose.yml文件环境问题基本不用操心。后期维护、升级、迁移也方便删掉旧容器拉个新镜像就能完成升级数据通过挂载的卷Volume持久化保存安全又省心。这个方案特别适合中小团队、工作室或者个人开发者。你可能有数据隐私的顾虑不想把内部文档放到公有云上或者需要在内网环境下搭建一套协作平台又或者只是想拥有一个完全由自己掌控的、可定制化的办公环境。无论是哪种需求这套组合拳都能很好地满足。接下来我会带你从零开始一步步拆解部署的每一个环节并分享我在实际搭建中踩过的坑和总结的技巧。2. 核心思路与架构设计部署dzzofficeonlyoffice核心思路是让两个独立的Docker容器能够互相通信和集成。dzzoffice作为前端门户和文件管理器用户在这里上传、下载、分享文件。当用户需要编辑一个Office文档时dzzoffice会调用onlyoffice提供的接口将文档“送”到onlyoffice的编辑器里打开。编辑完成后onlyoffice再将修改后的文档“回传”给dzzoffice保存。2.1 网络架构与通信原理这里的关键在于“网络互通”。默认情况下每个Docker容器都有自己的独立网络命名空间。为了让dzzoffice容器能访问到onlyoffice容器的服务我们有几种常见的网络模式选择Bridge网络默认Docker会创建一个名为bridge的虚拟网络容器加入后会分配一个内网IP如172.17.0.x。容器之间可以通过这个IP互相访问。这是最常用的方式但IP是动态分配的不够直观。自定义Bridge网络我们可以手动创建一个自定义的bridge网络例如office-net然后把dzzoffice和onlyoffice两个容器都加入这个网络。这样容器之间不仅可以通过IP访问还可以直接使用容器名称作为主机名进行访问这大大简化了配置。这是我们推荐的方式。Host网络容器直接使用宿主机的网络栈没有隔离。这样容器内的服务就像直接跑在宿主机上一样可以直接用localhost或宿主机IP访问。虽然配置简单但安全性较差端口冲突的可能性也大一般不建议在生产环境使用。为了稳定和便于维护我们选择方案二创建自定义Bridge网络。这样在dzzoffice的配置里我们只需要填写http://onlyoffice容器名:端口就能连接到onlyoffice服务完全不用关心IP地址的变化。2.2 数据持久化策略Docker容器本身是无状态的一旦删除容器内产生的所有数据都会丢失。因此我们必须将需要持久化的数据“映射”到宿主机上。主要需要持久化的数据有两类应用配置与运行数据比如dzzoffice的PHP代码、上传的文件、数据库onlyoffice的配置文件、日志、缓存等。数据库数据dzzoffice需要一个数据库通常是MySQL/MariaDB来存储用户信息、文件元数据、权限配置等。我们可以选择单独启动一个MySQL容器或者使用宿主机上已有的MySQL服务。同样数据库的数据文件也必须持久化。我们的策略是为每一个需要保存数据的服务在宿主机上创建一个目录例如/opt/docker-data/然后通过Docker的-v参数或volumes配置将容器内的特定路径挂载到宿主机的这些目录上。这样无论容器如何重启、重建数据都安全地保留在宿主机硬盘里。2.3 工具选型Docker Compose vs 纯Docker命令对于这种多服务的应用强烈推荐使用Docker Compose。它允许你用一个docker-compose.yml文件来定义和运行多个容器。这个文件就像一份“编排剧本”清晰地描述了每个服务容器的镜像、端口、环境变量、数据卷、网络等所有配置。部署时只需要一条docker-compose up -d命令所有服务就会按定义好的顺序和关系启动管理起来极其方便。当然你也可以用多条docker run命令手动启动每个容器并手动连接网络。但这不仅命令冗长而且容易出错特别是在需要调整参数或重建容器时。因此本文将以Docker Compose方案为主线进行讲解并在最后给出对应的纯Docker命令作为参考。3. 环境准备与前置检查在开始拉取镜像和编写配置之前我们需要确保宿主机环境已经就绪。这里假设你使用的是一台Linux服务器如Ubuntu 20.04/22.04 LTS或CentOS 7/8。3.1 Docker与Docker Compose安装首先确保你的系统已经安装了Docker Engine和Docker Compose插件新版本Docker Desktop for Linux已包含服务器版通常需要单独安装Compose插件。对于Ubuntu/Debian系统# 更新软件包索引 sudo apt-get update # 安装依赖包允许apt通过HTTPS使用仓库 sudo apt-get install -y ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装Docker Engine、CLI、Containerd和Docker Compose插件 sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 验证安装查看版本 docker --version docker compose version # 注意是 docker compose不是 docker-compose对于CentOS/RHEL系统# 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 安装yum-utils包提供yum-config-manager工具 sudo yum install -y yum-utils # 设置稳定的仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装Docker Engine、CLI、Containerd和Docker Compose插件 sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 启动Docker并设置开机自启 sudo systemctl start docker sudo systemctl enable docker # 验证安装 docker --version docker compose version注意如果你在Windows或macOS上使用Docker Desktop并且遇到了类似“Docker Desktop failed to start because virtualisation support wasnt detected”的错误这通常意味着你的电脑没有开启硬件虚拟化支持如Intel VT-x或AMD-V。你需要进入电脑的BIOS/UEFI设置中找到虚拟化技术Virtualization Technology相关选项并启用它。对于Windows的WSL2后端还需要确保“Windows子系统 for Linux”和“虚拟机平台”功能已启用。3.2 宿主机目录规划在宿主机上创建一个清晰的目录结构便于后期管理和维护。我习惯在/opt目录下进行组织sudo mkdir -p /opt/docker-office/{dzzoffice,onlyoffice,mysql} sudo mkdir -p /opt/docker-office/dzzoffice/{www,data,config} sudo mkdir -p /opt/docker-office/onlyoffice/{logs,data,lib,db,cache} sudo mkdir -p /opt/docker-office/mysql/data # 修改目录权限确保Docker容器有写入权限根据实际运行容器的用户ID调整通常用当前用户 sudo chown -R $USER:$USER /opt/docker-office # 或者更宽松的权限生产环境慎用 # sudo chmod -R 777 /opt/docker-office/opt/docker-office/dzzoffice/www: 用于挂载dzzoffice的Web程序文件。/opt/docker-office/dzzoffice/data: 用于挂载dzzoffice上传的文件。/opt/docker-office/dzzoffice/config: 用于存放dzzoffice的自定义配置文件。/opt/docker-office/onlyoffice/下的各个目录对应onlyoffice文档服务的日志、数据、库文件等。/opt/docker-office/mysql/data: 用于挂载MySQL数据库的数据文件。3.3 防火墙与端口规划确保宿主机的防火墙如ufw或firewalld开放了必要的端口。我们需要对外提供服务的端口主要有80/443端口用于dzzoffice的Web访问。如果你有域名并配置了SSL证书会用到443HTTPS。本文为简化先使用80端口HTTP。9000端口这是onlyoffice文档服务的默认端口用于接收来自dzzoffice的文档编辑请求。以Ubuntu的ufw为例sudo ufw allow 80/tcp sudo ufw allow 9000/tcp sudo ufw reload以CentOS的firewalld为例sudo firewall-cmd --permanent --add-port80/tcp sudo firewall-cmd --permanent --add-port9000/tcp sudo firewall-cmd --reload4. 编写Docker Compose编排文件这是整个部署的核心。我们在/opt/docker-office目录下创建一个名为docker-compose.yml的文件。version: 3.8 services: # 1. MySQL数据库服务 mysql: image: mysql:8.0 container_name: office-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: YourStrongRootPassword123! # 请务必修改为强密码 MYSQL_DATABASE: dzzoffice MYSQL_USER: dzzoffice_user MYSQL_PASSWORD: YourDzzofficeUserPassword456! # 请务必修改 volumes: - ./mysql/data:/var/lib/mysql # 持久化数据库数据 - ./mysql/conf.d:/etc/mysql/conf.d:ro # 可挂载自定义配置 networks: - office-network # 可选性能优化参数 command: --default-authentication-pluginmysql_native_password --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci # 2. dzzoffice应用服务 dzzoffice: image: wwb2023/dzzoffice:latest # 一个维护较新的社区镜像 container_name: office-dzzoffice restart: unless-stopped depends_on: - mysql # 等待mysql服务启动 ports: - 80:80 # 将容器80端口映射到宿主机80端口 environment: - TZAsia/Shanghai # 设置时区 # 数据库连接信息对应上面mysql服务中设置的环境变量 - DB_HOSTmysql # 使用服务名Docker Compose会自动解析为容器IP - DB_PORT3306 - DB_NAMEdzzoffice - DB_USERdzzoffice_user - DB_PASSWORDYourDzzofficeUserPassword456! volumes: - ./dzzoffice/www:/var/www/html # 挂载Web程序 - ./dzzoffice/data:/var/www/html/data # 挂载上传文件目录 - ./dzzoffice/config:/var/www/html/config # 挂载配置目录 networks: - office-network # 3. onlyoffice文档服务 onlyoffice: image: onlyoffice/documentserver:latest container_name: office-onlyoffice restart: unless-stopped ports: - 9000:80 # onlyoffice默认服务端口是80我们映射到宿主机的9000 environment: - TZAsia/Shanghai # JWT密钥用于dzzoffice和onlyoffice之间的安全通信必须设置且两边一致 - JWT_SECRETYourSuperSecretJWTKeyHereChangeMe! - JWT_ENABLEDtrue volumes: - ./onlyoffice/logs:/var/log/onlyoffice - ./onlyoffice/data:/var/www/onlyoffice/Data - ./onlyoffice/lib:/var/lib/onlyoffice - ./onlyoffice/db:/var/lib/postgresql # onlyoffice内部使用PostgreSQL - ./onlyoffice/cache:/var/cache/onlyoffice networks: - office-network # 定义自定义网络方便服务间通过容器名通信 networks: office-network: driver: bridge关键配置解析网络 (networks)我们定义了一个名为office-network的自定义bridge网络。三个服务都加入了此网络。这样在dzzoffice容器的环境变量DB_HOSTmysql中mysql就能被解析为mysql容器的IP地址。同样后续在dzzoffice后台配置onlyoffice地址时就可以填写http://onlyoffice:9000注意容器内访问用服务名onlyoffice和容器内部端口这里onlyoffice容器内部是80端口但dzzoffice配置时我们通常用映射后的服务名实际连接取决于配置方式详见下文。依赖 (depends_on)dzzoffice服务设置了depends_on: - mysql这确保在启动dzzoffice容器之前mysql容器会先启动。但请注意这只保证容器启动顺序不保证MySQL服务完全就绪。更完善的方案可以使用健康检查(healthcheck)或脚本等待。JWT密钥 (JWT_SECRET)这是onlyoffice的安全特性。dzzoffice在请求onlyoffice编辑文档时需要携带一个用此密钥签名的令牌JWTonlyoffice会验证此令牌。必须设置一个强密码且后续在dzzoffice后台配置时需要填入相同的密钥。镜像选择wwb2023/dzzoffice是一个在Docker Hub上相对活跃的dzzoffice镜像。对于onlyoffice我们使用其官方镜像onlyoffice/documentserver。始终建议使用特定版本标签如onlyoffice/documentserver:7.5而非latest以保证环境一致性。这里为了示例简洁使用了latest。5. 启动服务与初始化配置5.1 启动所有服务在docker-compose.yml文件所在目录/opt/docker-office执行以下命令# 拉取镜像并启动所有服务-d 表示后台运行 docker compose up -d执行后Docker会依次拉取镜像、创建网络、启动容器。你可以用以下命令查看状态# 查看所有容器状态 docker compose ps # 或 docker ps # 查看实时日志CtrlC退出 docker compose logs -f # 查看特定服务日志如onlyoffice docker compose logs -f onlyoffice等待几分钟直到所有容器状态显示为Up (healthy)或稳定的Up。特别关注mysql容器确保其完全启动日志中出现ready for connections。5.2 初始化dzzoffice访问dzzoffice在浏览器中输入你的服务器IP地址如http://你的服务器IP。如果一切正常你应该会看到dzzoffice的安装引导界面。同意协议并环境检测点击“同意协议开始安装”。安装程序会自动检查环境包括目录权限、PHP扩展等。因为我们使用了Docker镜像这些环境通常都是准备好的应该全部通过绿色勾选。数据库配置这是关键一步。数据库服务器填写mysql因为我们在同一个Docker网络中可以用服务名访问。数据库端口3306。数据库名dzzoffice与docker-compose.yml中MYSQL_DATABASE一致。数据库用户名dzzoffice_user与MYSQL_USER一致。数据库密码填写你在docker-compose.yml中设置的YourDzzofficeUserPassword456!。表前缀保持默认dzz_即可。点击“测试数据库连接”成功后会提示“连接成功”。初始化数据库连接成功后点击“创建数据库”安装程序会自动创建所需的数据表。设置管理员账号接下来设置超级管理员创始人的账号、密码和邮箱请务必牢记。安装完成点击“完成安装”系统会提示你删除install目录。在我们的Docker部署中install目录在容器内你可以通过进入容器删除但更简单的办法是直接重启dzzoffice容器。因为安装程序会在完成后自动锁定或重命名安装文件重启容器即可进入登录页。docker compose restart dzzoffice登录后台使用你设置的管理员账号登录dzzoffice。5.3 配置onlyoffice集成登录dzzoffice后台后我们需要将onlyoffice服务集成进来。进入应用市场在后台管理界面找到“应用”或“应用市场”。安装OnlyOffice插件搜索“OnlyOffice”应该能找到对应的在线编辑插件通常叫onlyoffice或在线编辑器。点击安装并启用。注意有些dzzoffice镜像可能已预装此插件请检查“已安装应用”。配置插件找到已安装的OnlyOffice插件进入其设置页面。关键配置项如下文档服务器地址这是最容易出错的地方。因为dzzoffice容器和onlyoffice容器在同一个Docker网络(office-network)内它们可以直接通过容器名通信。因此这里应该填写http://onlyoffice。onlyoffice是我们在docker-compose.yml中定义的onlyoffice服务名称Docker的网络DNS会将其解析为正确的容器IP。文档服务器内部地址如果与上面地址相同留空即可。某些复杂网络环境下可能需要单独配置。JWT密钥填写我们在docker-compose.yml中为onlyoffice容器设置的JWT_SECRET环境变量的值即YourSuperSecretJWTKeyHereChangeMe!。必须完全一致包括大小写。保存配置。验证连接配置保存后插件设置页面通常有一个“测试连接”或“验证”按钮。点击它如果显示“连接成功”或类似提示说明集成配置正确。重要提示很多教程会告诉你填写http://宿主机IP:9000。这在某些简单部署中可能可行但并不是Docker网络下的最佳实践。使用http://onlyoffice容器名是更标准、更可靠的方式它不依赖于宿主机的网络配置和防火墙规则只要两个容器在同一个自定义网络下就能通。如果你填写宿主机IP需要确保容器能通过宿主机网络桥接访问到宿主机自身的端口这有时会因Docker的iptables规则或宿主机防火墙而失败。6. 功能测试与使用配置完成后让我们测试整个工作流是否顺畅。上传文档在dzzoffice前台上传一个.docx或.xlsx文件到某个目录。在线编辑找到刚上传的文件点击文件名或右侧的“更多”按钮你应该能看到“在线编辑”或类似的选项这取决于dzzoffice主题和插件设置。点击它。编辑器加载浏览器会新开一个标签页加载onlyoffice的编辑器界面你的文档内容会显示在其中。这个过程就是dzzoffice将文件地址和编辑权限信息通过JWT签名后请求http://onlyoffice提供的编辑接口实现的。编辑与保存尝试在编辑器里做一些修改然后点击左上角的“保存”按钮。编辑器会将修改后的文档内容回传给dzzoffice保存。查看结果关闭编辑器标签页回到dzzoffice的文件列表页面刷新一下。你应该能看到文件的“修改时间”更新了。再次点击“在线编辑”看到的应该是你修改后的内容。如果以上步骤都成功恭喜你一个私有的、集成了在线Office的网盘系统就部署完成了7. 常见问题与深度排查指南在实际部署中你可能会遇到各种问题。下面是我总结的一些常见坑点和解决方法。7.1 onlyoffice连接测试失败症状在dzzoffice的OnlyOffice插件设置页面点击“测试连接”返回失败。排查步骤检查容器状态与日志docker compose ps # 确保mysql, dzzoffice, onlyoffice三个容器都是Up状态 docker compose logs onlyoffice # 查看onlyoffice容器日志有无ERROR docker compose logs dzzoffice # 查看dzzoffice容器日志重点关注onlyoffice日志中是否有JWT相关的错误或者启动失败的信息。检查网络连通性进入dzzoffice容器内部尝试ping通onlyoffice容器。docker compose exec dzzoffice bash # 进入容器后 ping onlyoffice # 如果ping不通说明网络配置有问题检查docker-compose.yml中网络定义和服务是否都加入了office-network。 # 也可以尝试用curl测试接口 curl -v http://onlyoffice/web-apps/apps/api/documents/api.js # 如果返回一堆JavaScript代码说明onlyoffice服务本身是正常的。如果curl能通但测试连接不通问题很可能出在JWT或配置地址上。确认JWT密钥这是最高频的错误点。确保docker-compose.yml中onlyoffice服务的JWT_SECRET环境变量值与dzzoffice后台插件设置里填写的完全一致一个字符都不能差。确保JWT_ENABLED设置为true默认就是true。修改JWT密钥后必须重启容器如果你修改了docker-compose.yml中的JWT_SECRET必须重启onlyoffice容器使之生效docker compose restart onlyoffice。同时dzzoffice后台的配置也要同步修改。确认文档服务器地址在dzzoffice容器内使用curl http://onlyoffice看是否能访问。如果失败尝试使用容器IP通过docker network inspect office-network查看onlyoffice容器的IP地址。绝对不要在dzzoffice容器内使用localhost或127.0.0.1来指代onlyoffice因为每个容器都有自己的localhost。7.2 在线编辑后文件未保存或保存失败症状在onlyoffice里编辑并点击保存后回到dzzoffice发现文件没有变化或者提示保存失败。排查步骤检查文件权限这是最常见的原因。dzzoffice容器通常是www-data用户需要对挂载的data目录有写入权限。# 在宿主机上检查挂载目录的权限 ls -la /opt/docker-office/dzzoffice/data/ # 确保dzzoffice容器用户通常是UID 33或82对应www-data有写权限 # 一个简单的办法是递归修改目录所有者为当前用户假设当前用户有docker权限 sudo chown -R 33:33 /opt/docker-office/dzzoffice/data # 将所有者改为UID 33 (www-data) # 或者修改目录权限为777生产环境不推荐 sudo chmod -R 777 /opt/docker-office/dzzoffice/data实操心得在Docker中权限问题非常棘手。最佳实践是在宿主机上创建一个专用用户和用户组如docker-user并将其UID和GID在docker-compose.yml中通过user:指令映射给容器使用同时宿主机目录的所有者也设为该用户。这样可以实现精确的权限控制。检查dzzoffice的config配置确保dzzoffice的配置文件/opt/docker-office/dzzoffice/config/config.php中关于文件存储路径的配置是正确的并且指向了挂载的data目录。查看onlyoffice日志保存失败时onlyoffice的日志/opt/docker-office/onlyoffice/logs目录下通常会记录错误信息例如“Callback error”等可以从中找到线索。7.3 性能优化与配置调优默认配置适合体验和小规模使用。如果团队人数较多或文档较大可能需要调优。OnlyOffice性能增加资源限制在docker-compose.yml中为onlyoffice服务添加资源限制。onlyoffice: # ... 其他配置 ... deploy: # 注意这需要Compose file version 3.8 和Docker Swarm模式单机可用以下方式 resources: limits: cpus: 2.0 memory: 4G # 或者使用旧式资源限制单机Docker Compose # mem_limit: 4g # cpus: 2调整JWT超时如果编辑复杂文档时间较长可能会因JWT令牌过期导致保存失败。可以在onlyoffice环境变量中增加JWT_HEADER默认为Authorization和调整dzzoffice插件中的超时设置如果有。MySQL性能对于dzzoffice数据库性能影响很大。可以考虑将MySQL的配置文件挂载到容器内进行优化。在宿主机创建/opt/docker-office/mysql/conf.d/my.cnf。在docker-compose.yml的mysql服务volumes中增加挂载- ./mysql/conf.d:/etc/mysql/conf.d:ro。在my.cnf中根据服务器内存调整innodb_buffer_pool_size等参数。启用HTTPS生产环境必须启用HTTPS。方案一推荐在dzzoffice和onlyoffice前面部署一个反向代理如Nginx在Nginx上配置SSL证书终止TLS连接然后代理到后端的dzzoffice80和onlyoffice9000服务。这样容器本身无需处理SSL。方案二为dzzoffice和onlyoffice容器单独配置SSL。这通常更复杂需要将证书文件挂载到容器内并修改其Web服务器配置。7.4 备份与迁移备份你的核心数据在三个地方数据库位于/opt/docker-office/mysql/data。你可以使用mysqldump命令定期备份。docker compose exec mysql mysqldump -u root -pYourStrongRootPassword123! dzzoffice /path/to/backup/dzzoffice_backup_$(date %Y%m%d).sql上传的文件位于/opt/docker-office/dzzoffice/data。直接打包这个目录即可。OnlyOffice数据位于/opt/docker-office/onlyoffice/data等目录主要是缓存和日志可按需备份。迁移在新服务器上按照同样的目录结构准备好上述数据然后修改docker-compose.yml中的一些路径如果需要再运行docker compose up -d即可。注意MySQL版本最好保持一致避免兼容性问题。8. 进阶使用纯Docker命令部署虽然Docker Compose是首选但了解其背后的Docker命令有助于深入理解。以下是等效的docker run命令示例# 1. 创建自定义网络 docker network create office-network # 2. 启动MySQL容器 docker run -d \ --name office-mysql \ --network office-network \ --restart unless-stopped \ -e MYSQL_ROOT_PASSWORDYourStrongRootPassword123! \ -e MYSQL_DATABASEdzzoffice \ -e MYSQL_USERdzzoffice_user \ -e MYSQL_PASSWORDYourDzzofficeUserPassword456! \ -v /opt/docker-office/mysql/data:/var/lib/mysql \ mysql:8.0 \ --default-authentication-pluginmysql_native_password \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci # 3. 启动OnlyOffice容器 docker run -d \ --name office-onlyoffice \ --network office-network \ --restart unless-stopped \ -p 9000:80 \ -e JWT_SECRETYourSuperSecretJWTKeyHereChangeMe! \ -e JWT_ENABLEDtrue \ -v /opt/docker-office/onlyoffice/logs:/var/log/onlyoffice \ -v /opt/docker-office/onlyoffice/data:/var/www/onlyoffice/Data \ onlyoffice/documentserver:latest # 4. 启动dzzoffice容器 (等待MySQL完全启动后再执行可先sleep 30秒) sleep 30 docker run -d \ --name office-dzzoffice \ --network office-network \ --restart unless-stopped \ -p 80:80 \ -e DB_HOSToffice-mysql \ -e DB_PORT3306 \ -e DB_NAMEdzzoffice \ -e DB_USERdzzoffice_user \ -e DB_PASSWORDYourDzzofficeUserPassword456! \ -v /opt/docker-office/dzzoffice/www:/var/www/html \ -v /opt/docker-office/dzzoffice/data:/var/www/html/data \ wwb2023/dzzoffice:latest可以看到使用docker run命令非常冗长且服务间的依赖关系如等待MySQL启动需要手动处理。因此对于多服务应用docker-compose.yml的简洁和高效是无可替代的。整个部署过程的核心在于理解Docker的网络模型和数据持久化机制并正确配置服务间的连接参数尤其是地址和JWT密钥。一旦打通了这个链路剩下的就是常规的Web应用安装和配置了。这套组合为中小型团队提供了一个强大、可控且成本极低的私有化协作办公解决方案值得花时间研究和部署。如果在操作中遇到其他问题多查看容器日志大部分错误信息都会给出明确的指引。