【docker】部署minio对象存储并用rclone同步

news2024/9/22 5:35:35

docker部署minio对象存储并用rclone同步

本文首发于 ❄️慕雪的寒舍

1.什么是minio?

minio是一个开源的对象存储服务器,兼容S3协议。

官网:https://min.io/

官方在开源的基础上也提供云端S3服务,分为个人和企业,有不同的收费标准。

5ae0c978272b7ca6732817920adae0f5.png

1.1 自建对象存储的好处?

当然,本文写下来肯定不是让你去买它的对象存储服务的,而是在我们自己的服务器/Nas上部署一个minio的docker,来拥有一个我们自己的对象存储服务器!

对象存储服务器可以用来做图床、静态资源缓存,亦或者是直接当作一个网盘来使用。

自建的对象存储的好处是所有源文件我们都能亲手管理,且无需为付费的对象存储的奇怪的计价文档感到手足无措,也不需要担心有人恶意刷流把你一套房子给套走。

缺点就是,自建的稳定性肯定不如已有厂家提供的服务,且自购的服务器/Nas上传带宽一般都很低,文件一多,访问速度就很慢了。

对于我个人而言,自建minio的唯一作用,就是备份七牛云/阿里云对象存储中的文件。考虑到2023下半年,各大厂接连boom云服务,国外的谷歌还出现了云盘里面用户的数据回滚到几月前的恶性问题,这可是可能导致用户数据丢失的大问题啊!

  • 谷歌公布方案,修复 Drive 云盘文件丢失问题
  • 谷歌承认云端硬盘Google Drive存在BUG,3月内用户文件可能丢失

所以,将数据在自己本地留一份总是安心一些。数据安全靠的是备份,不是云服务厂家给你提供的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" \
	-e TZ='Asia/Shanghai' \
	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:/bitnami/minio/data,将docker内/bitnami/minio/data路径映射给主机/minio/data路径,主机上的路径(左侧)请自行修改;这个路径是bucket和minio配置文件的存储路径。
  • 两个-e设置的是环境变量,分别设置的是minio管理员的账户和管理员的密码。请注意,在这里配置了管理员用户名和密码后,进入minio管理系统的密码无法被修改。如果你的minio服务需要暴露在公网上,请一定要设置一个高强度的密码!
  • -e TZ='Asia/Shanghai' 设置时区为东八区(后续定时备份需要有正确时区)
  • 最后的bitnami/minio:latest代表我们需要创建bitnami/minio这个docker镜像的latest版本,如果本地没有这个镜像,则会自动去docker-hub拉取。
  • 如果你卡在了pull镜像的步骤,请自行百度如何替换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

这样还不够,请在后续创建了bucket并上传测试文件后,查看本地映射的路径中是否有对应文件夹和文件,避免路径映射失败!(如果路径没有成功映射到本地,那么你当前创建的minio被删除之后,文件就很难找回来了)

顺带一提,在我这边测试发现,如果你错误使用浏览器访问了9000这个api端口,会被自动重定向到9001 web管理页面端口(前提是映射的宿主机端口和docker内端口一致)

2.3 web管理

使用 http://IP:端口 打开minio的9001端口对应的宿主机端口,访问minio的web管理页面。输入刚刚创建容器时,在环境变量里面配置的用户名和密码进行登录,即可进入控制台。

image.png

minio的界面比较简单,基本要做的操作只有两个,创建bucket存储桶,和accesskey用于api调用。

更高阶的配置项和操作我没有尝试过,请自行参考minio的文档或者其他教程。

2.3.1 创建bucket

第一个界面就是大大的Object Browser,在这里我们可以创建存储桶

image.png

点击创建bucket,会进入如下配置项,除了bucket的名字,还有三个选项

  • Versioning:版本控制,开启后,该bucket将处于多版本模式下,文件会保留修改的历史记录。
  • Object Locking:避免文件被删除,需要支持保留和合法保留(这两个啥意思我不明白),该选项只能在bucket创建时打开。
  • Quota:限制容器中文件大小(总容量)

对于我的备份需求来说,这三个额外选项都不需要,直接创建就行了

image.png

创建之后,在bucket页面可以看到刚刚创建的test存储桶,这里会统计存储容量和文件数量

image-20231213232421462

2.3.2 创建accessKey

accessKey是用于操作api的token凭证。创建完毕后,他只会显示一次,后续将不会显示出来。

image.png

如果你不想创建太多个密钥,那就把这个密钥的文件下载下来,免得到时候不知道是什么了。点击右下角的import文件就可以下载,会下载一个json文件,内部包含密钥和其他一些相关信息

image.png

因为我这只是做个测试,一会就会把这个minio的docker删除,所以展示密钥无所谓。如果你是在生产环境下使用,请一定不要暴露你的密钥给任何人。

{
    "url": "http://公网IP:19001/api/v1/service-account-credentials",
    "accessKey": "aXpBxrUceV30Id6gOouG",
    "secretKey": "dIWl9IFL05UtaI08PZfPXE66zPGu2zWrGFfSTaUm",
    "api": "s3v4",
    "path": "auto"
}

密钥创建完毕,就能在列表看到它。

image.png

3.rclone备份

rclone是一个全平台的命令行工具,其可以用于多种云端/本地存储之间的数据拷贝、同步、加密同步等功能。详见rclone官网:rclone.org

因为我的目标就是我的七牛云bucket里面的图床文件备份到本地,rclone绝对是不二之选。

3.1 进入docker容器内终端

你可以选择在宿主机上安装rclone,也可以选择直接在minio的容器内安装rclone。

前排提醒:部分nas品牌的系统(比如群晖)已经提供了执行定时脚本的功能,这种情况下直接使用系统提供的定时任务来执行rclone sync即可,即直接在nas里面安装rclone和使用定时任务,不要在minio的docker里面安装rclone。

如你选择了在宿主机上安装rclone,则可以直接跳过本3.1步骤,阅读3.2及后续步骤

docker特权模式

注意,如果在minio的容器内安装rclone,那么minio容器被删除后,rclone和它的配置文件自然也不在了

且如果需要用minio的容器进行crontab定时任务,则必须用特权模式安装minio的docker,在minio的docker创建命令里面加如下这条,设置特权模式(不需要定时任务可以不设置)。

--privileged

在绿联nas的docker管理界面,创建docker的时候给定所有权限,也是一样的效果。(因为我不太了解这里具体每个权限的作用,干脆全给了)

image.png

image.png

ssh连接宿主设备

不同nas机型进入ssh的方式不太一样,请参考你的nas或设备品牌搜索对应类型教程。

连接到宿主设备的ssh后,参考:以指定用户启动和进入docker容器 - langyong - 博客园 一文,使用如下docker命令进入minio的容器终端中。

docker exec -it -u 用户名 容器名 /bin/bash
# 示例如下
docker exec -it -u root minio /bin/bash

如果你使用的是绿联、极空间这类不太方便进入ssh的nas,可以在nas的docker管理页里面操作,如下图所示,选择/bin/bash后点击链接即可进入容器内终端。

image.png

3.2 下载安装rclone

进入终端后,默认所在路径是docker容器的工作路径/opt/bitnami/minio-client

为了避免影响容器运行,我们不要在工作路径里面做操作,请使用如下命令,创建一个新的rclone文件夹,进入root用户的家目录进行操作。

如果你是在宿主机上操作,也是一样的道理,为rclone单独创建一个文件夹,来存放它的软件包、配置文件、执行日志。

mkdir /root/rclone
cd /root/rclone

如果是docker内操作,你可以在创建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 -y 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即可。

  • rclone.org/s3/#minio
  • rclone.org/s3/#qiniu

其中minio的region在minio的控制台里面可以修改,如果你没有修改过,默认使用的是us-east-1。因为rclone是直接在minio的docker里面执行的,所以endpoint只需要写成127.0.0.1和minio的api端口9000就可以了。

如果你的minio在公网或者其他设备上,请修改对应的IP地址和端口。

七牛云的region和endpoint在七牛云bucket页面找到S3域名就可以看到。

image.png

请注意,七牛云/阿里云这类存储服务商,如果你有多个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+VCTRL+INSERT,你可以在本地修改了配置文件后,通过nano编辑器,直接粘贴到docker容器内。编辑完毕后,使用CTRL+X退出nano的编辑模式,并按Y确认保存,随后直接回车,即完成编辑。

image.png

image.png

这个配置文件建议备份一个,免得每次都得重新弄

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# 

image.png

尝试在拷贝的时候指定远端仓库内的路径

rclone copy ./test.txt minio:qiniu-muxue-sy/test

成功指定,文件被上传到了test文件夹里面。

image.png

sync

备份命令如下,可以在任意目的地(本地-远端,远端-本地,远端-远端)里面执行这个命令,左侧是源路径,右侧是目标。

rclone sync 本地源文件路径  目的地配置名称:桶名 
rclone sync 源配置名称:桶名 目的地配置名称:桶名
rclone sync 源配置名称:桶名 目的地的本地文件路径

rclone sync有两个常用的选项,刚开始使用的时候,建议带上 --dry-run 命令来确认自己的配置没有问题

  • -P 显示详细同步进度条
  • --dry-run 用作命令测试,不会真正的执行同步

指定-P命令后的进度输出如下,可以看到实时网速和文件数量/大小。

image.png

目前发现的问题是minio显示的文件总量和数据存储量会有一定滞后,刚开始我还以为是rclone没有跑完呢,sync完毕过了几分钟minio里面才刷出正确的文件数量来。

3.5 cron定时同步

前排提醒:部分nas品牌的系统(比如群晖)已经提供了执行定时脚本的功能,这种情况下直接使用系统提供的定时任务来执行rclone sync即可,无序安装其他服务。即直接在nas里面安装rclone和使用定时任务,不要在minio的docker里面安装rclone和cron。

  • 群晖官网关于定时任务的说明: https://kb.synology.cn/zh-cn/DSM/help/DSM/AdminCenter/system_taskscheduler?version=6
  • 绿联nas的环境中已有crontab,但我没有试过使用它。考虑到绿联这个nas的系统还是一点都不稳定,还是别动它的系统里面的东西了,不知道绿联官方有没有可能把定时任务加到控制页里面去吧(我估计是没戏,这个系统的限制太多了)。

如果你使用的是群晖、威联通等提供了执行定时任务的功能的nas,请在nas内配置好rclone后,自行百度执行定时任务相关教程。

minio docker内安装cron服务

下面介绍在minio的docker内cron服务的安装和使用。

在minio的docker里面直接安装crontab服务和nano文本编辑器

apt-get update
apt-get install -y cron nano

但这还不够,cron服务的运行还依赖于其他组件,需要一并安装。

apt-get install -y rsyslog  postfix
service rsyslog start

安装postfix的时候会提示让你选择配置文件,键入1选择无配置就够了。

image.png

postfix还需要额外配置,否则可能会遇到如下错误

Dec 16 01:07:01 878a0dd03ec4 postfix/sendmail[1859]: fatal: open /etc/postfix/main.cf: No such file or directory
Dec 16 01:12:02 878a0dd03ec4 postfix/postdrop[1912]: warning: unable to look up public/pickup: No such file or directory

配置命令如下

touch /etc/postfix/main.cf
mkfifo /var/spool/postfix/public/pickup

crontab配置定时任务测试

安装完毕后,使用crontab -e看看是否能打开crontab的配置编辑页面,如果可以打开如下配置界面,则代表cron安装成功。

image.png

这个配置文件需要写入的格式如下,一行对应一个配置。

五位cron表达式 需要执行的命令

cron表达式可以用在线工具crontab执行时间计算 - 在线工具

先用如下的配置来检测cron服务是否能正常运行,以及是否能成功输出日志

*/1 * * * * echo "$(date) This is a test command" >> /root/rclone/log.txt

该配置的含义是每分钟执行一次echo命令,打印当前时间和对应内容到/root/rclone/log.txt文件中。

修改了配置文件后,启动cron服务,测试我们的配置是否有效,cron服务是否能正常运行。

service cron start 

该命令执行效果如下

root@878a0dd03ec4:/root/rclone# service cron start
Starting periodic command scheduler: cron.

等待数分钟,看看cron命令是否成功输出内容到指定文件里面了,有内容则代表配置和运行成功!默认情况下,使用cron执行的echo命令内的date采用了UTC时间的输出,但这并不影响我们的使用,给小时加8就能得到东八区的时间了。

root@878a0dd03ec4:/root/rclone# cat /root/rclone/log.txt
Sat Dec 16 01:18:01 UTC 2023 This is a test command
Sat Dec 16 01:18:01 UTC 2023 This is a test command
Sat Dec 16 01:19:01 UTC 2023 This is a test command
Sat Dec 16 01:19:01 UTC 2023 This is a test command

在syslog里面也能看到cron的服务日志,该服务日志组件依赖于先前安装的rsyslog

cat /var/log/syslog

文件/var/log/syslog内部cron执行日志如下

Dec 16 01:25:01 878a0dd03ec4 CRON[2059]: (root) CMD (echo "$(date) This is a test command" >> /root/rclone/log.txt)
Dec 16 01:25:01 878a0dd03ec4 CRON[2058]: (root) CMD (echo "$(date) This is a test command" >> /root/rclone/log.txt)

请注意,默认情况下,minio的docker是没有时区配置的,请一定要在创建docker容器的时候,使用TZ环境变量来设置时区,否则crontab不会执行!
原因也很简单,cron表达式有一个指定时间,比如每周一执行、几点执行,如果没有配置时区,cron没有办法明确你的cron表达式到底应该什么时候跑,干脆就不跑了!

如果你的docker已经创建,不想重新创建,可以通过修改配置文件来设置时区,修改后重启docker容器即可。

nano /etc/environment
# 在文件末尾写入如下内容
TZ='Asia/Shanghai'

crontab配置定时rclone sync

确认cron服务可用,就可以来配置rclone sync的自动执行命令了。

对于rclone的sync备份而言,写入如下内容即可;

0 3 * * 1,5 rclone sync qiniu-e1:muxue-sy  minio:qiniu-muxue-sy >> /root/rclone/rclone.log 2>&1
0 2 * * 1,5 rclone sync qiniu-e2:muxue-img  minio:qiniu-muxue-img >> /root/rclone/rclone.log 2>&1

解析如下

  • 0 3 * * 1,5 代表每周一和周五的凌晨3点执行一次
  • 0 2 * * 1,5 代表每周一和周五的凌晨2点执行一次
  • >> /root/rclone/rclone.log 2>&1 代表将rclone命令的输出结果写入到 /root/rclone/rclone.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执行的命令结果都会输入到/root/rclone/rclone.log日志文件中。rclone命令只有在出现ERROR的时候才会输出。如果这个文件里面什么都么有,就代表运行没有出错!

配置好了之后,使用如下命令重新启动cron服务

service cron restart

用如下命令查看cron服务状态

root@878a0dd03ec4:/root/rclone# service cron status
cron is running.

优化日志

为了让日志更加合理,可以在执行rclone命令之前,打印当前时间,这样可以知道crontab到底有没有正常执行定时任务。

打印时间的基本命令如下,echo命令会将当前时间和相关的说明信息写入test.txt文件中

echo "$(date) This is a test command" >> test.txt

执行效果如下,打印了时间和对应的日志信息

root@878a0dd03ec4:/root/rclone# echo "$(date) This is a test command" >> test.txt
root@878a0dd03ec4:/root/rclone# cat test.txt
Sat Dec 16 09:36:06 CST 2023 This is a test command

再次提醒,minio的docker内必须指定TZ环境变量,否则crontab不会执行!且date命令时区和东八区不符。

echo打印的时候,可以临时指定TZ环境变量来打印不同时区的date

echo "$(TZ='Asia/Shanghai' date) 这是东八区" >> test.txt

执行效果如下,因为我的docker内已经设置了TZ环境变量为东八区,所以不加这个TZ也是打印的东八区的时间。

root@878a0dd03ec4:/root/rclone# echo "$(TZ='Asia/Shanghai' date) 这是东八区" >> test.txt
root@878a0dd03ec4:/root/rclone# cat test.txt
Sat Dec 16 09:36:06 CST 2023 This is a test command
Sat Dec 16 09:37:39 CST 2023 这是东八区

但是需要注意的是,使用cron命令执行的时候,它依旧会打印UTC时间,前文已经提到过了。

将原本的crontab命令改成如下形式(crontab -e编辑配置文件),使用&&来链接echo和rclone命令,这样在每次执行rclone之前都会有一个当前时间和sync的是什么内容的的输出,能让我们知道crontab是否正常执行。

0 3 * * 1,5 echo "$(TZ='Asia/Shanghai' date) 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) sync muxue-img" >> /root/rclone/rclone.log && rclone sync qiniu-e2:muxue-img  minio:qiniu-muxue-img >> /root/rclone/rclone.log 2>&1

你可以修改cron表达式为*/1 * * * *,让crontab表达式立即执行一次,确认一下输出是否正确,以及rclone命令是否正常执行。

*/1 * * * * echo "$(date) sync muxue-img" >> /root/rclone/rclone.log && rclone sync qiniu-e2:muxue-img  minio:qiniu-muxue-img >> /root/rclone/rclone.log 2>&1

我的测试结果如下,rclone sync成功被cron执行(这个ERROR是因为我的bucket里面有个无效的文件,正常情况下应该不会有ERROR)

Sat Dec 16 01:45:01 UTC 2023 sync muxue-img
2023/12/16 01:45:02 ERROR : : Entry doesn't belong in directory "" (same as directory) - ignoring

测试结束后,记得还原配置项

每次修改配置文件后,都需要重启cron服务!

root@878a0dd03ec4:/root/rclone# service cron restart
Restarting periodic command scheduler: cronStopping periodic command scheduler: cron.
Starting periodic command scheduler: cron.

The end

本文的教程结束,有问题欢迎在评论区提出。

数据无价,多一份备份,多一份安心

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1316355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux的权限(二)

目录 前言 文件类型和访问权限(事物属性) 补充知识 文件类型 文件操作权限 修改文件权限 chmod指令 文件权限值的表示方法 字符表示方法 8进制数值表示方法 权限有无带来的影响 修改文件角色 chown与chgrp指令 目录的rwx权限 补充知识 …

TensorFlow神经网络中间层的可视化

TensorFlow神经网络中间层的可视化 TensorFlow神经网络中间层的可视化1. 训练网络并保存为.h5文件2. 通过.h5文件导入网络3. 可视化网络中间层结果(1)索引取层可视化(2)通过名字取层可视化 TensorFlow神经网络中间层的可视化 1. …

nodejs+vue+微信小程序+python+PHP技术下的音乐推送系统-计算机毕业设计推荐

3.2.1前台用户功能 前台注册用户的功能如下: 注册登录:用户填写个人信息,并验证手机号码进行账户注册,注册成功后方可登录系统。 歌手介绍:用户可以在线进行歌手介绍信息查看等。 音乐库:用户可以在音乐库查…

Flink的处理函数

之前的流处理API,无论是基本的转换、聚合,还是更为复杂的窗口操作,其实都是基于DataStream进行转换的,所以可以统称为DataStream API。 在Flink更底层,我们可以不定义任何具体的算子(比如map,f…

Arrays.asList()方法:陷阱与解决之道

在Java编程中,Arrays类提供了一系列用于操作数组的实用方法。其中,​Arrays.asList()​方法是一个常用的方法,用于快速将数组转换为List集合。然而,这个方法存在一些潜在的陷阱,可能导致出现意外的行为。本文将介绍​A…

智能优化算法应用:基于和声算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于和声算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于和声算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.和声算法4.实验参数设定5.算法结果6.参考文献7.MA…

管理类联考——数学——真题篇——按知识分类——几何——解析几何

文章目录 解析几何2023真题(2023-07)-几何-解析几何-最值-画图求最值-两线相减求最大-联想三角形的“两边差小于第三边”,当为第三边为最大真题(2023-19)-几何-解析几何-最值-画图求最值-圆方程画出圆的形状-两点间距离…

Mr. Cappuccino的第67杯咖啡——MacOS通过PD安装Win11

MacOS通过PD安装Win11 下载ParallelsDesktop安装ParallelsDesktop激活ParallelsDesktop下载Windows11安装Windows11激活Windows11 下载ParallelsDesktop ParallelsDesktop下载地址 安装ParallelsDesktop 关闭上面的窗口,继续操作 激活ParallelsDesktop 关闭上面的…

在官网免费创建一个云mongoDB数据库

MongoDB的设计目标是提供高性能、高可用性、可扩展性和易用性。它采用了文档存储模型,将数据以类似JSON的BSON(Binary JSON)格式存储,并且支持动态模式,允许应用程序更灵活地存储和查询数据。MongoDB还支持水平扩展&am…

Postman接口测试工具使用总结

一、前言 在前后端分离开发时,后端工作人员完成系统接口开发后,需要与前端人员对接,测试调试接口,验证接口的正确性可用性。而这要求前端开发进度和后端进度保持基本一致,任何一方的进度跟不上,都无法及时…

three.js模拟太阳系

地球的旋转轨迹目前设置为了圆形&#xff0c;效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div c…

实操Nginx(七层代理)+Tomcat多实例部署,实现负载均衡和动静分离

目录 Tomcat多实例部署&#xff08;192.168.17.27&#xff09; 1.安装jdk&#xff0c;设置jdk的环境变量 2.安装tomcat在一台已经部署了tomcat的机器上复制tomcat的配置文件取名tomcat1 ​编辑 编辑配置文件更改端口号&#xff0c;将端口号改为8081 启动 tomcat&#xff…

【机器学习】libsvm 简单使用示例(C++)

libsvm简单使用demo 一、libsvm使用说明 二、svm.h源码 #ifndef _LIBSVM_H //如果没有定义 _LIBSVM_H 宏 #define _LIBSVM_H //则定义 _LIBSVM_H 宏&#xff0c;用于防止重复包含#define LIBSVM_VERSION 317 //定义一个宏&#xff0c;表示 libsvm 的版本号#ifdef __cplusplus /…

uniapp之屏幕右侧出现滚动条去掉、隐藏、删除【好用!】

目录 问题解决大佬地址最后 问题 解决 在最外层view上加上class“content”;输入以下样式。注意&#xff1a;两个都必须存在在生效。 .content {/* 跟屏幕高度一样高,不管view中有没有内容,都撑开屏幕高的高度 */height: 100vh; overflow: auto; } .content::-webkit-scrollb…

计算机网络考研辨析(后续整理入笔记)

文章目录 体系结构物理层速率辨析交换方式辨析编码调制辨析 链路层链路层功能介质访问控制&#xff08;MAC&#xff09;信道划分控制之——CDMA随机访问控制轮询访问控制 扩展以太网交换机 网络层网络层功能IPv4协议IP地址IP数据报分析ICMP 网络拓扑与转发分析&#xff08;重点…

软件设计师——计算机网络(三)

&#x1f4d1;前言 本文主要是【计算机网络】——软件设计师——计算机网络的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

Mac安装Typora实现markdown自由

一、什么是markdown Markdown 是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。 它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&#xff09;文档。这种语言吸收了很多在电子邮…

【AI工具】GitHub Copilot IDEA安装与使用

GitHub Copilot是一款AI编程助手&#xff0c;它可以帮助开发者编写代码&#xff0c;提供代码建议和自动完成功能。以下是GitHub Copilot在IDEA中的安装和使用步骤&#xff1a; 安装步骤&#xff1a; 打开IDEA&#xff0c;点击File -> Settings -> Plugins。在搜索框中输…

棋牌的电脑计时计费管理系统教程,棋牌灯控管理软件操作教程

一、前言 有的棋牌室在计时的时候&#xff0c;需要使用灯控管理&#xff0c;在开始计时的时候打开灯&#xff0c;在结账后关闭灯&#xff0c;也有的不需要用灯控&#xff0c;只用来计时。 下面以 佳易王棋牌计时计费管理系统软件为例说明&#xff1a; 软件试用版下载或技术支…

Selenium安装WebDriver:ChromeDriver与谷歌浏览器版本快速匹配_最新版120

最近在使用通过selenium操作Chrome浏览器时&#xff0c;安装中遇到了Chrome版本与浏览器驱动不匹配的的问题&#xff0c;在此记录安装下过程&#xff0c;如何快速找到与谷歌浏览器相匹配的ChromeDriver驱动版本。 1. 确定Chrome版本 我们首先确定自己的Chrome版本 Chrome设置…