概述
在数字化时代,数据存储与协同办公的安全性、便捷性愈发重要。国内网盘普遍存在限速、隐私风险等问题,企业内部文件共享也面临权限管理、传输限制等挑战。本文将手把手教你通过 Docker 容器技术,在本地快速部署一套功能完备的 NextCloud 个人网盘系统,并集成 OnlyOffice 实现在线协同编辑,结合内网穿透实现公网访问,全程仅需一周即可完成,适合个人用户与中小企业搭建私有云解决方案。
项目组织方式及时间
- 时间:建议一周内完成所有的项目搭建、功能测试、问题总结
- 方式:通过VmWare17虚拟机实现平台搭建
一、项目背景知识
日常工作与生活中,我们常面临这些痛点:
- 公共网盘限速严重、隐私数据有被泄露或删除的风险;
- 微信 / QQ 传输文件有大小限制,企业机密文件直接- 传输存在安全隐患;
- 团队内部文件共享需要精细化权限管理,不同部门访问权限需隔离;
- 跨设备办公时,文件同步与在线编辑需求强烈,但传统方案配置复杂。
NextCloud + Docker 的组合为这些问题提供了完美解决方案:
- NextCloud 是开源的私有云存储系统,支持本地部署,数据完全自主掌控;
- 支持多设备同步、精细化权限管理,可集成在线办公工具实现协同编辑;
- Docker 容器技术确保环境一致性,简化部署流程,实现 "一次配置,处处运行"。
二、技术基础:Docker 容器技术核心概念
1.Docker 解决的核心问题
- 开发与部署中最常见的问题是 “在我电脑上能运行,换台机器就报错”。这源于环境配置的差异(如依赖库版本、系统参数等)。Docker 通过 “软件带环境安装” 的思路,将应用及其依赖的系统环境打包成标准化容器,实现跨平台、跨设备的无缝移植。
- 简单说,Docker 就像 “数字化集装箱”:无论内部装的是 Web 应用、数据库还是办公工具,都能通过统一的容器格式运输、部署,避免环境差异导致的兼容问题。
2.docker理念
- Docker是基于Go语言实现的云开源项目。
- Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
- Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
- 一句话定义docker:解决了运行环和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
3.docker三要素
- 镜像(Image):只读模板,包含运行应用所需的所有文件(代码、库、配置等),是容器的 “源代码”。
- 容器(Container):镜像的运行实例,可理解为一个轻量的 Linux 环境(包含进程空间、网络等),应用在容器中独立运行。
- 仓库(Repository):集中存储、分发镜像的平台(如 Docker Hub),方便用户获取现成的应用镜像。
4.为什么选择 Docker 部署 NextCloud?
- 部署高效:无需手动配置复杂依赖(如 PHP、数据库、Web 服务器),拉取镜像即可启动;
- 环境隔离:NextCloud、数据库、OnlyOffice 等组件通过容器隔离,互不干扰,便于维护;
- 迁移灵活:容器可快速复制到其他设备,只需保证 Docker 环境,即可一键启动,避免重复配置。
docker常用命令
docker version # 查看 docker 版本号等信息
docker info # 查看 docker 版本号等信息
docker images # 查看镜像
docker search 镜像名 # 仓库中查看镜像
docker pull 镜像名 # 拉取镜像
docker run 镜像名 # 运行镜像
docker rmi -f 镜像名/镜像ID # 强制删除一个镜像
docker ps -a # 查看容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...] # 创建容器
-d: 后台运行容器并返回容器ID
-it:启动交互式容器
-p: 指定端口映射
docker start 容器名 # 启动容器
docker stop 容器名 # 停止容器
docker restart 容器名 # 重启容器
docker inspect 容器名:latest | grep -i version # 查看容器latest具体版本号
docker rm -f 容器ID # 强制删除容器
Nextcloud
-
众所周知,国内很多网盘都关停了,现有的百度云还限速,甚至网盘里的文件还会被删除,网盘使用体验差、安全性堪忧。
-
团队内部分享文件,用微信传输有大小限制,且只能通过公网上传下载;用 QQ 传输虽然可以通过内网传输,但是有的文件是公司的机密,直接传输有泄露的风险,打包加密传输又太麻烦;并且不同部门对文档的操作权限也应该是不同的。
-
Nextcloud就是这么一套系统,既能够部署在局域网环境,又可以设置不同用户组对文档的访问权限,还可以实现内网 + 公网访问
-
Nextcloud是一套用于创建网络硬盘的客户端-服务器软件。其功能与Dropbox相近,但Nextcloud是自由及开放原始码软件,每个人都可以在私人服务器上安装并执行它。在安全性,多客户端支持与多应用支持上也非常具有优势。
onlyoffice
- 网址:https://www.onlyoffice.com/zh/
- OnlyOffice是一款开源的办公套件,提供了文档编辑、电子表格和演示文稿等功能,支持在线协作和文件共享。它通过网页浏览器即可访问和编辑各种文档,适合企业和个人用户在不同地点高效工作
cpolar
- 一款免费的内网穿透软件
- 只需一行命令,就可以将内网站点发布至公网,方便给客户演示。高效调试微信公众号、小程序、对接支付宝网关等云端服务,提高您的编程效率
三、项目规划:目标与环境准备
项目目标
- 搭建基于 OpenEuler 系统的虚拟机环境;
- 利用 Docker 部署 NextCloud 网盘、MySQL 数据库、OnlyOffice 在线编辑器;
- 实现本地访问测试、多用户权限管理、在线文档编辑功能;
- 配置内网穿透,实现公网访问私有网盘。
软硬件环境清单
- 使用单台虚拟机实现
主机名 | IP地址 | 硬件 | 软件 |
---|---|---|---|
nextcloud | 192.168.88.203 | cpu:1颗2核 内 存:4GB HDD:20GB 网 络:NAT | VmWare17 OpenEuler22.03sp4 docker26.1.4 mysql8.0.37 nextcloud30.0.6 OnlyOffice24.04 OnlyOffice connector9.6 |
任务清单
项目环境搭建
-
新建OpenEuler22.03 SP4 虚拟机
-
按照规划,最小化部署系统,关闭防火墙,禁用SELinux,确保能够联网。
docker设置
-
安装docker源及docker服务
-
配置docker镜像加速器
-
docker拉取镜像
-
配置并启动容器
配置数据库
- 新建nextcloud数据库及所需表
- 创建账户和密码设置权限
配置nextcloud
- 安装nextcloud
- 设置其选项
- 测试访问
配置onlyoffice
- 启动容器
- 下载onlyoffice连接器插件
- 配置
- 测试
配置内网穿透
四、部署步骤:从环境搭建到功能实现
阶段 1:基础环境准备
1.虚拟机与系统安装
- 安装虚拟机及OpenEuler22.03 SP4系统 ,过程略
2. 关闭安全组件(关键步骤)
[root@localhost ~]# vim /etc/selinux/config
修改为:SELINUX=disabled
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
3. 配置主机名与基础工具
[root@localhost ~]# hostnamectl set-hostname rch
[root@localhost ~]# reboot
[root@rch ~]# yum install vim tar tree net-tools -y
阶段 2:Docker 环境配置
1. 安装 Docker 服务
OpenEuler 基于 CentOS 内核,可直接使用 CentOS 的 Docker 源:
# 添加阿里云 Docker 源
[root@rch ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@rch ~]# ls /etc/yum.repos.d/
docker-ce.repo openEuler.repo
# 替换源为阿里云(因 OpenEuler 未在官方源中,需适配 CentOS 7 版本)
[root@rch ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo # 更换为阿里开源镜像站源
[root@rch ~]# sed -i 's/$releasever/7/g' /etc/yum.repos.d/docker-ce.repo
# 安装 Docker
[root@rch ~]# yum install docker-ce -y
2.配置 Docker 镜像加速器
# 创建/修改 Docker 配置文件,这里我用的华为镜像加速器
# 添加以下内容(加速器地址需替换为自己的华为云加速器地址,可在华为云控制台获取)
[root@rch ~]# vim /etc/docker/daemon.json # 添加如下
{
"registry-mirrors": [ "https://1a4b64e3bac642e18f2c42e791d607eb.mirror.swr.myhuaweicloud.com" ]
}
[root@rch ~]# systemctl enable --now docker # 启动 Docker 并设置开机自启
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@rch ~]# docker version # 验证安装(出现 Client 和 Server 版本信息即为成功)
Client: Docker Engine - Community
Version: 26.1.4
API version: 1.45
Go version: go1.21.11
Git commit: 5650f9b
Built: Wed Jun 5 11:32:04 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.1.4
API version: 1.45 (minimum version 1.24)
Go version: go1.21.11
Git commit: de5c9cf
Built: Wed Jun 5 11:31:02 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.33
GitCommit: d2d58213f83a351ca8f528a95fbd145f5654e957
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
# 重启 Docker 使配置生效
[root@rch ~]# systemctl restart docker
# 验证加速器配置(出现 Registry Mirrors 即为成功)
[root@rch ~]# docker info | grep "Registry Mirrors"
阶段 3:拉取核心镜像
通过 Docker 拉取 NextCloud、MySQL、OnlyOffice 三大核心组件的镜像:
# 拉取 NextCloud 镜像(个人网盘核心,不用跟版本号)
[root@rch ~]# docker pull nextcloud
# 拉取 MySQL 镜像(数据存储,要跟版本号)
[root@rch ~]# docker pull mysql:8.0.37
# 拉取 OnlyOffice 镜像(在线文档编辑)
[root@rch ~]# docker pull onlyoffice/documentserver
# 查看已拉取的镜像
[root@rch ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nextcloud latest 93bfd883730b 11 days ago 1.42GB
onlyoffice/documentserver latest 57c28621b213 2 weeks ago 3.79GB
mysql 8.0.37 8279f68ee77d 13 months ago 567MB
阶段 4:配置 MySQL 数据库
NextCloud 需要数据库存储用户信息、文件元数据等,需提前配置 MySQL:
1. 启动 MySQL 容器
[root@rch ~]# docker run -p 3306:3306
--name mysql
--restart="always" # 开机自启
-v /usr/local/mysql/conf:/etc/mysql/conf.d # 配置文件挂载
-v /usr/local/mysql/logs:/logs # 日志挂载
-v /usr/local/mysql/data:/var/lib/mysql # 数据持久化(避免容器删除后数据丢失)
-e MYSQL_ROOT_PASSWORD=123456 # 数据库 root 密码
-d mysql:8.0.37 # 后台运行
4790bdba643980730c69fa484936b3c99913ef0593e023f8fe50740fc4022f46
2. 初始化 NextCloud 数据库
进入 MySQL 容器,创建专用数据库与用户:
[root@rch ~]# docker ps | grep mysql
4790bdba6439 mysql:8.0.37 "docker-entrypoint.s…" 11 seconds ago Up 10 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@rch ~]# docker exec -it 4790bdba643980730c69fa484936b3c99913ef0593e023f8fe50740fc4022f46 /bin/bash # 进入 MySQL 容器
bash-5.1# mysql -uroot -p
Enter password: # 登录 MySQL(输入密码 123456)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.37 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
# 允许 root 远程访问(开发环境简化配置,生产环境建议创建专用用户)
mysql> grant all PRIVILEGES on *.* to root@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER USER 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
# 创建 NextCloud 专用数据库(名称为 rch)
mysql> create database rch;
Query OK, 1 row affected (0.00 sec)
# 验证数据库创建成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| rch |
| sys |
+--------------------+
5 rows in set (0.01 sec)
mysql> exit
Bye
bash-5.1# exit
exit
阶段 5:部署 NextCloud 网盘
1. 启动 NextCloud 容器
[root@rch ~]# docker run -d
-v /root/nextcloud/html:/var/www/html # 网页文件挂载
-v /root/nextcloud/apps:/var/www/html/custom_apps # 插件目录挂载
-v /root/nextcloud/config:/var/www/html/config # 配置文件挂载
-v /root/nextcloud/nextcloud/data:/var/www/html/data # 用户文件数据挂载(核心!避免数据丢失)
-v /root/nextcloud/themes:/var/www/html/themes # 主题目录挂载
-p 80:80 # 映射 80 端口(网页访问)
--name nextcloud
--restart="always" # 开机自启
nextcloud
5bfca407bd23200e58749128d67b61f377fcf63c364c10c0e0d72c41a900e0d7
[root@rch ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5bfca407bd23 nextcloud "/entrypoint.sh apac…" 10 seconds ago Up 10 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nextcloud
4790bdba6439 mysql:8.0.37 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
2.初始化 NextCloud 配置
- 浏览器输入本机ip进行配置:
- 创建管理员账号(如用户名 rch,密码自定义);
- 选择 “MySQL/MariaDB” 数据库;
- 填写数据库信息:
- 数据库用户:root
- 数据库密码:123456
- 数据库名称:rch
- 数据库主机:虚拟机IP:3306(如 192.168.88.203:3306) - 点击 “安装完成”,等待初始化完成。
阶段 6:集成 OnlyOffice 实现在线协同编辑
1. 启动 OnlyOffice 容器
[root@rch ~]# docker run -i -t -d
-p 9010:80 \ # 映射 9010 端口(OnlyOffice 服务)
--restart=always \
> -v /usr/docker/onlyoffice/log:/var/log/onlyoffice \ # 日志挂载
> -v /usr/docker/onlyoffice/data:/var/www/onlyoffice/Data \ # 数据挂载
> -v /usr/docker/onlyoffice/lib:/var/lib/onlyoffice \ # 依赖库挂载
> -v /usr/docker/onlyoffice/db:/var/lib/postgresql # 内置数据库挂载onlyoffice/documentserver
[root@rch ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6111c0314377 onlyoffice/documentserver "/app/ds/run-documen…" 5 seconds ago Up 5 seconds 443/tcp, 0.0.0.0:9010->80/tcp, :::9010->80/tcp wonderful_jackson
5bfca407bd23 nextcloud "/entrypoint.sh apac…" 39 minutes ago Up 39 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp nextcloud
4790bdba6439 mysql:8.0.37 "docker-entrypoint.s…" 44 minutes ago Up 44 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
2. 安装 OnlyOffice 连接器
-
离线下载onyoffice插件:https://apps.nextcloud.com/apps/onlyoffice/releases?platform=30#30
-
查看当前nextcloud版本
[root@rch ~]# docker inspect nextcloud:latest | grep -i version
"DockerVersion": "",
"PHP_VERSION=8.3.23",
"NEXTCLOUD_VERSION=31.0.7" # nextcloud版本号
- 当前docker的nextcloud镜像是31版本,所以下载对应31版本插件
- 下载后,复制插件到宿主机并解压插件
[root@rch ~]# cd /root/nextcloud/apps
[root@rch apps]# ls
# 使用xftp将下载插件压缩包上传
[root@rch apps]# ls
onlyoffice.tar.gz
[root@rch apps]# tar -xvf onlyoffice.tar.gz
- 启用插件
3. 配置 OnlyOffice 密钥(关键步骤)
- 在onlyoffice7.2版本之后,需要使用秘钥才能连接上,浏览器输入:http://ip:9010 , 查看获取密钥方法:
- 复制上图方框中代码,进入onlyoffice容器,获取密钥
[root@rch apps]# sudo docker exec 6111c0314377 /var/www/onlyoffice/documentserver/npm/json -f /etc/onlyoffice/documentserver/local.json 'services.CoAuthoring.secret.session.string'
Q197Gz02BDhjzbAMGVYmKjqxtIZmzsPp
# 注意:每次重启后密钥会发生变化
- nextcloud中点击右上角用户图标 -> 点击管理设置-> 点击左侧侧边栏的onlyoffice,进行服务器配置,如图:(记得保存)
测试
- 在 NextCloud 中点击 “文件"→"新建"→"文档 / 表格 / 幻灯片”,能正常打开并编辑,说明集成成功。
阶段 7:配置内网穿透,实现公网访问
- 网址:https://www.cpolar.com/
# xftp上传cpolar
[root@rch ~]# ls
anaconda-ks.cfg cpolar-stable-linux-amd64.zip nextcloud
[root@rch ~]# unzip cpolar-stable-linux-amd64.zip
Archive: cpolar-stable-linux-amd64.zip
inflating: cpolar
[root@rch ~]# ./cpolar authtoken OWQ2MTA2MGMtNzIw...................ZjAzOWU3
Authtoken saved to configuration file: /root/.cpolar/cpolar.yml
# 将本地 80 端口(NextCloud 服务)映射到公网
# 启动后,cpolar 会生成一个公网地址(如 https://309c8671.r7.cpolar.top),通过该地址即可在公网访问你的 NextCloud 网盘。
[root@rch ~]# ./cpolar http 80
# 切换到另一个终端,为避免公网访问时出现 "不信任域名" 错误,需修改 NextCloud 配置:
[root@nextcloud ~]# vim /root/nextcloud/config/config.php
…………
array (
0 =>'192.168.120.129', #本机IP
1 =>'309c8671.r7.cpolar.top', #公网域名
# 添加域名信任
),
……
- 用手机访问试试
五、 总结
-
通过这次项目,我掌握了用 Docker 部署 NextCloud 个人网盘系统的完整流程。从搭建 OpenEuler 虚拟机环境开始,学习了如何关闭防火墙和 SELinux 以确保环境通畅,接着安装并配置 Docker,包括设置镜像加速器来提升拉取镜像的速度。
-
在实际操作中,我成功拉取了 NextCloud、MySQL 和 OnlyOffice 的镜像,依次配置并启动了这些容器。其中,MySQL 数据库的配置让我熟悉了数据持久化的重要性,通过挂载目录确保数据不会因容器删除而丢失;NextCloud 的初始化设置让我了解了网盘系统的基本配置逻辑;OnlyOffice 的集成则实现了在线文档编辑功能,还学会了获取和配置密钥来保证连接安全。
-
最后,通过 cpolar 实现内网穿透,让我明白了如何将本地服务暴露到公网访问,同时掌握了修改 NextCloud 配置文件以信任公网域名的方法。整个过程巩固了我对容器技术、服务部署和系统配置的知识,也提升了实际动手能力,为今后的相关学习和实践积累了经验。