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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot集成protobuf快速入门Demo

1.什么是protobuf? Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的数据交换格式,它被用于结构化数据的序列化、反序列化和传输。相比于 XML 和 JSON 等文本格式,Protobuf 具有更小的数据体积、更快…

应急响应-主机安全之文件相关命令(Linux操作系统)

目录 概述常用命令file-探测给定文件的类型选项常用选项组合 stat-查看文件信息find-不止查找文件选项测试操作常用选项 locate-比find好用的查找命令选项常用选项组合 chmod-修改文件权限suidsbit chown、chgrp 修改文件所有者/所在组umask-显示或设置创建文件的权限掩码常用选…

大模型备案全网最详细流程说明【附附件】

本文要点:大模型备案最详细说明,大模型备案条件有哪些,《算法安全自评估报告》模板,大模型算法备案,大模型上线备案,生成式人工智能(大语言模型)安全评估要点,网信办大模型备案。 大模型备案安…

python的多线程

python的threading模块,它提供了丰富的接口来创建和管理线程。 定义一个函数print_numbers,这个函数将由线程执行。在这个函数中,我们使用一个循环来打印数字,并使用time.sleep(1)来模拟每个数字打印之间有1秒的延迟。 在 if __…

win7系统利用定时启动+脚本实现MySQL文件自动备份

前言 最近接到项目,数据量不大但对运行数据的安全性要求极高,为避免因不可抗拒因素导致的数据丢失,选择机械硬盘作为数据存储盘,并使用脚本方式对文件进行备份 一、脚本 下面为自动备份文件的 脚本,可根据自身情况进…

OpenSBI设备树

设备树 在前一启动阶段跳转OpenSBI时,可以将设备树的地址通过参数a1传递过来。 OpenSBI相关的配置(opensbi_config)也可以添加到设备树节点中,OpenSBI执行时会解析和使用这些配置,并在启动结束时删除该节点&#xff…

只强的Java学习之路8-5

一.搭建mybatis pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.a…

部署Springboot + Vue 项目到远程服务器Windows10系统的详细配置

远程服务器操作系统为Windows系统&#xff0c;Java程序环境&#xff0c;Maven环境都安装有&#xff0c;Mysql ,Redis等都有的前提下 1. mysql数据库导入&#xff0c;非常简单很好操作&#xff0c;这里省略。。比如用HeidiSql 或者Navicat 工具导入数据库 2. 后端javaSpringb…

高职物联网智慧农业实训室建设方案

一、项目概述 随着物联网技术的迅猛发展及其在农业领域的广泛应用&#xff0c;智慧农业已经成为推动农业现代化的关键力量。近年来&#xff0c;国家高度重视物联网技术在农业领域的应用与发展&#xff0c;出台了一系列相关政策支持智慧农业建设。如《数字乡村发展战略纲要》明…

英语疑惑之在树上

在树上&#xff0c;on the tree&#xff0c;我想这个这个介词到底该用in&#xff0c;on or other prep。本来我以为跟on the roof差不多&#xff0c;就是在物体表面&#xff0c;可是百度了一下&#xff0c;可以有on the tree, in the tree, by the tree, at the tree, under th…

基于tcp,html,数据库的在线信息查询系统项目总结

1.项目背景 在线信息查询系统是一种可用于检索和展示各种信息的计算机程序或平台。主要特点包括&#xff1a; 用户接口&#xff1a;通常提供友好的界面&#xff0c;用户可以方便地输入查询条件。 数据存储&#xff1a;系统往往连接到数据库&#xff0c;存储大量信息&#xf…

自动化工具Selenium IDE基本使用——脚本录制

1 简介 Selenium相信大家都知道&#xff0c;在做自动化操作时&#xff0c;要使用浏览器驱动直接控制浏览器操作的时候&#xff0c;大多会结合Selenium框架使用。 但在对网页操作自动化的时候&#xff0c;实际上有一种更轻量的做法&#xff0c;那就是直接使用Selenium IDE&…

【LeetCode每日一题】2024年8月第二周(上)

2024.8.5 困难 链接&#xff1a;600. 不含连续1的非负整数 &#xff08;1&#xff09;题目描述&#xff1a; &#xff08;2&#xff09;示例 &#xff08;3&#xff09;分析 思路1&#xff1a; 题目要求的数值&#xff0c;是将数二进制转换后&#xff0c;不存在连续的1&#x…

SQL时间盲注

目录 1.时间盲注 2使用场景 3.步骤 3.1判断注入点 3.2爆数据库名 3.3爆表名 3.4爆字段名 3.5查询数据 1.时间盲注 时间盲注是指基于时间的盲注&#xff0c;也叫延时注入&#xff0c;根据页面的响应时间来判断是否存在注入。 2使用场景 页面没有回显位置&#xff08;…

安装Supervisor队列进程、管理 Laravel 队列进程

在 CentOS 上安装 Supervisor 并配置 Laravel 的步骤如下&#xff1a; 1.安装 Supervisor&#xff1a; 使用以下命令安装 Supervisor&#xff1a; sudo yum install epel-release sudo yum install supervisor 2.配置 Supervisor&#xff1a; 创建一个新的 Supervisor 配置文…

EasyBoss ERP订单分仓规则优化升级,帮助跨境卖家高效处理TikTok本土店订单

做TikTok本土小店不仅要上货快&#xff0c;订单处理效率也得快&#xff01;效率越高&#xff0c;赚钱的速度就比别人要快&#xff01; 想提高订单效率&#xff0c;少不了EasyBoss ERP的帮忙&#xff0c;最近EasyBoss订单处理模块又有新升级&#xff0c;让老板们体验“快到飞起…

给新手项目经理的几点建议

踏入项目管理的新领域&#xff0c;对于每一位新手项目经理而言&#xff0c;都是一次既激动又充满挑战的旅程。在这个过程中&#xff0c;不仅需要掌握扎实的理论知识&#xff0c;还需要在实践中不断积累经验&#xff0c;提升自我。以下是一些针对新手项目经理的实用建议&#xf…

Stable Diffusion绘画 | 图生图-上传重绘蒙版

上传重绘蒙版&#xff0c;可以弥补局部重绘的缺点&#xff0c;能够更精细的修改画面中的指定区域 使用PS制作的蒙版图片为耳朵下方区域&#xff0c;可以为图片中的女生带上不同款式的耳环。 参数配置&#xff1a; 调整提示词&#xff1a; 生成图片如下所示&#xff1a; 调整提…

大数据面试SQL(一):合并日期重叠的活动

文章目录 合并日期重叠的活动 一、题目 二、分析 三、SQL实战 四、样例数据参考 合并日期重叠的活动 一、题目 已知有表记录了每个品牌的活动开始日期和结束日期&#xff0c;每个品牌可以有多个活动。请编写一个SQL查询合并在同一个品牌举行的所有重叠的活动&#xff0c…

手机在网时长查询接口如何对接?(一)

一、什么是手机在网时长查询接口&#xff1f; 传入手机号码&#xff0c;查询该手机号的在网时长&#xff0c;返回时间区间&#xff0c;支持携号转网号码查询。 二、手机在网时长查询接口适用于哪些场景&#xff1f; 例如&#xff1a;客户画像与精准营销 &#xff08;1&…