基于Docker的LAMP环境部署Nextcloud搭建私有云

作者 by Stuart / 2022-01-07 / 2 评论 / 160 个足迹

环境

VPS,KVM虚拟化,系统为Debian 10

总述

使用Docker快速、模块化部署nextcloud搭建私有云。

安装Docker CE

更新软件源并安装必要软件

apt-get update
apt-get install ca-certificates curl gnupg lsb-release

添加官方的GPG密钥

 curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

添加稳定版软件源

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null 

再次更新软件源并安装Docker CE

apt-get update
apt-get install docker-ce docker-ce-cli containerd.io

前期准备

创建目录备用,并创建网桥

 mkdir /home/apache/site #映射Apache网页根目录与PHP-FPM根目录
 mkdir /home/apache/conf #映射配置文件
 mkdir /home/apache/a2log #映射日志文件
 docker network create nextcloud #创建网桥

安装数据库

这里选用和MySQL几乎完全兼容的MariaDB
拉取MariaDB数据库镜像(默认为最新版镜像)

docker pull mariadb

运行MariaDB容器

docker run --detach --name mariadb-server --env MARIADB_USER=MariaDB用户 --env MARIADB_PASSWORD=MariaDB用户密码 --env MARIADB_ROOT_PASSWORD=数据库Root密码 -p 3306:3306 --network nextcloud --restart=always mariadb:latest

P.S.容器名与MariaDB用户、MariaDB用户密码、数据库Root密码以及端口映射均随意就好,3306是MySQL的默认端口;-p为手动指定端口映射,-P为将容器内部端口映射到主机随机端口;
查看容器以及运行状态

docker ps -a

输出如下

CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS          PORTS                                       NAMES
容器ID   mariadb:latest   "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mariadb-server

登录数据库,这里选择直接进入MariaDB的docker内操作,当然也可直接在物理机跑一个mysql-client或者别的啥花活,均可,SQL语句以分号";"结束;

docker exec -it 容器名称mariadb-server或容器ID bash
mariadb -uroot -p
#输入数据库Root密码
select version();#查看版本,结果如下
MariaDB [(none)]> select version();
+-------------------------------------+
| version()                           |
+-------------------------------------+
| 10.6.5-MariaDB-1:10.6.5+maria~focal |
+-------------------------------------+
1 row in set (0.001 sec)

MariaDB [(none)]> 

It works!
创建数据库以及用户并授权

create database nextcloud_DB;
create user "nextcloud"@"%" identified by "NCDB_Password";#创建一个不限制主机的用户nextcloud,密码NCDB_Password
grant all privileges on nextcloud_DB.* to "nextcloud"@"%";#对于上述用户授予nextcloud_DB数据库中所有表的所有权限
flush privileges;#刷新权限
exit;#退出数据库

修改参数

cd /etc/mysql/
SET GLOBAL innodb_read_only_compressed=OFF;
exit#退出容器

拉取apache镜像并创建容器

docker pull httpd:latest
docker run -p 80:80 -p 443:443 -v /home/apache/site/:/usr/local/apache2/htdocs/ -v /home/apache/a2log/:/usr/local/apache2/logs/  -itd --network nextcloud --name apache-server httpd:latest 

拉取PHP-fpm镜像并创建容器

docker pull php:8.0.14-fpm-buster
docker run -itd --name php-fpm --network nextcloud -v /home/apache/site/:/var/www/html/ php:8.0.14-fpm-buster

复制出httpd.conf并修改httpd.conf,去掉注释,使apache加载mod,并将修改完成的配置文件以及补充的配置文件复制回docker中

docker cp apache-server:/usr/local/apache2/conf/httpd.conf /home/apache/conf
cd /home/apache/conf
vim httpd.conf

去掉这两行的注释

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

追加一条加载项到配置文件中

echo "Include conf/extra/fpm-config.conf">>httpd.conf

新建fpm-config.conf

vim /home/apache/conf/fpm-config.conf

fpm-config.conf文件内容如下

<Virtualhost *:80>
DocumentRoot /usr/local/apache2/htdocs/
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php-fpm容器的IP地址:9000/var/www/html/$1
DirectoryIndex /index.php index.php
</VirtualHost>

其中php-fpm容器的IP地址可以通过docker network inspect nextcloud查看
将修改完成的httpd.conf以及补充的fpm-config.conf复制回容器内

docker cp /home/apache/conf/httpd.conf apache-server:/usr/local/apache2/conf/
docker cp /home/apache/conf/fpm-config.conf apache-server:/usr/local/apache2/conf/extra/

创建index.php,使用phpinfo函数测试php-fpm是否工作正常

cd /home/apache/site
vim index.php

内容如下

<php?
phpinfo();
?>

使用浏览器访问80端口,phpinfo正常工作如图所示
 title=
测试完成后删除index.php

安装nextcloud

使用官方脚本方式直接安装,至于为啥不使用docker.....详见后记

cd /home/apache/site
wget https://download.nextcloud.com/server/installer/setup-nextcloud.php  --no-check-certificate

浏览器访问http://ip地址/setup-nextcloud.php
如图所示,开始安装向导;
 title=
输入.使用当前目录,或者随意创建个二级目录;
 title=
安装完成,开始配置;
 title=
配置填写如图所示即可,数据的IP地址可以使用docker network inspect nextcloud来查看;
 title=
是否安装推荐的APP,视喜好而定;
 title=
完事,它跑起来了.jpg
 title=

后记

至于为啥会选择其他组件都使用docker而nextcloud直接使用脚本安装在物理机呢.....因为docker跑nextcloud-fpm会遇到神秘问题,apache截至安装完成都一切正常,但是在安装完成后,本应跳转到推荐的APP时,会直接报错,且没有错误日志。apache php-fpm均工作正常,apache日志显示所有正常收到访问请求并处理,但是访问nextcloud肯定报错Internal Server Error,具体原因未知,回头慢慢摸罢......
为啥不换成Nginx或者all in one的nextcloud-apache镜像?前面和这玩意死磕太久,累了Orz

Reference

https://cwiki.apache.org/confluence/display/HTTPD/PHP-FPM
https://docs.docker.com/engine/reference/commandline/docker/

独特见解

 评论 2 条
    • Asuku

      2022-01-08 07:06

       

      我是觉得既然docker了那就尽可能都放在docker上比较好?:不高兴: