使用Docker技术部署NextCloud

一、概述

NextCloud是一个开源的私有云服务器,可用于家庭及企业,有关NextCloud的详细说明可参看其官网(英文页面):https://nextcloud.com/。本文简要介绍如何使用Docker技术在Ubuntu 16.04上快速安装部署NextCloud服务器,大致的安装过程为:

  1. 安装ubuntu 16.04系统
  2. 安装配置Docker环境
  3. 安装配置mySql数据库
  4. 安装配置NextCloud
  5. 安装配置Nginx实现网站的https访问

二、安装Ubuntu 16.04系统

Ubuntu 16.04系统是Ubuntu的一个次新(最新的长期服务版是18.04.4)长期服务版本,由于是充当服务器,对图形桌面环境的需求不大,因此本文选择使用ubuntu 16.04的服务器版本,系统的光盘安装镜像可以从官网下载(https://cn.ubuntu.com/server)。

事实上,本文所记述的安装步骤并不严格依赖于所选择的Linux系统,有能力的读者完全可以根据自己的喜好,选择其他的Linux发行版(例如Debian、LinuxMint等)或ubuntu的其他版本(例如Ubuntu 18.4.4版)。

有关Ubuntu 16.04 系统的安装方法步骤,由于网络上有大量的相关说明文章,本文不再详细记述,仅给出几篇相关链接,供读者参考:

  1. Ubuntu 16.04 Server 版安装过程图文详解
  2. Ubuntu Server 16.04服务器版安装图解教程

三、安装并配置Docker环境

Docker的安装有两种方式:手动安装和脚本自动安装,本文介绍使用自动安装的方式,登录linux系统,依次输入:

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo usermod -aG docker <your-user>
$ sudo docker run hello-world

说明:

  • 第一条命令从https://get.docker.com下载安装脚本;
  • 第二条命令以超级用户的身份执行安装脚本;
  • 第三条命令赋予非root用户<your-user>执行docker命令的权限,注意使用实际用户名替换<your-user>。
  • 第四条命令用于检测docker是否成功安装,如果docker已经成功安装,则可以看到(类似)如下的输出内容:
$ sudo docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete     Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest


Hello from Docker!
This message shows that your installation appears to be working correctly.


To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

有关docker安装的更详细信息可参看菜鸟教程:https://www.runoob.com/docker/ubuntu-docker-install.html

四、部署mysql数据库服务

NextCloud需要使用数据库来存储用户、权限等信息,为此NextCloud内置了sqlLite,但出于性能的考虑,官方并不推荐用户使用内置数据库。因此,我们需要首先安装部署数据库服务,5.7版本是MySql出售给Oracle之前的最后一个版本(出售之后,社区开源版本更名为MariaDB),我们选择其作为NextCloud的数据库。步骤如下:

1.  在用户的home目录下创建名为start-mysql.sh的脚本文件,其内容如下

docker run -p 3306:3306 \
        --name mysql \
        --restart=always \
        -v  $(pwd)/mysql-data:/var/lib/mysql \
        -e MYSQL_ROOT_PASSWORD=123456 \
        -d mysql:5.7 \
        --log-error=/var/lib/mysql/error.log \
        --log-error-verbosity=2 \
        --innodb-buffer-pool-size=64M

说明: 该命令创建名为mysql的容器,容器中运行mysql 5.7的docker 镜像,将mysql数据库服务的数据存储在本机(宿主机)的$(pwd)/mysql-data/中。

2. 赋予文件start-mysql.sh可执行权限

$ chmod +x start-mysql.sh

3. 执行start-mysql.sh,启动容器

$ ./start-mysql.sh

说明:命令执行后,docker会自动从docker hub的网站下载名为mysql:5.7的镜像,并创建执行容器,期间会动态显示下载已经运行容器的进度。

4. 检查mysql容器是否已经成功运行

$  docker ps -a | grep mysql

如果看到类似如下的信息,说明mysql已经成功运行。

$ docker ps -a | grep mysql
bf50e0f7c507        mysql:5.7           "docker-entrypoint.s…"   2 hours ago         Up 2 hours          0.0.0.0:3306->3306/tcp, 33060/tcp   mysq

五、部署NextCloud

NextCloud的安装与mysql的安装类似,大致步骤如下:

1. 在用户的home目录下创建start start-nextcloud.sh文件,其内容如下:

docker run -d -p 80:80 \
        --name nextcloud  \
        -v $(pwd)/nextcloud:/var/www/html \
        --restart=always  \
        --link mysql:dbserver \
        nextcloud

说明:该命令使用名为nextcloud的镜像创建名为nextcloud的容器,将数据存储在$(pwd)/nextcloud中,并使用80端口对外提供服务。

2. 赋予文件start- nextcloud.sh可执行权限

$ chmod +x start-nextcloud.sh

3.  执行start- nextcloud.sh启动容器

$ ./start-nextcloud.sh

说明:命令执行后,docker会自动从docker hub网站下载名为nextcloud的镜像,并创建执行容器,期间会动态显示下载已经运行容器的进度。

4. 检查nextcloud容器是否已经成功运行

$  docker ps -a | grep nextcloud

如果看到类似如下的信息,说明nextcloud已经成功运行。

$  docker ps -a | grep nextcloud
e44e5006cd72        nextcloud           "/entrypoint.sh apac…"   2 hours ago         Up 2 hours          0.0.0.0:80->80/tcp                  nextcloud

5. 使用浏览器配置nextcloud

打开浏览器,在地址栏中输入http://<server-ip> 将可以看到nextcloud首次运行的配置界面,在页面中设置好管理员密码,数据库选择使用MySql/MariaDB,并在数据库地址一栏中填入dbserver,数据库密码设置为123456(对应本文第四部分第1步中的-e MYSQL_ROOT_PASSWORD=123456 参数),最后点击完成设置的按钮即可。

使用Docker技术部署NextCloud

六、 部署Nginx反向HTTPS代理

至此,NextCloud已经基本安装配置完成,可以通过服务器地址直接访问了。但客户端与服务器之间的通信采用http协议,用户名及密码等信息使用明文在网络上传输,这对一般家庭用户通常并不会成为严重的安全问题,但是如果用户希望通过公共互联网访问服务器,则将可能面临较大的安全风险。为此,官方推荐使用nginx建立基于https安全访问协议的反向代理来解决该问题。具体步骤如下:

1. 在用户home目录下创建start-nginx.sh文件,其内容如下:

docker run -d \
        --name nginx \
        -p 20443:20443 \
        -v $(pwd)/nginx/conf.d:/etc/nginx/conf.d \
        -v $(pwd)/nginx/ssl_certs:/etc/nginx/ssl_certs \
        --restart=always \
        --link nextcloud:ncserver \
        nginx

2. 赋予文件start-nginx.sh可执行权限

$ chmod +x start-nginx.sh

3. 创建存储证书的目录

$ mkdir $(pwd)/nginx
$ mkdir $(pwd)/nginx/ssl_certs

4. 在nginx/ssl_certs下创建文件build-certs.sh,内容如下:

openssl genrsa -des3 -out server.key 1024
openssl rsa -in server.key -out server.key
openssl req -new -x509 -key server.key -out ca.crt -days 3650
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
cat server.key server.crt > server.pem

有关证书创建的详细内容,可参看 《Linux 生成CRT、KEY、CSR证书》

5. 赋予文件build-certs.sh可执行权限

$ chmod +x build-certs.sh

6. 在nginx/ssl_certs下执行build-certs.sh,并按要求填写证书信息

$ cd nginx/ssl_certs/
$ ./build-certs.sh

如果证书创建成功,则在nginx/ssl_certs将自动生成server.key与server.pem文件,如下图所示:

$ ls -l
total 28
-rwxrwxr-x 1 boliang boliang  344 Apr  3 17:50 build-certs.sh
-rw-rw-r-- 1 boliang boliang  940 Apr  3 17:51 ca.crt
-rw-rw-r-- 1 boliang boliang   17 Apr  3 17:52 ca.srl
-rw-rw-r-- 1 boliang boliang  822 Apr  3 17:52 server.crt
-rw-rw-r-- 1 boliang boliang  696 Apr  3 17:52 server.csr
-rw-rw-r-- 1 boliang boliang  887 Apr  3 17:51 server.key
-rw-rw-r-- 1 boliang boliang 1709 Apr  3 17:52 server.pem

7. 创建nginx/conf.d目录

$ mkdir $(pwd)/nginx/conf.d

8. 在$(pwd)/nginx/conf.d下创建nextcloud.conf,内容如下:

server {
        listen 443 ssl http2;
        server_name <your-ip>;

        ssl_certificate     /etc/nginx/ssl_certs/server.pem;
        ssl_certificate_key /etc/nginx/ssl_certs/server.key;

        location / {
                proxy_pass http://ncserver;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }

        client_max_body_size 8192M;
        fastcgi_buffers 64 4K;
}

9.  回到用户home目录,运行start-nginx.sh,以启动nginx反向代理

$ ./start-nginx.sh

10. 查看Nginx是否已经成功执行,如果看到类似如下信息,说明nginx已经成功执行

$ docker ps -a | grep nginx
748f5c9624ff        nginx               "nginx -g 'daemon of…"   3 hours ago         Up 3 hours          80/tcp, 0.0.0.0:20443->20443/tcp    ngin

11. 最后,打开浏览器,地址栏中输入https://<your-ip>应该就能看到NextCloud的页面了。

七、 其他问题

1.  查看log的方法,使用如下命令查看特定容器的log信息:

$ docker logs <container-name>

例如,查看mysql容器的log:

$ docker logs mysql

2. 停止容器的方法

$ docker stop <container-name>

3. 删除容器的方法

$ docker rm <container-name>

 

上一篇:原创完全免费NPS内网穿透


下一篇:一看就懂!基于Docker+NextCloud搭建个人云盘