【docker】 docker部署minio对象存储并用rclone同步
docker部署minio对象存储并用rclone同步
1.什么是minio?
minio是一个开源的对象存储服务器,兼容S3协议。
官网:https://min.io/
官方在开源的基础上也提供云端S3服务,分为个人和企业,有不同的收费标准。
1.1 自建对象存储的好处?
当然,本文写下来肯定不是让你去买它的对象存储服务的,而是在我们自己的服务器/Nas上部署一个minio的docker,来拥有一个我们自己的对象存储服务器!
对象存储服务器可以用来做图床、静态资源缓存,亦或者是直接当作一个网盘来使用。
自建的对象存储的好处是所有源文件我们都能亲手管理,且无需为付费的对象存储的奇怪的计价文档感到手足无措,也不需要担心有人恶意刷流把你一套房子给套走。
缺点就是,自建的稳定性肯定不如已有厂家提供的服务,且自购的服务器/Nas上传带宽一般都很低,文件一多,访问速度就很慢了。
对于我个人而言,自建minio的唯一作用,就是备份七牛云/阿里云对象存储中的文件。考虑到2023下半年,各大厂接连boom云服务,国外的谷歌还出现了云盘里面用户的数据回滚到几月前的恶性问题,这可是可能导致用户数据丢失的大问题啊!
所以,将数据在自己本地留一份总是安心一些。数据安全靠的是备份,不是云服务厂家给你提供的99.99999%
可用性的一面之词。
如果你对数据备份这个话题感兴趣,可以看看我的另外一篇博客:谈谈如何进行有效数据备份,3+2+1
温馨提醒:如果你想在云服务器上安装minio来备份已有S3中的文件的话,最好是使用一个和已有S3不在同一个地域、非同一个服务商的云服务器,避免某些服务商云服务器和对象存储一起boom的情况……
2.docker安装minio
2.1 安装docker
docker安装的教程详见我的另外一篇博客
【Docker】deepin/centos安装docker | 慕雪的寒舍
2.2 安装minio
这里推荐使用由VMware维护的minio docker版本bitnami/minio
,更新很频繁。
hub.docker.com/r/bitnami/minio
创建容器的命令如下,非常简单
docker run -it -d --name minio \
-p 9000:9000 \
-p 9001:9001 \
--restart=always \
-v /minio/data:/bitnami/minio/data \
-e MINIO_ROOT_USER="minio_root" \
-e MINIO_ROOT_PASSWORD="minio_123456" \
bitnami/minio:latest
该创建容器操作基于如下hash的docker镜像(更新于2023-12-12),创建容器的命令后续可能会有变动,请参考docker-hub中的官方文档
bitnami/minio latest 552af9bd3d6d 2 days ago 212MB
对这个docker命令进行解释
-it -d
,it提供交互能力,d代表后台运行--restart=always
,始终重启docker(docker服务重启后,镜像会自动启动)-p 9000:9000
,将docker内的9000端口(右侧)映射给宿主机(左侧)的9000端口,端口9001的映射同理。- 容器内9000端口是minio的api端口(用于S3协议操作)
- 容器内9001端口是minio的web管理界面端口
- 根据你的需要,修改冒号左侧的宿主机端口即可。
-v /minio/data:/data
,将docker内/data
路径映射给主机/minio/data
路径,主机上的路径(左侧)请自行修改- 两个
-e
设置的是环境变量,分别设置的是minio管理员的账户和管理员的密码,请注意,在这里配置了用户名和密码后,进入minio管理系统的密码无法被修改。如果你的minio服务需要暴露在公网上,请一定要设置一个高强度的密码! - 最后的
bitnami/minio:latest
代表我们需要创建bitnami/minio
docker的latest版本,如果本地没有这个镜像,则会自动去dockerhub拉取。
顺带一提,在我这边测试发现,如果你错误使用浏览器访问了9000这个api端口,会被自动重定向到9001web管理端口(前提是映射的宿主机端口和docker内端口一致)
如下是我在一个没有安装过minio的云服务上测试的结果,成功安装并启动minio
[root:~/docker]# docker run -it -d --name minio \
> -p 19000:9000 \
> -p 19001:9001 \
> --restart=always \
> -v /root/docker/minio:/bitnami/minio/data \
> -e MINIO_ROOT_USER="minio_root" \
> -e MINIO_ROOT_PASSWORD="minio_123456" \
> bitnami/minio:latest
Unable to find image 'bitnami/minio:latest' locally
latest: Pulling from bitnami/minio
ef5975039511: Pull complete
Digest: sha256:3bb81d101dea57a5382a2d01eda6991e75ce69669d2d49c4646d82721b7c258e
Status: Downloaded newer image for bitnami/minio:latest
afefbb9514de0f4a1c02b7f4212b1e05eee5ef342ed4ce27e03de10071914060
容器正常启动,处于Running状态,STATUS正常!
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
afefbb9514de bitnami/minio:latest "/opt/bitnami/script…" 3 minutes ago Up 3 minutes 0.0.0.0:19000->9000/tcp, :::19000->9000/tcp, 0.0.0.0:19001->9001/tcp, :::19001->9001/tcp minio
如果你卡在了pull镜像的步骤,请自行百度如何替换docker的镜像源。
2.3 web管理
使用 http://IP:端口
打开minio的9001端口对应的宿主机端口,访问minio的web管理页面。输入刚刚创建容器时,在环境变量里面配置的用户名和密码进行登录,即可进入控制台。
minio的界面比较简单,基本要做的操作只有两个,创建bucket存储桶,和accesskey用于api调用。
更高阶的配置项和操作我没有尝试过,请自行参考minio的文档或者其他教程。
2.3.1 创建bucket
第一个界面就是大大的bucket存储桶,在这里我们可以创建对应的存储桶
点击创建bucket,会进入如下配置项,除了bucket的名字,还有三个选项
- Versioning:版本控制,开启后,该bucket将处于多版本模式下,文件会保留修改的历史记录。
- Object Locking:避免文件被删除,需要支持保留和合法保留(这两个啥意思我不明白),该选项只能在bucket创建时打开。
- Quota:限制容器中文件大小(总容量)
对于我的备份需求来说,这三个额外选项都不需要,直接创建就行了
创建之后,在bucket页面可以看到刚刚创建的test存储桶,这里会统计存储容量和文件数量
2.3.2 创建accessKey
accessKey是用于操作api的token凭证。创建完毕后,他只会显示一次,后续将不会显示出来。
如果你不想创建太多个密钥,那就把这个密钥的文件下载下来,免得到时候不知道是什么了。点击右下角的import文件就可以下载,会下载一个json
文件,内部包含密钥和其他一些相关信息
因为我这只是做个测试,一会就会把这个minio的docker删除,所以展示密钥无所谓。如果你是在生产环境下使用,请一定不要暴露你的密钥给任何人。
{
"url": "http://公网IP:19001/api/v1/service-account-credentials",
"accessKey": "aXpBxrUceV30Id6gOouG",
"secretKey": "dIWl9IFL05UtaI08PZfPXE66zPGu2zWrGFfSTaUm",
"api": "s3v4",
"path": "auto"
}
密钥创建完毕,就能在列表看到它。
3.rclone备份
rclone是一个全平台的命令行工具,其可以用于多种云端/本地存储之间的数据拷贝、同步、加密同步等功能。详见rclone官网:rclone.org
因为我的目标就是我的七牛云bucket里面的图床文件备份到本地,rclone绝对是不二之选。
3.1 进入docker容器内终端
你可以选择在宿主机上安装rclone,也可以选择直接在minio的容器内安装rclone。但是需要注意,如果在minio的容器内安装,那么minio容器被删除后,rclone和它的配置文件自然也不在了。
参考:以指定用户启动和进入docker容器 - langyong - 博客园 ,使用ssh链接宿主机,然后使用如下docker命令进入minio的容器终端中。
docker exec -it -u 用户名 容器名 /bin/bash
# 示例如下
docker exec -it -u root minio /bin/bash
如果你使用的是绿联、极空间这类不太方便进入ssh的nas,可以在nas的docker管理页里面操作,如下图所示,选择/bin/bash
后点击链接即可进入容器内终端。
3.2 下载安装rclone
进入终端后,默认所在路径是docker容器的工作路径/opt/bitnami/minio-client
。
为了避免影响容器运行,我们不要在工作路径里面做操作,请使用如下命令,创建一个新的rclone文件夹,进入root用户的家目录进行操作。
mkdir /root/rclone
cd /root/rclone
你可以在创建minio容器的时候,就把
/root/rclone
路径给映射到宿主机上,方便后续查看rclone备份的日志。
下载安装rclone的命令如下
curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
cd rclone-*-linux-amd64
sudo cp rclone /usr/bin/
sudo chown root:root /usr/bin/rclone
sudo chmod 755 /usr/bin/rclone
minio的docker内没有unzip命令,需要安装一下
apt-get update && apt-get install unzip
minio的docker内也没有sudo,将上述安装命令中的sudo去掉就可以了。
完成安装命令后,执行一下rclone
,出现rclone命令的使用提示,那就是安装成功了!
root@878a0dd03ec4:/root/rclone/rclone-v1.65.0-linux-amd64# rclone
Usage:
rclone [flags]
rclone [command]
...
3.3 rclone对象存储配置
rclone的官网上有不同云端存储协议和不同S3服务商的配置教程,跟着官方的来就可以了。
执行rclone config
命令,工具会自动在/.config/rclone/rclone.conf
下创建一个config文件,你可以根据官方的向导,在此处添加新的remote
root@878a0dd03ec4:/root/rclone/rclone-v1.65.0-linux-amd64# rclone config
2023/12/14 04:38:44 NOTICE: Config file "/.config/rclone/rclone.conf" not found - using defaults
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q> q
下面给出minio和七牛云的配置文件,你可以直接修改这个配置文件中的内容为你的配置,然后写入/.config/rclone/rclone.conf
即可。
其中minio的region在minio的控制台里面可以修改,如果你没有修改过,默认使用的是us-east-1
。因为rclone是直接在minio的docker里面执行的,所以endpoint只需要写成127.0.0.1
和minio的api端口9000就可以了。
如果你的minio在公网或者其他设备上,请修改对应的IP地址和端口。
七牛云的region和endpoint在七牛云bucket页面找到S3域名就可以看到。
请注意,七牛云/阿里云这类存储服务商,如果你有多个bucket,且他们的地域不一样,则需要新增对应地域的配置项。通过修改
[]
里面的配置名进行区分。
[minio]
type = s3
provider = Minio
env_auth = false
access_key_id = 控制台获取的key_id
secret_access_key = 控制台获取的secret_key
region = us-east-1
endpoint = http://127.0.0.1:9000
location_constraint =
server_side_encryption =
[qiniu]
type = s3
provider = Qiniu
access_key_id = 七牛云控制台获取key_id
secret_access_key = 七牛云控制台获取secret_key
region = cn-east-1
endpoint = s3-cn-east-1.qiniucs.com
location_constraint = cn-east-1
acl = private
storage_class = STANDARD
执行如下命令,安装nano编辑器,然后使用nano编辑器打开rclone配置文件进行编辑。
apt-get update && apt-get install -y nano
nano /.config/rclone/rclone.conf
linux下的粘贴命令是CTRL+SHIFT+V
或CTRL+INSERT
,你可以在本地修改了配置文件后,通过nano编辑器,直接粘贴到docker容器内。编辑完毕后,使用CTRL+X
退出nano的编辑模式,并按Y确认保存,随后直接回车,即完成编辑。
3.4 rclone基本命令
copy
拷贝命令如下,配置名称是在config文件中[]
里面的文字,桶名就是你的S3服务里面的对象存储桶,还可以在桶名后面用/
来追加指定上传的路径。
rclone copy 本地文件路径 配置名称:桶名
rclone copy 本地文件路径 配置名称:桶名/桶内目录
这里我在docker内创建了一个test.txt
文件,尝试将其拷贝到minio里面。
touch test.txt
rclone copy ./test.txt minio:1panel-bak
命令没有错误输出,即拷贝成功!
root@878a0dd03ec4:/root/rclone# touch test.txt
root@878a0dd03ec4:/root/rclone# rclone copy ./test.txt minio:1panel-bak
root@878a0dd03ec4:/root/rclone#
尝试在拷贝的时候指定远端仓库内的路径
rclone copy ./test.txt minio:qiniu-muxue-sy/test
成功指定,文件被上传到了test文件夹里面。
sync
备份命令如下,可以在任意目的地(本地-远端,远端-本地,远端-远端)里面执行这个命令,左侧是源路径,右侧是目标。
rclone sync 本地源文件路径 目的地配置名称:桶名
rclone sync 源配置名称:桶名 目的地配置名称:桶名
rclone sync 源配置名称:桶名 目的地的本地文件路径
rclone sync有两个常用的选项,刚开始使用的时候,建议带上 --dry-run
命令来确认自己的配置没有问题
-P
显示详细同步进度条--dry-run
用作命令测试,不会真正的执行同步
指定-P
命令后的进度输出如下,可以看到实时网速和文件数量/大小。
目前发现的问题是minio显示的文件总量和数据存储量会有一定滞后,刚开始我还以为是rclone没有跑完呢,sync完毕过了几分钟minio里面才刷出正确的文件数量来。
3.5 cron定时同步
部分nas品牌的系统(比如群晖)已经提供了执行定时脚本的功能,这种情况下直接使用系统提供的定时任务来执行rclone sync
即可,无需额外安装其。
- 群晖官网关于定时任务的说明: https://kb.synology.cn/zh-cn/DSM/help/DSM/AdminCenter/system_taskscheduler?version=6
- 绿联nas的环境中已有crontab,但我没有试过使用它。考虑到绿联这个nas的系统还是一点都不稳定,还是别动它的系统里面的东西了,不知道绿联官方有没有可能把定时任务加到控制页里面去吧(我估计是没戏,这个系统的限制太多了)。
在minio的docker里面直接安装crontab服务和nano文本编辑器
apt-get update
apt-get install -y cron nano
安装完毕后,使用crontab -e
看看是否能打开crontab的配置编辑页面,如果可以打开如下配置界面,则代表cron安装成功。
这个配置文件需要写入的格式如下,一行对应一个配置。
五位cron表达式 需要执行的命令
cron表达式可以百度搜一下,因为很少用,我也不太了解cron表达式的编写逻辑。
对于rclone的sync备份而言,写入如下内容即可;
0 3 * * 1,5 rclone sync qiniu-e1:muxue-sy minio:qiniu-muxue-sy >> /root/rclone/rclone-sy.log 2>&1
0 2 * * 1,5 rclone sync qiniu-e2:muxue-img minio:qiniu-muxue-img >> /root/rclone/rclone-img.log 2>&1
解析如下
0 3 * * 1,5
代表每周一和周五的凌晨3点执行一次0 2 * * 1,5
代表每周一和周五的凌晨2点执行一次>> /root/rclone/rclone-img.log 2>&1
代表将rclone命令的输出结果写入到/root/rclone/rclone-img.log
文件中。
写入完毕后,CTRL+X
关闭nano编辑模式,按Y和回车即完成nano编辑。编辑完成后会有如下输出。
root@878a0dd03ec4:/root/rclone# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
后续crontab执行的命令结果都会输入到这两个指定的日志文件中。rclone命令只有在出现ERROR的时候才会输出。如果这个文件里面什么都么有,就代表运行没有出错!
请注意,minio的docker中时区是UTC标准时间,所以你定义的cron表达式的执行时间可能和东八区时间不一致。
配置好了之后,使用如下命令启动cron服务
service cron start
执行效果如下
root@878a0dd03ec4:/root/rclone# service cron start
Starting periodic command scheduler: cron.
可以用如下命令查看cron服务状态
root@878a0dd03ec4:/root/rclone# service cron status
cron is running.
优化日志
为了让日志更加合理,可以在执行rclone命令之前,打印当前时间,这样可以知道crontab到底有没有正常执行定时任务。
打印时间的基本命令如下,echo命令会将当前时间和相关的说明信息写入log.txt
文件中
echo "$(date '+%Y-%m-%d %H:%M:%S') This is a test command" >> log.txt
执行效果如下
root@878a0dd03ec4:/root/rclone# echo "$(date '+%Y-%m-%d %H:%M:%S') This is a test command" >> log.txt
root@878a0dd03ec4:/root/rclone# cat log.txt
2023-12-14 03:44:32 This is a test command
这里有另外一个问题,即docker内部的时区使用的是UTC标准时区,而不是东八区。为了避免影响minio容器的执行,建议不要直接修改docker内系统时区,而是采用临时修改环境变量的方式打印东八区的时间。
echo "$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S') 这是东八区" >> log.txt
执行效果如下,命令直接粘贴到命令行里面,中文出现了乱码,不过文件里面的时间和中文都是正常的;这里只是做一个演示,实际执行的时候,建议使用全英文的echo输出,避免像这样的乱码问题。
root@878a0dd03ec4:/root/rclone# echo "$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S') \350\277\231\346\23
0\257\344\270\234\345\205\253\345\214\272" >> log.txt
root@878a0dd03ec4:/root/rclone# cat log.txt
2023-12-14 11:45:31 这是东八区
将如上的crontab命令改成如下形式,使用&&
来链接echo和rclone命令,这样在每次执行rclone之前都会有一个当前时间和sync的是什么内容的的输出,能让我们知道crontab是否正常执行。
0 3 * * 1,5 echo "$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S') sync muxue-sy" >> /root/rclone/rclone.log && rclone sync qiniu-e1:muxue-sy minio:qiniu-muxue-sy >> /root/rclone/rclone.log 2>&1
0 2 * * 1,5 echo "$(TZ='Asia/Shanghai' date '+%Y-%m-%d %H:%M:%S') sync muxue-img" >> /root/rclone/rclone.log && rclone sync qiniu-e2:muxue-img minio:qiniu-muxue-img >> /root/rclone/rclone.log 2>&1
你可以修改cron表达式的前2位(对应的是分钟和小时),以及第五位的星期几,让crontab表达式立即执行一次,确认一下输出是否正确。
每次修改配置文件后,都需要重启cron服务!
service cron restart
The end
本文的教程结束,有问题欢迎在评论区提出。
数据无价,多一份备份,多一份安心
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!