使用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 參數),最後點擊完成設置的按鈕即可。

六、 部署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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章