当前位置: 首页 > news >正文

Docker 环境下使用 Traefik v3 和 MinIO 快速搭建私有化对象存储服务

上一篇文章中,我们使用 Traefik 新版本完成了本地服务网关的搭建。接下来,来使用 Traefik 的能力,进行一系列相关的基础设施搭建吧。

本篇文章,聊聊 MinIO 的单独使用,以及结合 Traefik 完成私有化 S3 服务的基础搭建。

写在前面

说起 MinIO 和“对象存储”,其实在早些时候,已经写过不少和 MinIO 相关的内容了:

  • 2021 年《使用容器搭建简单可靠的容器仓库》文章中,分享了使用 MinIO 作为容器的存储后端。
  • 2021 年《从零开始使用开源文档/Wiki软件 Outline(二)》文章中,使用 MinIO 作为 Outline 的存储后端,介绍了如何编写初始化配置程序来对 MinIO 进行快速初始化等。
  • 2021 年《装在笔记本里的私有云环境:网络存储篇(上)》文章中,讲过如何使用 Traefik v2 快速搭建 MinIO 存储网关。
  • 2021 年《装在笔记本里的私有云环境:网络存储篇(中)》文章中,讲了如何对 MinIO 添加监控程序,做性能指标收集。
  • 2022 年《使用 Mastodon 搭建个人信息平台:调优篇》文章中,聊了解决直接使用 MinIO 提供静态资源服务,并解决跨域资源使用的问题。

MinIO  是目前开源领域实至名归的头部方案

这几年随着 AI 行业的爆炸式发展,MinIO 的用户量和应用范围变的更加广阔。除了基础模型厂商和研究机构,在前几年已经开始大规模使用 MinIO 作为模型训练场景的基础组件,多数用户或许只是拿它作为简单的存储组件使用。

时至今日,我们不仅仅可以用它来打通各种软件数据存储和共享、进行跨设备的数据备份、同步,还能够在 RAG 场景中,使用它来做大规模的语料存储。

为了后续上述场景中,我们能够愉快玩耍。

让我们从最简单的用法开始,了解该如何和 Traefik 一起结合使用,快速完成私有化的对象存储服务的搭建。

文本中相关的代码,我已经开源在了 soulteary/traefik-minio-example,有需要自取。

准备工作

这篇文章的准备工作非常简单,只需要完成 Docker 运行环境的安装、下载基础配置代码、程序镜像的下载即可。

获取基础配置代码

使用 git 将包含基础配置的项目下载到本地:

git clone https://github.com/soulteary/traefik-minio-example.git

然后,进入代码目录:

cd traefik-minio-example

Docker 环境的准备

如果你已经安装了 Docker ,那么可以跳过这个小节。

如果你还没有安装 Docker,不论你使用的是 Windows、Linux、macOS,都可以相对快速简单的完成 Docker 的安装和简单配置。

你可以参考之前的一些文章:《Docker 环境下使用 Traefik 3 的最佳实践:快速上手》中的“Docker 环境”、《基于 Docker 的深度学习环境:Windows 篇》中的“准备 Docker 虚拟化运行环境” 或者《在笔记本上搭建高性价比的 Linux 学习环境:基础篇》中的“更简单的 Docker 安装”,来根据不同的操作系统,完成相关的配置,这里就不多做赘述了。

MinIO Docker 镜像下载

虽然 MinIO 官方的文档告诉我们,使用它直接下载 latest 镜像就行(不携带版本)。但是,在以往的使用过程中,发现过升级版本,没有完整向后兼容的问题。

为了减少不必要的麻烦,这里建议始终携带一个较新版本的,如:

docker pull minio/minio:RELEASE.2024-08-03T04-33-23Z

因为 MinIO 特别小巧,下载过程会相对比较快:

# docker pull minio/minio:RELEASE.2024-08-03T04-33-23ZRELEASE.2024-08-03T04-33-23Z: Pulling from minio/minio
a4ed047ad504: Pull complete 
bbc1fc383cb4: Pull complete 
feb4010d8963: Pull complete 
929fc7e1cabd: Pull complete 
4f4fb700ef54: Pull complete 
1081fb4576cf: Pull complete 
7e20bc251850: Pull complete 
da9a532441d8: Pull complete 
Digest: sha256:c933bb53ac226d1f4bdfeac66a3854d02903771e91d7ee2cbc330841a1d77d7e
Status: Downloaded newer image for minio/minio:RELEASE.2024-08-03T04-33-23Z
docker.io/minio/minio:RELEASE.2024-08-03T04-33-23Z

完成了镜像的下载,我们就可以正式开始折腾了。

基础使用

我们先来通过最简单的 MinIO 运行命令,来了解 MinIO 的基础用法和默认程序行为。

在 MinIO 官方的下载页面,我们能够看到官方推荐的使用方法:

podman run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001"

用上一篇文章提到的 “命令行转换配置大法”,可以快速的得到下面的 Docker Compose 配置:

name: minio
services:minio:ports:- 9000:9000- 9001:9001image: minio/minio:RELEASE.2024-08-03T04-33-23Zcommand: server /data --console-address ":9001"

如果你没有完成前文中“准备工作”中的“获取基础配置代码”的步骤,可以将上面的配置保存为 docker-compose.yml,然后使用 docker compose up 来启动一个服务 90009001 端口的 minio 容器实例。

如果你已经完成了基础配置代码的下载,上面的配置已经保存在示例的基础配置代码中了。我们可以执行下面的命令,快速的体验最基础的 MinIO 使用方法。

cp docker-compose.simple.yml docker-compose.ymldocker compose up

当我们看到类似下面的日志之后,就可以通过浏览器访问 MinIO 了。

docker compose up   
[+] Building 0.0s (0/0)                                                                                                                         docker:desktop-linux
[+] Running 1/1✔ Container minio  Recreated                                                                                                                                   0.2s 
Attaching to minio-minio-1
minio-minio-1  | MinIO Object Storage Server
minio-minio-1  | Copyright: 2015-2024 MinIO, Inc.
minio-minio-1  | License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
minio-minio-1  | Version: RELEASE.2024-08-03T04-33-23Z (go1.22.5 linux/arm64)
minio-minio-1  | 
minio-minio-1  | API: http://172.21.0.2:9000  http://127.0.0.1:9000 
minio-minio-1  | WebUI: http://172.21.0.2:9001 http://127.0.0.1:9001 
minio-minio-1  | 
minio-minio-1  | Docs: https://min.io/docs/minio/linux/index.html
minio-minio-1  | WARN: Detected default credentials 'minioadmin:minioadmin', we recommend that you change these values with 'MINIO_ROOT_USER' and 'MINIO_ROOT_PASSWORD' environment variables

默认情况下,我们在浏览器访问 localhost:9000 会被直接重定向到 localhost:9001/login 的 MinIO 控制面板的登录界面。

MinIO 控制面板登录界面

默认情况下,我们使用 minioadmin 作为账号和密码,就能够登录 MinIO 后台进行管理了。

MinIO 控制面板登录后界面

如果你使用过 AWS S3、阿里云或腾讯云的对象存储,那么你对左侧的“对象浏览器”、“访问密钥管理”、“存储桶管理”、“访问策略管理”、“用户身份管理” 等等功能应该会比较熟悉。

如果你不熟悉也没有关系,接下来的内容和后续的使用中,多使用使用,自然就熟悉了。

使用 MinIO 管理后台存储文件

考虑到有一部分同学没有接触过对象存储或 MinIO 类似的产品,这里我们简单介绍下 MinIO 的基础使用。如果你已经熟悉,可以跳过这个小节,了解更完善的搭建方法。

在 MinIO 后台创建一个“存储桶”

想要使用 MinIO 这类产品进行对象存储,我们首先需要创建一个“存储桶”(Bucket),在 MinIO 侧边栏中选择 Bucket,然后创建一个新的 Bucket 即可,名字根据自己的需求起即可,我这里随便写了一个“say-hi”。

查看 Bucket 的详细情况

创建之后,我们可以在后台看到这个 Bucket 的详细情况,以及做一些细节的权限设置,副本设置等等。

在 MinIO 后台完成文件的上传

选择侧边栏的“对象管理器”,然后选择这个我们创建的 Bucket,可以随便上传文件或者文件夹。我这里上传了一个使用 AI 将图片生成的短视频。

在 MinIO 后台进行文件的操作

文件上传之后,我们能够在这个控制台进行一些简单的操作:下载、分享、预览、删除等等。

在 MinIO 后台预览上传文件

比如,我这里点击了预览,就能够直接在浏览器中浏览这个视频啦。当然,你也可以将预览或者下载的链接嵌入你需要嵌入的文档、程序中使用。

使用客户端来完成文件的管理

使用网页进行操作,当然非常的简单。但是如果我们想要操作大量的文件,或者在其他的程序中使用 MinIO 提供的对象存储能力呢?

MinIO 和我们使用的云服务商一样,支持通过编程的方式,或标准化集成的方式来访问存储能力。

首先,我们需要创建一个“访问授权”密钥。

在 MinIO 后台选择 “Access Keys”

选择侧边栏的 “Access Keys”,创建一个新的授权密钥。

在 MinIO 后台创建 Access Key

默认创建的密钥都是随机创建的字符串 “乱码”。

在 MinIO 后台为访问密钥起名字

这里有个小经验,密钥名称其实是可以修改的。为了更好的区分访问密钥的用途,建议手动修改密钥的名字。

如果你有支持 S3 协议的软件,可以使用你自己的软件来测试和验证刚刚启动的 MinIO 服务。如果你没有的话,可以根据自己的操作系统,选择一些支持 S3 协议的软件。

Windows 可以使用的 S3 浏览器

如果你是 Windows 环境,可以使用一些类似 S3 Browser 的工具、包括 Cyberduck 等等,完成简单配置,进行服务验证。

macOS 可以使用类似的软件

macOS 同样可以使用 Cyberduck,不过我这里使用的是另外一款类似的软件,完成简单的配置之后,选择“挂载”,就能够将 MinIO 中的某个 Bucket,挂载为本地的磁盘使用了。

完成 S3 本地磁盘挂载

当然,我们也可以在各种编程语言中使用对应的 S3 SDK 来使用这个存储能力。除了 AWS 和 MinIO S3 SDK 之外,GitHub 上还有许多其他社区用户的实现,都可以参考使用。

更完善的 MinIO Docker 使用方案

相比较直接使用官方的默认命令转换的 Docker Compose 配置,下面的配置中会更适合我们快速本地搭建一个存储服务:

name: minioservices:minio:container_name: minioports:- 9000:9000- 9001:9001image: minio/minio:RELEASE.2024-08-03T04-33-23Zenvironment:# refs: https://min.io/docs/minio/linux/reference/minio-server/settings/core.html- MINIO_DOMAIN=minio.lab.io- MINIO_COMPRESSION_ENABLE=on- MINIO_COMPRESSION_ALLOW_ENCRYPTION=off# refs: https://min.io/docs/minio/linux/reference/minio-server/settings/root-credentials.html- MINIO_ROOT_USER=soulteary- MINIO_ROOT_PASSWORD=soulteary- MINIO_API_ROOT_ACCESS=on# refs: https://min.io/docs/minio/linux/reference/minio-server/settings/console.html- MINIO_BROWSER=on- MINIO_BROWSER_LOGIN_ANIMATION=off- MINIO_BROWSER_REDIRECT=false- MINIO_BROWSER_SESSION_DURATION=365d# refs: https://min.io/docs/minio/linux/reference/minio-server/minio-server.htmlcommand: server /data --address=":9000" --console-address=":9001"volumes:- ./minio/data:/data- ./minio/config:/root/.minioextra_hosts:- "minio.lab.io:127.0.0.1"healthcheck:# refs:# - https://min.io/docs/minio/linux/reference/minio-mc/mc-ready.html# - https://github.com/minio/minio/issues/18389test: ["CMD", "mc", "ready", "local"]interval: 3stimeout: 10sretries: 12

在上面的配置中,我们额外做了一些事情,你可以根据你的实际情况进行调整:

  • 指定了服务交互使用的域名,并对容器内服务绑定了域名为本地,避免对外解析。
  • 启用了针对文本和一些类型文件的压缩,能够减少磁盘占用,以及提升对外提供服务时的传输效率。
  • 禁用了文件端到端加密,减少不必要的性能损耗。
  • 重新指定了超级用户的账号和密码都是 soulteary
  • 声明文件访问地址不再自动跳转管理后台,增加一些安全性。
  • 根据实际需要临时启用后台管理界面,并延长有效的登录状态时间为 1 年。
  • 显式声明了 API 和后台地址的服务端口。
  • 将我们上传的数据挂载到本地,避免服务结束数据和容器一起被回收。
  • 增加了容器健康检查,能够支持服务故障自愈。

和上文中一样,我们将配置保存为 docker-compose.yml ,使用 docker compose up 就能够体验更可靠的 MinIO 容器服务啦。

cp docker-compose.standalone.yml docker-compose.ymldocker compose up

执行完命令,就能够看到熟悉,但是有一些不同的服务运行状态啦(更明确的运行状态)。

# docker compose up
[+] Building 0.0s (0/0)                                                                                                                         docker:desktop-linux
[+] Running 1/0✔ Container minio-minio-1  Recreated                                                                                                                           0.1s 
Attaching to minio
minio  | MinIO Object Storage Server
minio  | Copyright: 2015-2024 MinIO, Inc.
minio  | License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
minio  | Version: RELEASE.2024-08-03T04-33-23Z (go1.22.5 linux/arm64)
minio  | 
minio  | API: http://172.21.0.2:9000  http://127.0.0.1:9000 
minio  | WebUI: http://172.21.0.2:9001 http://127.0.0.1:9001 
minio  | 
minio  | Docs: https://min.io/docs/minio/linux/index.html

当然,这样运行的服务,我们还是得使用 IP 和端口进行访问,并且不支持 HTTPS 访问。不论是在线服务还是内网生产使用,都还是比较麻烦的。

所以,接下来,我们来一步步将上面的配置改造为适合和 Traefik 一起使用的。

完善 MinIO 配置,适配 Traefik 使用

还是使用上面的配置,在配置中添加“网络”相关内容:

name: minioservices:minio:...networks:- traefiknetworks:traefik:external: true

接着,在程序容器“标签”中声明一些必要的信息,来辅助 Traefik 更好的理解和注册我们的程序为 HTTPS 服务:

name: minioservices:minio:...labels:# 用于 Traefik 服务发现- "traefik.enable=true"- "traefik.docker.network=traefik"# MinIO API 服务相关# - HTTP 相关设置:#   使用 HTTP 协议访问 minio,将使用 `http`(80端口) 提供服务- "traefik.http.routers.minio-http.entrypoints=http"#   并自动跳转至 HTTPS 协议(443端口)- "traefik.http.routers.minio-http.middlewares=redir-https"#   默认服务域名为 minio.lab.io- "traefik.http.routers.minio-http.rule=Host(`minio.lab.io`)"#   服务名称为 noop@internal,表示不提供任何服务 (因为自动跳转,没必要请求服务)- "traefik.http.routers.minio-http.service=noop@internal"# - HTTPS 相关设置:#   使用 HTTPS 协议访问 minio,将使用 `https`(443端口) 提供服务- "traefik.http.routers.minio-https.entrypoints=https"#   在这个端口上使用 TLS 协议- "traefik.http.routers.minio-https.tls=true"#   对响应内容启用 GZIP 压缩- "traefik.http.routers.minio-https.middlewares=gzip"#   默认服务域名为 minio.lab.io- "traefik.http.routers.minio-https.rule=Host(`minio.lab.io`)"#   HTTPS 服务名称为 minio-backend,使用 9000 端口提供服务- "traefik.http.routers.minio-https.service=minio-backend"# 声明服务名称为 minio-backend,使用 9000 端口提供服务- "traefik.http.services.minio-backend.loadbalancer.server.scheme=http"- "traefik.http.services.minio-backend.loadbalancer.server.port=9000"# MinIO Admin 服务相关# - HTTP 相关设置:#   使用 HTTP 协议访问 minio,将使用 `http`(80端口) 提供服务- "traefik.http.routers.minio-admin-http.entrypoints=http"#   并自动跳转至 HTTPS 协议(443端口)- "traefik.http.routers.minio-admin-http.middlewares=redir-https"#   默认服务域名为 minio.console.lab.io- "traefik.http.routers.minio-admin-http.rule=Host(`minio.console.lab.io`)"#   服务名称为 noop@internal,表示不提供任何服务 (因为自动跳转,没必要请求服务)- "traefik.http.routers.minio-admin-http.service=noop@internal"# - HTTPS 相关设置:#   使用 HTTPS 协议访问 minio,将使用 `https`(443端口) 提供服务- "traefik.http.routers.minio-admin-https.entrypoints=https"#   在这个端口上使用 TLS 协议- "traefik.http.routers.minio-admin-https.tls=true"#   对响应内容启用 GZIP 压缩- "traefik.http.routers.minio-admin-https.middlewares=gzip"#   默认服务域名为 minio.console.lab.io- "traefik.http.routers.minio-admin-https.rule=Host(`minio.console.lab.io`)"#   HTTPS 服务名称为 minio-backend,使用 9001 端口提供服务- "traefik.http.routers.minio-admin-https.service=minio-admin-backend"# 声明服务名称为 minio-backend,使用 9001 端口提供服务- "traefik.http.services.minio-admin-backend.loadbalancer.server.scheme=http"- "traefik.http.services.minio-admin-backend.loadbalancer.server.port=9001"

在上面的配置中,我们分别针对 MinIO 的 API 和管理后台进行的配置,并分别配置了 HTTP 和 HTTPS 两种协议的访问,并将 HTTP 协议的访问请求统一跳转为 HTTPS 访问。

并且,考虑到信息安全,我们对 API 和管理后台绑定了不同的服务域名。这里,我们还可以在后台的“中间件”中添加更多的“安全访问”限制的功能,比如额外的身份验证。

name: minioservices:minio:...extra_hosts:- "minio.lab.io:127.0.0.1"- "minio.console.lab.io:127.0.0.1"

和上面一样,为了避免服务域名被解析到容器之外,我们可以做一下域名绑定。

完成配置我已经存放到开源项目中 soulteary/traefik-minio-example/docker-compose.traefik.yml,考虑到篇幅长度,就不再粘贴。

使用方法和上面一样:

cp docker-compose.traefik.yml docker-compose.ymldocker compose up

服务启动后,我们就能够通过新的域名(minio.console.lab.io)来访问 MinIO 管理后台啦。

使用独立域名访问 MinIO 管理后台

我们可以通过许多种方式,来通过 MinIO API 接口域名,来提供资源的访问,包括开放“存储桶”的访问权限,给私有存储桶开放某些路径的访问权限,或者使用 API 来获取桶中的内容。

因为是验证,这里做一个简单的演示,将桶类所有路径都设置为开放访问。

开放存储桶的访问权限

在我们设置完所有路径都开放访问后,就可以使用下面的路径来访问上文中上传到服务中的资源啦。

# https://域名/桶名称/资源名称https://minio.lab.io/say-hi/bigbro.mp4

爱因斯坦,你好呀

对上面的服务进行抽象

上面的服务配置中,我们 HardCode 了一些内容。

为了能够更快的搭建各种“个性化”的服务,来适配不同的场景,和上篇文章一样,我们对它进行服务抽象。

抽象配置文件

先来定义核心的配置文件 .env

# Docker 服务名称
SERVICE_NAME=minio
# 使用的应用镜像
DOCKER_IMAGE=minio/minio:RELEASE.2024-08-03T04-33-23Z
# 服务域名和端口
API_DOMAIN=minio.lab.io
API_PORT=9000
# 管理域名和端口
DASHBOARD_DOMAIN=minio.console.lab.io
DASHBOARD_PORT=9001
# 超级管理员
ADMIN_USER=soulteary
ADMIN_PASS=soulteary

完成配置文件的抽象后,我们来将配置文件相关的内容应用到 Docker 容器配置中。

更新使用 MinIO 的 Docker 容器配置

先来完成独立使用 MinIO 的容器配置:

name: minioservices:minio:container_name: ${SERVICE_NAME}image: ${DOCKER_IMAGE}ports:- 9000:${API_PORT}- 9001:${DASHBOARD_PORT}environment:# refs: https://min.io/docs/minio/linux/reference/minio-server/settings/core.html- MINIO_DOMAIN=${API_DOMAIN}- MINIO_COMPRESSION_ENABLE=on- MINIO_COMPRESSION_ALLOW_ENCRYPTION=off# refs: https://min.io/docs/minio/linux/reference/minio-server/settings/root-credentials.html- MINIO_ROOT_USER=${ADMIN_USER}- MINIO_ROOT_PASSWORD=${ADMIN_PASS}- MINIO_API_ROOT_ACCESS=on# refs: https://min.io/docs/minio/linux/reference/minio-server/settings/console.html- MINIO_BROWSER=on- MINIO_BROWSER_LOGIN_ANIMATION=off- MINIO_BROWSER_REDIRECT=false- MINIO_BROWSER_SESSION_DURATION=365d# refs: https://min.io/docs/minio/linux/reference/minio-server/minio-server.htmlcommand: server /data --address=":${API_PORT}" --console-address=":${DASHBOARD_PORT}"volumes:- ./minio/data:/data- ./minio/config:/root/.minioextra_hosts:- "${API_DOMAIN}:127.0.0.1"healthcheck:# refs:# - https://min.io/docs/minio/linux/reference/minio-mc/mc-ready.html# - https://github.com/minio/minio/issues/18389test: ["CMD", "mc", "ready", "local"]interval: 3stimeout: 10sretries: 12

接下来是搭配 Traefik 使用的容器配置:

name: minioservices:minio:container_name: ${SERVICE_NAME}image: ${DOCKER_IMAGE}environment:# refs: https://min.io/docs/minio/linux/reference/minio-server/settings/core.html- MINIO_DOMAIN=${API_DOMAIN}- MINIO_COMPRESSION_ENABLE=on- MINIO_COMPRESSION_ALLOW_ENCRYPTION=off# refs: https://min.io/docs/minio/linux/reference/minio-server/settings/root-credentials.html- MINIO_ROOT_USER=${ADMIN_USER}- MINIO_ROOT_PASSWORD=${ADMIN_PASS}- MINIO_API_ROOT_ACCESS=on# refs: https://min.io/docs/minio/linux/reference/minio-server/settings/console.html- MINIO_BROWSER=on- MINIO_BROWSER_LOGIN_ANIMATION=off- MINIO_BROWSER_REDIRECT=false- MINIO_BROWSER_SESSION_DURATION=365d# refs: https://min.io/docs/minio/linux/reference/minio-server/minio-server.htmlcommand: server /data --address=":${API_PORT}" --console-address=":${DASHBOARD_PORT}"networks:- traefiklabels:# 用于 Traefik 服务发现- "traefik.enable=true"- "traefik.docker.network=traefik"# MinIO API 服务相关# - HTTP 相关设置:#   使用 HTTP 协议访问 minio,将使用 `http`(80端口) 提供服务- "traefik.http.routers.minio-http.entrypoints=http"#   并自动跳转至 HTTPS 协议(443端口)- "traefik.http.routers.minio-http.middlewares=redir-https"#   默认服务域名为 minio.lab.io- "traefik.http.routers.minio-http.rule=Host(`${API_DOMAIN}`)"#   服务名称为 noop@internal,表示不提供任何服务 (因为自动跳转,没必要请求服务)- "traefik.http.routers.minio-http.service=noop@internal"# - HTTPS 相关设置:#   使用 HTTPS 协议访问 minio,将使用 `https`(443端口) 提供服务- "traefik.http.routers.minio-https.entrypoints=https"#   在这个端口上使用 TLS 协议- "traefik.http.routers.minio-https.tls=true"#   对响应内容启用 GZIP 压缩- "traefik.http.routers.minio-https.middlewares=gzip"#   默认服务域名为 minio.lab.io- "traefik.http.routers.minio-https.rule=Host(`${API_DOMAIN}`)"#   HTTPS 服务名称为 minio-backend,使用 9000 端口提供服务- "traefik.http.routers.minio-https.service=minio-backend"# 声明服务名称为 minio-backend,使用 9000 端口提供服务- "traefik.http.services.minio-backend.loadbalancer.server.scheme=http"- "traefik.http.services.minio-backend.loadbalancer.server.port=${API_PORT}"# MinIO Admin 服务相关# - HTTP 相关设置:#   使用 HTTP 协议访问 minio,将使用 `http`(80端口) 提供服务- "traefik.http.routers.minio-admin-http.entrypoints=http"#   并自动跳转至 HTTPS 协议(443端口)- "traefik.http.routers.minio-admin-http.middlewares=redir-https"#   默认服务域名为 minio.console.lab.io- "traefik.http.routers.minio-admin-http.rule=Host(`${DASHBOARD_DOMAIN}`)"#   服务名称为 noop@internal,表示不提供任何服务 (因为自动跳转,没必要请求服务)- "traefik.http.routers.minio-admin-http.service=noop@internal"# - HTTPS 相关设置:#   使用 HTTPS 协议访问 minio,将使用 `https`(443端口) 提供服务- "traefik.http.routers.minio-admin-https.entrypoints=https"#   在这个端口上使用 TLS 协议- "traefik.http.routers.minio-admin-https.tls=true"#   对响应内容启用 GZIP 压缩- "traefik.http.routers.minio-admin-https.middlewares=gzip"#   默认服务域名为 minio.console.lab.io- "traefik.http.routers.minio-admin-https.rule=Host(`${DASHBOARD_DOMAIN}`)"#   HTTPS 服务名称为 minio-backend,使用 9001 端口提供服务- "traefik.http.routers.minio-admin-https.service=minio-admin-backend"# 声明服务名称为 minio-backend,使用 9001 端口提供服务- "traefik.http.services.minio-admin-backend.loadbalancer.server.scheme=http"- "traefik.http.services.minio-admin-backend.loadbalancer.server.port=9001"volumes:- ./minio/data:/data- ./minio/config:/root/.minioextra_hosts:- "${API_DOMAIN}:127.0.0.1"- "${DASHBOARD_DOMAIN}:127.0.0.1"healthcheck:# refs:# - https://min.io/docs/minio/linux/reference/minio-mc/mc-ready.html# - https://github.com/minio/minio/issues/18389test: ["CMD", "mc", "ready", "local"]interval: 3stimeout: 10sretries: 12networks:traefik:external: true

当所有的配置都是声明式的之后,我们的服务部署和维护就会变的非常简单,只需要修改其中的“文本参数”即可。在初高中的时候,我们就学习过很多次的 “控制变量法” 嘛。当变量就剩下一两个了,这些东西,还复杂嘛?是不是相当简单呢?

文本中相关的代码,都已经开源在了 soulteary/traefik-minio-example,希望你玩的开心。

其他

相信看完上面的内容后,你应该已经能够搭建出单一磁盘支持的私有化的 S3 存储服务。

为了服务的可靠性,我个人建议做两件事情。

你可以通过各种方式,让容器能够同时访问多块物理磁盘。然后结合 MinIO 服务目录,设置 MinIO 使用多块磁盘,而非一块磁盘。MinIO 支持的纠删码,能够让我们以相对低的成本,完成数据在物理层面的可靠性保障。

当遇到极端情况的时候,数据依旧能够被正确的读取和修复。

除此之外,我们还可以进行一些数据备份操作,参考 “桶复制” ,你可以使用 MinIO 的 CLI 或者管理界面,配置数据同步、备份策略,确保数据有多份副本存储。

最后

好了,这篇文章,同样写了比较长的篇幅,希望对你有帮助。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾、彼此坦诚相待的小伙伴。

我们在里面会一起聊聊软硬件、HomeLab、编程上、生活里以及职场中的一些问题,偶尔也在群里不定期的分享一些技术资料。

关于交友的标准,请参考下面的文章:

致新朋友:为生活投票,不断寻找更好的朋友

当然,通过下面这篇文章添加好友时,请备注实名和公司或学校、注明来源和目的,珍惜彼此的时间 😄

关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2024年08月05日
统计字数: 18533字
阅读时间: 37分钟阅读
本文链接: https://soulteary.com/2024/08/05/best-practices-for-traefik-3-and-minio-in-docker-getting-started-quickly.html

相关文章:

Docker 环境下使用 Traefik v3 和 MinIO 快速搭建私有化对象存储服务

上一篇文章中,我们使用 Traefik 新版本完成了本地服务网关的搭建。接下来,来使用 Traefik 的能力,进行一系列相关的基础设施搭建吧。 本篇文章,聊聊 MinIO 的单独使用,以及结合 Traefik 完成私有化 S3 服务的基础搭建…...

玛雅房产系统源码开发与技术功能解析

引言 随着房地产市场的蓬勃发展,房产管理系统(Real Estate Management System, REMS)作为提升行业效率、优化资源配置的关键工具,其重要性日益凸显。房产系统源码开发不仅涉及复杂的业务逻辑处理,还融合了先进的软件开…...

c++----初识模板

大家好,这篇博客想与大家分享一些我们c中比较好用的知识点。模板。首先咧,我们都知道模板嘛,就是以前人的经验总结出来的知识。方便我们使用。这里的模板也是一样的。当我们学习过后,对于一些在c中的自定义函数,我们在…...

SpringBoot3热部署

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency> 默认就是,无需配置 可以了…...

J. 二进制与、平方和

https://codeforces.com/gym/104095/problem/J 分析操作一 1&00 ,0&10&#xff0c;ai<qmi(2,24),说明每个数最多操作25次 维护区间或和&#xff0c;orsum & x orsum 就不用递归下去了 势能线段树code // Problem: J. 二进制与、平方和 // Contest: Codeforc…...

LVS中NAT模式和DR模式实战讲解

1DR模式 DR&#xff1a;Direct Routing&#xff0c;直接路由&#xff0c;LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发&#xff0c;源MAC是DIP所在的接口的MAC&#xff0c;目标MAC是某挑选出的RS的RIP所在接口的MAC地址&#xff1b;源 IP/PORT&#xf…...

写给小白程序员的一封信

文章目录 1.编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略2.程序员的练级攻略3.编程语言的选择4.熟悉Linux5.学会git6.知道在哪寻求帮助7.多结交朋友8.参加开源项目9.坚持下去 1.编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必…...

Leaf分布式ID

文章目录 系统对Id号的要求UUIDsnowflakeLeafLeaf-snowflakeLeaf-segmentMySQL自增主键segment双buffer 系统对Id号的要求 1、业务 1&#xff09;全局唯一性&#xff1a;不能出现重复的ID号&#xff0c;既然是唯一标识&#xff0c;这是最基本的要求 2&#xff09;趋势递增&a…...

Starrocks解析json数组

json数据 [{"spec": "70g/支","unit": "支","skuId": "1707823848651276346","amount": 6,"weight": 70,"spuName": "伊利 甄稀 苦咖啡味雪糕 流心冰淇淋 70g/支",&quo…...

安卓基本布局(下)

TableLayout 常用属性描述collapseColumns设置需要被隐藏的列的列号。shrinkColumns设置允许被伸缩的列的列号。stretchColumns设置允许被拉伸的列的列号。 <TableLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/TableL…...

Python中使用正则表达式

摘要&#xff1a; 正则表达式&#xff0c;又称为规则表达式&#xff0c;它不是某种编程语言所特有的&#xff0c;而是计算机科学的一个概念&#xff0c;通常被用来检索和替换某些规则的文本。 一.正则表达式的语法 ①行定位符 行定位符就是用来描述字符串的边界。"^&qu…...

三大口诀不一样的代码,小小的制表符和换行符玩的溜呀

# 小案例&#xff0c;打印输出加法口诀 for i in range(1,10):for j in range(1,10):if j>i:breakprint(f"{j}{i}{ji}".strip(),end\t)print() print(\n) for i in range(1,10):for j in range(1,10):if j>i:breakprint(f"{j}x{i}{j*i}",end\t)print…...

[qt] 线程等待与唤醒

对于生产者与消费者的数据处理的另一种好的解决方法是使用QWaitCondition类,允许线程在一定的条件下唤醒其他多个线程来共同处理。 一 定义公共变量 DataSize: 生产者生产数据的大小BufferSize: 也就是这个缓冲区的大小,每个单元是一个int&#xff0c;也有可能是一个链表,结构…...

Springboot 实现 Modbus Rtu 协议接入物联网设备

Modbus RTU 技术教程 引言 Modbus是一种开放标准的通信协议,它最初由Modicon(现施耐德电气)在1979年发布,旨在让可编程逻辑控制器(PLC)之间能够进行通信。随着时间的发展,Modbus已经成为工业自动化领域中最常用的通信协议之一,尤其适用于连接工业电子设备。本文将详细…...

鸿蒙笔记--装饰器

这一节主要了解一下鸿蒙里的装饰器,装饰器是一种特殊的语法结构&#xff0c;用于装饰类、结构体、方法以及变量; 1 Component在鸿蒙&#xff08;HarmonyOS&#xff09;开发中扮演着重要角色&#xff0c;主要用于定义可重用的UI组件,主要作用:1)组件化&#xff1a;Component装饰…...

不同环境下RabbitMQ的安装-3 操作RabbitMQ

前面两篇从不同环境下RabbitMQ的安装-1 为什么要使用消息服务 到同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ介绍了关于如何在ARM架构、X86架构和Window系统下如何安装&#xff0c;各位小伙伴可以根据自己的实际开发场景参考安装。 到本篇是一些…...

postgregSQL配置vector插件

1.下载vector 下载vector&#xff1a;https://pgxn.org/dist/vector/0.5.1/ 放在&#xff1a;C:\Program Files\PostgreSQL\vector-0.5.1 2.安装Visual Studio 2022 下载&#xff1a;https://visualstudio.microsoft.com/zh-hans/downloads/ 安装Visual Studio是为了C编译环…...

PUMA论文阅读

PUMA: Efficient Continual Graph Learning with Graph Condensation PUMA&#xff1a;通过图压缩进行高效的连续图学习 ABSTRACT 在处理流图时&#xff0c;现有的图表示学习模型会遇到灾难性的遗忘问题&#xff0c;当使用新传入的图进行学习时&#xff0c;先前学习的这些模…...

算法学习day31(动态规划)

一、比特位计数 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a;0 --> 0 1 --> 1 2 -…...

嵌入式学Day25---Linux软件编程---线程间通信

目录 ​编辑 一、线程的分离属性 1.1.什么是分离属性 1.2.分离属性相关函数接口 1.初始化线程属性-pthread_attr_init() 2.销毁线程属性-pthread_attr_destory() 3.设置线程属性-pthread_setdetachstate() 1.3.注意 二、互斥锁 2.1.资源 2.2.互斥锁 1.什么是互斥锁 2.互…...

C++.OpenGL (5/64)变换(Transformation)

变换(Transformation) 变换矩阵核心概念 #mermaid-svg-OvPP9vqkY9MRAHyd {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OvPP9vqkY9MRAHyd .error-icon{fill:#552222;}#mermaid-svg-OvPP9vqkY9MRAHyd .error-tex…...

Android 本地存储路径说明

一、背景 作为一个开发者,我们经常需要通过缓存一些文件到SD卡中,常见的方式就是,通过: File sdCard Environment.getExternalStorageDirectory(); 获取SD卡根目录,然后自定义文件/文件名进行文件存储.这样做法的结果就是,当手机安装了大量的app时&#xff0c;SD卡根目录会…...

厂区能源监控系统:网关赋能下的高效能源管理与环保监测

在现代工业生产领域&#xff0c;能源的有效利用与环境保护是企业实现可持续发展的两大关键要素。厂区能源监控系统借助先进的信息技术与自动化控制手段&#xff0c;对厂区内能源消耗及污水处理等核心环节展开实时监控与精细化管理。其中&#xff0c;御控网关作为系统关键枢纽&a…...

MCP协议重构AI Agent生态:万能插槽如何终结工具孤岛?

前言 在人工智能技术快速发展的2025年&#xff0c;MCP(Model Context Protocol&#xff0c;模型上下文协议)正逐渐成为AI Agent生态系统的关键基础设施。这一由Anthropic主导的开放协议&#xff0c;旨在解决AI模型与外部工具和数据源之间的连接难题&#xff0c;被业界形象地称…...

Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁

Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁...

从EDR到XDR:终端安全防御体系演进实践指南

在数字化浪潮中&#xff0c;企业的终端安全面临着前所未有的挑战。从早期单纯的病毒威胁&#xff0c;到如今复杂多变的高级持续性威胁&#xff08;APT&#xff09;、零日漏洞攻击等&#xff0c;安全形势日益严峻。为应对这些挑战&#xff0c;终端安全防御技术不断演进&#xff…...

day027-Shell自动化编程-基础

文章目录 1. 修改vim配置文件自动添加注释2. 故障案例&#xff1a;Windows上写的Shell脚本上传到Linux系统上运行报错3. 脚本运行方法4. 变量4.1 普通变量4.2 环境变量4.3 特殊变量4.4 案例&#xff1a;书写ping检查脚本&#xff0c;检查脚本传入的第一个参数4.5 面试题&#x…...

Matlab | MATLAB 中的插值详解

MATLAB 中的插值详解 插值是数值分析中的核心技术,用于在已知数据点之间估计未知点的值。MATLAB 提供了完整的插值函数库,涵盖一维到高维数据,支持多种插值方法。以下从基础到高级全面解析: 一、插值核心概念 1. 数学本质 给定数据点 ( x i , y i ) (x_i, y_i) (<...

RabbitMQ 监控与调优实战指南(二)

五、调优策略与实战&#xff1a;对症下药提升性能 5.1 配置参数调优 在 RabbitMQ 的性能优化中&#xff0c;合理调整配置参数是关键的一环&#xff0c;这些参数涉及内存、磁盘、网络等多个资源层面&#xff0c;对 RabbitMQ 的整体性能有着深远的影响。 内存相关配置&#xf…...

LeetCode 高频 SQL 50 题(基础版) 之 【高级查询和连接】· 上

题目&#xff1a;1731. 每位经理的下属员工数量 题解&#xff1a; select employee_id,name,reports_count,average_age from Employees t1,(select reports_to,count(*) reports_count,round(avg(age)) average_agefrom Employeeswhere reports_to is not nullgroup by repor…...