我的docker随笔19:Nextcloud部署

一、背景

Nextcloud是个人云存储服务,提供云存储服务,内置了Office文档、图片相册、日历联系人、两步验证、文件管理、RSS阅读等丰富的应用。可安装在本地或云主机,本文使用Docker进行部署,一来直接在主机上部署,要安装的软件实在太多了,二来Nextcloud官方有提供好的Docker镜像。

二、docker部署

由于Nextcloud还需要数据库的支持,如果单独用docker的话,需要手动依次运行2个容器,因此使用docker-compose部署(实际上笔者几乎所有的docker应用,优选这个方式),docker-compose.yml文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# nextcloud docker-compose file
# by Late Lee<li@latelee.org>

version: '2'

services:
mysql:
image: mysql:5.7
container_name: nextmysql
restart: always
volumes: # 数据库持久化存储
- ./db:/var/lib/mysql
environment: # 数据库账号和密码
- MYSQL_ROOT_PASSWORD=ll123456
- MYSQL_PASSWORD=ll123456
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
networks:
- nextcloud-net
nextcloud:
image: nextcloud:apache
container_name: nextcloud
restart: always
ports:
- 8008:80 # 对外使用8008端口
links:
- mysql # 连接到数据库
volumes:
- ./nextcloud:/var/www/html
networks:
- nextcloud-net

networks:
nextcloud-net:
driver: bridge

关于docker-compose.yml文件,需要说明几点:

  • 1、数据使用镜像mysql:5.7,并非最新版本,服务名为mysql,这个名称是Nextcloud连接的数据库主机——注意,不是容器名称。另外需要设置数据库名称、用户和密码,因为Nextcloud要使用到。
  • 2、Nextcloud使用镜像nextcloud:apache,集成了apache服务。对外提供8008端口,因为笔者云主机的80端口需要做反向代理。
  • 3、为了持久化存储,两个容器都进行目录的挂载。

执行命令docker-compose up -d启动服务,如果镜像不存在,会自动下载。注意,2个镜像体积较大,需要一定时间。针对体积大的镜像,如果使用阿里云主机,可提交到阿里的镜像仓库,这样后续使用速度会非常快。

服务成功启动后,查看其状态:

1
2
3
4
$ docker ps              
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8fff850ff996 nextcloud:apache "/entrypoint.sh ap..." 42 minutes ago Up 42 minutes 0.0.0.0:8008->80/tcp nextcloud
09d7cd30812c mysql:5.7 "docker-entrypoint..." 42 minutes ago Up 42 minutes 3306/tcp nextmysql

状态正常,可以看到,Nextcloud对外开放了8008(映射到内部的80端口),而mysql只在内部开放了3306端口,因为是部署在公网,不会直接操作数据库,所以不开放端口。

三、Nextcloud服务

使用浏览器打开http://<IP地址或域名>:8008,输入管理员账号和密码,选择Mysql数据,输入在docker-compose.yml文件设置好的参数,点击“安装完成”即可。如图1所示:
图1

Nextcloud主页如图2所示:
图2

点击右上角图标进行各项的设置,如头像、邮箱地址、修改密码,等等。这些在页面上均有提示指引,所以本文不再赘述。

四、Nextcloud客户端

Nextcloud提供了客户端,包括Windows、MacOS、Linux,也提供移动端APP下载,地址:https://nextcloud.com/install/#install-clients。安装过程十分简单,此处从略。

如此一来,服务端有了,客户端有了,在使用上跟常用的网盘没有太大的区别,不过,现在也没剩多少个网盘了,所以,自己搭建一个自己的网盘是十分有必要的。客户端界面如图3所示。
图3

五、小结

理论上,开放到公网的地址,最好是使用https协议,但笔者还没有解决一些问题,所以本文未涉及。

重置密码方法

Nextcloud使用命令行示例:

1
docker exec --user www-data <容器ID> php occ

比如查看系统用户:

1
2
3
$ docker exec --user www-data cab517edc9b0  php occ user:list 
- latelee: 李迟
- test: test

根据教程重置密码:

1
2
$ docker exec --user www-data cab517edc9b0  php occ user:resetpassword latelee
Interactive input or --password-from-env is needed for entering a new password!

提示说要添加--password-from-env选项,添加后:

1
2
3
docker exec --user www-data cab517edc9b0  php occ --password-from-env user:resetpa 
ssword latelee
--password-from-env given, but OC_PASS is empty!

但是,在容器里或主机中设置OC_PASS的值,均无效。因此以失败告终。

附录

Nextcloud官方镜像:https://hub.docker.com/_/nextcloud/

李迟 2019.10.17 周四,离职找工作期间