1.项目说明
1.1概述
-
该项目共分为3个子项目,由容器、个人网盘、移动办公三个部分组成
-
该项目旨在复习巩固系统服务部署使用、容器服务使用等知识,旨在让学生增加知识面,提高项目实习经历,充实简历
1.2项目组织方式及时间
-
时间:建议一周内完成所有的项目搭建、功能测试、问题总结
-
方式:通过VmWare17虚拟机实现平台搭建
-
人数:3人小组
2.项目背景知识
2.1系统需求
-
由于现有网盘费用较高且安全性得不到保证,需要在本地部署个人网盘存储系统。
-
为了便于使用,通过容器技术来实现,并部署在线office编辑工具,以实现个人云存储和移动办公。
2.2docker概述
2.2.1为什么会有docker出现
-
假定您在开发一个商城类的软件,您使用的是一台笔记本电脑而且您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。此外,您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。您希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销。
-
请问:您要如何确保应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复?
-
答案就是使用容器。Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案-----==系统平滑移植,容器虚拟化技术==。
-
环境配置相当麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,==软件可以带环境安装?==也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“==在我的机器上可正常工作”的问题==。
-
之前在服务器配置一个应用的运行环境,要安装各种软件,就拿电商类项目的环境来说,Java/RabbitMQ/MySQL/JDBC驱动包等。安装和配置这些东西有多麻烦就不说了,它还不能跨平台。假如我们是在 Windows 上安装的这些环境,到了 Linux 又得重新装。况且就算不跨操作系统,换另一台同样操作系统的服务器,要移植应用也是非常麻烦的。
-
传统上认为,软件编码开发/测试结束后,所产出的成果即是程序或是能够编译执行的二进制字节码等(java为例)。而为了让这些程序可以顺利执行,开发团队也得准备完整的部署文件,让维运团队得以部署应用程式,开发需要清楚的告诉运维部署团队,用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。Docker的出现使得Docker得以打破过去「程序即应用」的观念。透过镜像(images)将作业系统核心除外,运作应用程式所需要的系统环境,由下而上打包,达到应用程式跨平台间的无缝接轨运作。
-
==简单的理解,Docker类似于集装箱,各式各样的货物,经过集装箱的标准化进行托管,而集装箱和集装箱之间没有影响。也就是说,Docker平台就是一个软件集装箱化平台,这就意味着我们自己可以构建应用程序,将其依赖关系一起打包到一个容器中,然后这容器就很容易运送到其他的机器上进行运行,而且非常易于装载、复制、移除,非常适合软件弹性架构。==
2.2.2docker理念
-
Docker是基于Go语言实现的云开源项目。
-
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
-
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
-
一句话定义docker:解决了运行环和配置问题的软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
2.2.3docker三要素
-
容器:可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
-
Docker 镜像(Image):就是一个只读的模板,镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。它也相当于是一个root文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
-
仓库:==集中存放镜像文件的地方==,镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
2.2.4docker常用命令
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 # 强制删除容器
3.Nextcloud
-
众所周知,国内很多网盘都关停了,现有的百度云还限速,甚至网盘里的文件还会被删除,网盘使用体验差、安全性堪忧。
-
团队内部分享文件,用微信传输有大小限制,且只能通过公网上传下载;用 QQ 传输虽然可以通过内网传输,但是有的文件是公司的机密,直接传输有泄露的风险,打包加密传输又太麻烦;并且不同部门对文档的操作权限也应该是不同的。
-
Nextcloud就是这么一套系统,既能够部署在局域网环境,又可以设置不同用户组对文档的访问权限,还可以实现内网 + 公网访问
-
Nextcloud是一套用于创建网络硬盘的客户端-服务器软件。其功能与Dropbox相近,但Nextcloud是自由及开放原始码软件,每个人都可以在私人服务器上安装并执行它。在安全性,多客户端支持与多应用支持上也非常具有优势。
4.onlyoffice
-
OnlyOffice是一款开源的办公套件,提供了文档编辑、电子表格和演示文稿等功能,支持在线协作和文件共享。它通过网页浏览器即可访问和编辑各种文档,适合企业和个人用户在不同地点高效工作
5.cpolar
-
一款免费的内网穿透软件
-
只需一行命令,就可以将内网站点发布至公网,方便给客户演示。高效调试微信公众号、小程序、对接支付宝网关等云端服务,提高您的编程效率
6.软硬件环境清单
-
使用单台虚拟机实现
主机名 | IP地址 | 硬件 | 软件 |
nextcloud | 192.168.208.128 | cpu:1颗2核 内 存:4GB HDD:20GB 网 络:NAT | VmWare17 OpenEuler22.03sp4 docker26.1.4 mysql8.0.37 nextcloud30.0.6 OnlyOffice24.04 OnlyOffice connector9.6 |
6.1任务清单
6.2项目环境搭建
-
新建OpenEuler22.03 SP4 虚拟机
-
按照规划,最小化部署系统,关闭防火墙,禁用SELinux,确保能够联网。
6.3docker设置
-
安装docker源及docker服务
-
配置docker镜像加速器
-
docker拉取镜像
-
配置并启动容器
6.4配置数据库
-
新建nextcloud数据库及所需表
-
创建账户和密码设置权限
6.5配置nextcloud
-
安装nextcloud
-
设置其选项
-
测试访问
6.6配置onlyoffice
-
启动容器
-
下载onlyoffice连接器插件
-
配置
-
测试
6.7配置内网穿透
7.项目实施
7.1环境搭建
- 安装虚拟机及OpenEuler22.03 SP4系统 ,过程略
- 关闭安全软件:
[root@localhost ~]# sed -i '7s/enforcing/disabled/' /etc/selinux/config
[root@localhost ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
7.2修改主机名
[root@localhost ~]# hostnamectl set-hostname nextcloud
[root@localhost ~]# reboot
7.3下载所需软件
[root@nextcloud ~]# yum install vim tar tree net-tools -y
7.4安装docker
[root@nextcloud ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@nextcloud ~]# ls /etc/yum.repos.d/
docker-ce.repo openEuler.repo
[root@nextcloud ~]# sed -i 's/$releasever/7/g' /etc/yum.repos.d/docker-ce.repo
[root@nextcloud ~]# yum install docker-ce -y
7.5配置docker源
[root@nextcloud ~]# vim /etc/docker/daemon.json
[root@nextcloud ~]# systemctl enable --now docker
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
[root@nextcloud ~]# docker version
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
[root@nextcloud ~]# docker info
Client: Docker Engine - Community
Version: 26.1.4
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.14.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.27.1
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 26.1.4
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957
runc version: v1.1.12-0-g51d5e94
init version: de40ad0
Security Options:
seccomp
Profile: builtin
Kernel Version: 5.10.0-216.0.0.115.oe2203sp4.x86_64
Operating System: openEuler 22.03 (LTS-SP4)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.297GiB
Name: nextcloud
ID: 5eb753c2-45b6-404b-89f5-a137caacabf3
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://39b0019d28a74e9688284d8bd99d57da.mirror.swr.myhuaweicloud.com/
Live Restore Enabled: false
7.6拉取镜像
[root@nextcloud ~]# docker pull nextcloud
[root@nextcloud ~]# docker pull mysql:8.0.37
[root@nextcloud ~]# docker pull onlyoffice/documentserver
[root@server ~]# docker images
[root@nextcloud ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
onlyoffice/documentserver latest 8802f525e0a0 4 days ago 3.53GB
nextcloud latest b151457b6932 4 weeks ago 1.42GB
mysql 8.0.37 8279f68ee77d 10 months ago 567MB
7.7数据库配置
[root@nextcloud ~]# 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 -d mysql:8.0.37
4057675edeadb582b9d26620c0b3f8e93cc75a4c72df73de8d15802badd2d0b7
[root@nextcloud ~]# docker ps | grep mysql
4057675edead mysql:8.0.37 "docker-entrypoint.s…" 12 seconds ago Up 10 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql
[root@nextcloud ~]# docker exec -it 8279f68ee77d /bin/bash
Error response from daemon: No such container: 8279f68ee77d
[root@nextcloud ~]# docker exec -it 4057675edead /bin/bash
bash-5.1#
bash-5.1# mysql -uroot -p
Enter password:
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.
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.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
mysql> create database nextcloud;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
bash-5.1# exit
exit
7.8nextcloud配置
[root@nextcloud ~]# 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 --name nextcloud --restart="always" nextcloud
9922f4b15e4673708bc41d70e0d65993d3a7c87565f6ba489cffadc7ff15b6aa
7.9onlyoffice
7.9.1启动
[root@nextcloud ~]# docker run -i -t -d -p 9010:80 --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@nextcloud ~]# docker ps
7.9.2安装onlyoffice连接器
-
离线下载onyoffice插件:https://apps.nextcloud.com/apps/onlyoffice/releases?platform=30#30
-
查看当前nextcloud版本
[root@nextcloud ~]# docker inspect nextcloud:latest | grep -i version
"DockerVersion": "",
"PHP_VERSION=8.3.20",
"NEXTCLOUD_VERSION=31.0.2"
当前docker的nextcloud镜像是31版本,所以下载对应31版本插件
下载后,复制插件到宿主机并解压插件
[root@nextcloud ~]# cd /root/nextcloud/apps
[root@nextcloud apps]# tar xf onlyoffice.tar.gz
[root@nextcloud apps]# ls
onlyoffice onlyoffice.tar.gz
启用插件
7.9.3配置onlyoffice
-
在onlyoffice7.2版本之后,需要使用秘钥才能连接上,浏览器输入:http://ip:9010 , 查看获取密钥方法:
复制上图方框中代码,进入onlyoffice容器,获取密钥
[root@nextcloud apps]# sudo docker exec 4466a34cf99d /var/www/onlyoffice/documentserver/npm/json -f /etc/onlyoffice/documentserver/local.json 'services.CoAuthoring.secret.session.string'
ZmOnX4c3E7TYCEyuu9WpQOBJ4Mlclf8v
nextcloud中点击右上角用户图标 -> 点击管理设置-> 点击左侧侧边栏的onlyoffice,进行服务器配置,如图:
7.9.4测试
-
nextcloud->文件->新建word文件或excel文件
8.内网穿透
# xftp上传cpolar
[root@nextcloud ~]# ls
anaconda-ks.cfg cpolar cpolar-stable-linux-amd64.zip nextcloud
[root@nextcloud ~]# unzip cpolar-stable-linux-amd64.zip
[root@nextcloud ~]# ./cpolar authtoken OWM3MjJkOTgtNTc3ZS00ODllLTk5ZjQtOGM5MjZkZDU4MTg3
[root@nextcloud ~]# ./cpolar http 80
# 切换到另一个终端
[root@nextcloud ~]# vim /root/nextcloud/config/config.php