Docker-compos部署nextcloud私有网盘
系统版本:centos 7.9
docker 版本:20.10.7
docker-compose 版本:1.29.2
1、docker环境部署:
常规动作关闭selinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && setenforce 0
注意:有些文档还提示需要关闭防火墙,但是通过实验发现,并不需要,具体原因,将在后面说明
安装docker,设置开机自启
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce -y
systemctl restart docker
systemctl enable docker
查看docker信息
docker version
配置docker国内镜像加速
创建或修改 /etc/docker/daemon.json 文件,修改为如下形式
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
重启docker服务
systemctl daemon-reload
systemctl restart docker
查看是否成功
docker info
配置docker-compose环境
curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose #直接从github下载可能失败,可自行下载完成后,进行上传#
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
2、nextcloud的部署
前面已经将环境部署完成,因为是通过docker-compose进行部署,所以接下来是配置yml文件
创建docker-compose.yml 文件,内容如下:
version: '3'
services:
mysql:
image: mysql
container_name: mysql
restart: always
volumes:
- ./db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=配置mysql Root账户密码
- MYSQL_USER=配置mysql的新账户
- MYSQL_PASSWORD=配置mysql新账户的密码
- MYSQL_DATABASE=配置nextcloud数据库
networks:
- nextcloud-net
nextcloud:
image: nextcloud
container_name: nextcloud
restart: always
ports:
- 8888:80
links:
- mysql
- redis
volumes:
- ./data:/var/www/html
networks:
- nextcloud-net
redis:
image: redis:5.0.8
container_name: redis
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
- ./redis/data:/data
command:
redis-server /usr/local/etc/redis/redis.conf
networks:
- nextcloud-net
networks:
nextcloud-net:
driver: bridge
创建存储目录,与redis所需的conf文件,
mkdir -p /nextcloud/redis
vim /nextcloud/redis/redis.conf
daemonize no
timeout 0
requirepass 123456
bind 0.0.0.0
port 6379
appendonly yes
dir /data
通过docker-compose部署nextcloud、MySQL与redis
docker-compose up -d
部署完成,查看容器状态
docker ps -a
然后通过宿主机的外网ip和端口访问nextcloud,对nextcloud进行相应配置,数据库选择mysql,输入相对应的信息
等nextcloud配置完成后,将会自动进行系统。
3、简单优化
增加redis缓存
进入nextcloud容器存储目录,修改config.php文件,在'memcache.local' => '\\OC\\Memcache\\APCu', 条目后面增加以下内容:
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
'host' => 'redis',
'port' => 6379,
'password' => '123456',
),
配置完成后,在web页面对nextclolud进行操作后,可在redis容器目录下面,看到生成appendonly.aof文件,说明缓存已经生效。
上传速度优化
通过docker exec -u www-data -it nextcloud bash 进入nextcloud容器, -u www-data表示通过www-data用户进入容器,如果直接登录容器,执行命令将提示权限问题,执行php occ config:app:set files max_chunk_size --value 0命令,解除块大小限制。
配置自动清理回收站
进入nextcloud容器存储目录,修改config.php文件,增加 'trashbin_retention_obligation' => 'auto,3', 条目。
auto,3即为超过3天自动清理
保存后等待下一次Cron生效
容器的外网访问控制
前面有讲,防火墙没有关闭,但是为什么nextclou所使用的8888端口还是可以访问,查看firewall规则可看未放行8888端口,是什么原因呢
因为docker的访问规则都是通过iptables实现,查看iptables规则可以发现有一个docker的链,docker直接在iptables上进行网络地址转换与端口开放。
那如果对docker进行访问控制呢,增加以下iptables规则,实现特定主机的访问权限
iptables -I DOCKER -p tcp --dport 80 -j DROP
iptables -I DOCKER -s 192.168.70.250 -p tcp --dport 80 -j ACCEPT
注意:服务器重启后,因iptables服务时, docker服务还未启动,所以DOCKER规则链还未创建,所以需要通过systemctl restart iptables或者iptables-restore < /etc/sysconfig/iptables 加载配置文件,实现访问控制