记一次局域网搭建私人云盘的过程
过程
在搭建之前应该已经准备好了虚拟内网的相关配置,并且能够保证正常使用。「如果还没有的话请看这篇」另外,本篇搭建私人云需要使用Docker来进行。
搭建基于NextCloud的私人云需要使用docker安装NextCloud、MySQL以及Redis。因此需要在下面执行命令:docker pull nextcloud mysql redis
来从官方获取镜像。
这时你要定好网盘主体的存放位置在哪,为了便于表述,我们使用 $MAIN
来表示这个地址。
cd $MAIN
mkdir MySQL-Database
mkdir Redis
mkdir NextCloud
docker run -d -p 33306:3306 \
--privileged=true --name mysql \
-v $MAIN/MySQL-Database:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=XXXXXXX \
mysql
wget -P $MAIN/Redis http://download.redis.io/redis-stable/redis.conf
docker run -d -p 65379:6379 \
--privileged=true --name redis \
-v $MAIN/Redis/redis.conf:/etc/redis/redis.conf \
-v $MAIN/Redis/data:/data \
redis redis-server /etc/redis/redis.conf --appendonly yes
# --requirepass 'redis637 ## 这行代码是用来设定密码的
docker run -d -p 8088:80 \
--name nextcloud \
--restart=always \
-v $MAIN/NextCloud/html:/var/www/html \
-v $MAIN/NextCloud/apps:/var/www/html/custom_apps \
-v $MAIN/NextCloud/config:/var/www/html/config \
-v $MAIN/NextCloud/data:/var/www/html/data \
-v $MAIN/NextCloud/theme:/var/www/html/themes \
--link mysql:mysql \
--link redis:redis \
nextcloud
执行完以上步骤之后就可以正常使用NextCloud了,通过 http://localhost:8088
来访问即可。
应该注意的是,第一次使用的时候会提示创建管理员帐号以及配置数据库连接,管理员用户名和密码还好说,数据库连接的话,第一空写的是数据库内用户名,在本次安装配置中数据库内用户名是用户root。第三空写的是数据库名称,在本次安装配置中应该是nextcloud,这和你设置的参数name有关。第四空写的是mysql,因为docker创建nextcloud时已经执行了命令 --link mysql:mysql
,和 :
后面的 mysql
有关。
还没结束
仅仅到这里你的设备是无法登录的,因为设备的ip都没有被信任,因而不能直接连接。由于本次配置目的是在局域网中能自由使用。那么可以直接开放访问,因为在家庭中没必要特意部署安全攻防工具。要做的是:
cd $MAIN
sudo vim ./NextCloud/config/config.php
然后在这里需要修改 trusted_domains
这一项,添加:
XXX => preg_match('/cli/i',php_sapi_name())?'127.0.0.1':$_SERVER['SERVER_NAME'],
其中XXX表示代号。添加的这一行也是表示接受任何访问,这个在家里使用是完全够用的。
当然如果不希望这样做,你也可以直接手动添加IP地址,即:
XXX => 'xxx.xxx.xxx.xxx',
「注意」
上面的docker命令中各参数的含义如下:
- run:创建一个容器并运行。
- -d:后台挂起,返回容器ID。
- -p:端口映射,从宿主机映射到容器机,
:
左为宿主机,右为容器机。- --privileged:true/false决定容器内root有无宿主机root权限。
- --name:为容器指定名称。
- -v:目录映射,格式与参数
-p
相似,通过该参数可以将数据持久化到指定的宿主机目录下,容器重启时数据不会丢失。- -e:设置环境变量
- --link:连接到已安装的容器,使用后可将mysql和redis用作主机名了。
错误指正
前一段时间重新使用了上面的教程,但后来遇到了一个比较奇怪的问题:
当我按照上面的教程部署的时候,使用了一段时间就会发现网络不可访问,几经排查后发现,是Docker在运行容器一段时间后自动停止运行了。
原因在于:这个是docker 的机制问题,容器运行的命令如果不是那些一直挂起的命令( 运行top,tail、循环等),就是会自动退出,并且docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器认为空闲,就会自行退出。
然后我去仔细看了一下运行命令,终于发现一个大问题:我在运行MySQL和Redis时没有使用--restart=always
这个参数,导致运行一段时间时Docker会认为这些后台进程是空闲的,为了验证这一点,我运行起来容器后特意直接重启,当我登录成功时一查看,果然这三个容器都没有启动。因此运行方式需要再作调整,最终行之有效的代码如下:
cd $MAIN
mkdir MySQL-Database
mkdir Redis
mkdir NextCloud
docker run -d -p 33306:3306 \
--restart=always \
--privileged=true --name mysql \
-v $MAIN/MySQL-Database:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=XXXXXXX \
mysql
wget -P $MAIN/Redis http://download.redis.io/redis-stable/redis.conf
docker run -d -p 65379:6379 \
--restart=always \
--privileged=true --name redis \
-v $MAIN/Redis/redis.conf:/etc/redis/redis.conf \
-v $MAIN/Redis/data:/data \
redis redis-server /etc/redis/redis.conf --appendonly yes
# --requirepass 'redis637 ## 这行代码是用来设定密码的
docker run -d -p 8088:80 \
--name nextcloud \
--restart=always \
-v $MAIN/NextCloud/html:/var/www/html \
-v $MAIN/NextCloud/apps:/var/www/html/custom_apps \
-v $MAIN/NextCloud/config:/var/www/html/config \
-v $MAIN/NextCloud/data:/var/www/html/data \
-v $MAIN/NextCloud/theme:/var/www/html/themes \
--link mysql:mysql \
--link redis:redis \
nextcloud