别再手动折腾了!用Docker Compose一键部署DzzOffice+OnlyOffice协同办公环境
告别繁琐配置:Docker Compose全栈部署DzzOffice+OnlyOffice实战指南
每次看到同事为了搭建内部协作平台反复输入十几条Docker命令时,我总忍不住想——2023年了,为什么还有人用石器时代的方式部署现代应用?本文将分享如何用Docker Compose实现企业级协同办公环境的一键部署,这个方案已在三个客户生产环境稳定运行超过200天。
1. 为什么需要编排部署
传统手动部署方式存在三大致命伤:配置分散(数据库连接字符串、服务端口等参数散落在不同命令中)、依赖混乱(必须人工确保服务启动顺序)、维护困难(每次更新都需要重新执行复杂命令)。而Docker Compose通过声明式YAML文件解决了所有这些问题。
典型痛点场景:
- 新同事接手项目时,需要半天时间理解二十多条Docker命令的作用
- 服务器重启后,因服务启动顺序错误导致OnlyOffice无法连接数据库
- 生产环境密码硬编码在命令行历史记录中
version: '3.8' services: db: image: mysql:5.7.27 environment: MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} volumes: - mysql_data:/var/lib/mysql提示:上述代码片段展示了基础服务定义,环境变量通过外部文件注入避免敏感信息泄露
2. 完整编排方案设计
2.1 架构拓扑规划
我们的目标架构需要实现:
- MySQL容器作为数据持久层
- DzzOffice容器提供协作平台界面
- OnlyOffice容器处理文档实时协作
- 独立的Redis容器提升会话性能
服务依赖关系表:
| 服务 | 依赖服务 | 暴露端口 | 数据卷 |
|---|---|---|---|
| mysql | 无 | 3306 | /var/lib/mysql |
| redis | 无 | 6379 | /data |
| dzzoffice | mysql,redis | 8080 | /var/www/html |
| onlyoffice | 无 | 9000 | /var/log/onlyoffice |
2.2 关键配置详解
网络配置是整套系统的神经中枢。我们采用自定义桥接网络实现:
networks: office-net: driver: bridge ipam: config: - subnet: 172.28.0.0/16数据持久化方案需要特别注意:
- MySQL使用命名卷避免权限问题
- DzzOffice上传目录绑定宿主机特定路径
- OnlyOffice日志采用临时卷自动清理
# 创建必要的宿主机目录 mkdir -p /opt/office/{mysql,redis,dzzoffice}3. 生产级docker-compose.yml解析
完整配置文件包含以下核心部分:
version: '3.8' services: db: image: mysql:5.7.27 container_name: mysql restart: unless-stopped env_file: .env environment: MYSQL_DATABASE: ${DB_NAME} MYSQL_USER: ${DB_USER} MYSQL_PASSWORD: ${DB_PASSWORD} volumes: - mysql_data:/var/lib/mysql networks: - office-net dzzoffice: image: imdevops/dzzoffice:latest depends_on: - db ports: - "8080:80" volumes: - /opt/office/dzzoffice:/var/www/html/data networks: - office-net healthcheck: test: ["CMD", "curl", "-f", "http://localhost"] interval: 30s timeout: 10s retries: 3 volumes: mysql_data: networks: office-net:注意:healthcheck配置可确保服务完全就绪后才进行后续操作
4. 高级调优与故障处理
4.1 性能优化参数
在资源受限环境中,需要限制容器资源使用:
resources: limits: cpus: '2' memory: 2G reservations: cpus: '0.5' memory: 512M关键参数对照表:
| 参数 | 推荐值 | 作用域 |
|---|---|---|
| php-fpm.pm | dynamic | DzzOffice |
| mysql.innodb_buffer_pool_size | 1G | MySQL |
| onlyoffice.WorkerCount | CPU核心数×2 | OnlyOffice |
4.2 常见问题排查
文档无法预览:
- 检查OnlyOffice容器日志:
docker logs docserver - 验证网络连通性:
docker exec dzzoffice ping docserver - 确认API地址配置为内部域名:
http://docserver/web-apps/apps/api/documents/api.js
数据库连接失败:
# 测试数据库可连接性 docker run --rm -it --network office-net mysql:5.7.27 \ mysql -h db -u${DB_USER} -p${DB_PASSWORD} ${DB_NAME}5. 安全加固方案
5.1 敏感信息管理
永远不要在YAML文件中硬编码密码!采用.env文件管理:
# .env文件示例 DB_NAME=office DB_USER=admin DB_PASSWORD=S3cr3tP@ssw0rd!然后在docker-compose.yml中引用:
env_file: .env5.2 最小权限原则
为每个服务创建专用用户:
-- 在MySQL容器中执行 CREATE USER 'dzzoffice'@'%' IDENTIFIED BY 'UserP@ss123'; GRANT SELECT,INSERT,UPDATE ON office.* TO 'dzzoffice'@'%';6. 持续维护策略
6.1 自动化备份
创建备份脚本backup.sh:
#!/bin/bash docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > backup.sql tar czvf /backups/office-$(date +%Y%m%d).tar.gz backup.sql /opt/office/dzzoffice6.2 版本升级流程
- 停止旧服务:
docker-compose down - 备份数据和配置
- 更新镜像版本号
- 启动新服务:
docker-compose up -d - 执行数据迁移(如有需要)
这套方案最让我满意的是其可复现性——上周客户服务器意外宕机后,我们仅用3分钟就完成了整套系统的重建。现在每次部署新环境,我都会泡杯咖啡,然后看着docker-compose up自动完成所有工作。
