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

embedded/2024/9/23 9:04:14/

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

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

写在前面

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

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

<a class=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__55">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/loginMinIO 控制面板的登录界面。

<a class=MinIO 控制面板登录界面" />

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

<a class=MinIO 控制面板登录后界面" />

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

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

MinIO__151">使用 MinIO 管理后台存储文件

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

在 <a class=MinIO 后台创建一个“存储桶”" />

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

查看 Bucket 的详细情况

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

在 <a class=MinIO 后台完成文件的上传" />

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

在 <a class=MinIO 后台进行文件的操作" />

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

在 <a class=MinIO 后台预览上传文件" />

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

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

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

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

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

在 <a class=MinIO 后台选择 “Access Keys”" />

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

在 <a class=MinIO 后台创建 Access Key" />

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

在 <a class=MinIO 后台为访问密钥起名字" />

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

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

Windows 可以使用的 <a class=S3 浏览器" />

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

macOS 可以使用类似的软件

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

完成 <a class=S3 本地磁盘挂载" />

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

MinIO_Docker__209">更完善的 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__297">完善 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 管理后台啦。

使用独立域名访问 <a class=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__453">更新使用 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.ppmy.cn/embedded/91089.html

相关文章

【八股文】MySQL

1.char 和 varchar的区别 char是定长的&#xff0c;varchar是可变的字符串char适合存长度差不多的或者较短的&#xff0c;例如手机号&#xff0c;身份证&#xff0c;MD4加密算法。varchar用来存备注信息&#xff0c;用户昵称等不确定长度的信息。 2.Decimal、double和float的区…

EAK陶瓷电阻器-无感碳电阻

EAK使用 2 种不同的基材来制造我们的陶瓷电阻器圆盘/垫圈和棒/管。原始材料以硅酸锆为基材&#xff0c;并以 83-xxxx 为前缀表示该材料。现在提供氧化铝作为基材&#xff0c;并以 85-xxxx 为前缀表示这种材料。氧化铝提供了一种重量更轻的材料&#xff0c;这在许多应用中都很重…

Ubuntu20.4上搭建FFMPEG开发环境

编译ffmpeg命令如下: 1.安装yasm(ffmpeg里面有汇编语言的部分,所以需要安装一下yasm) wget 5http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz tar xvzf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure make && make install 2.安装nasm(2.13以上…

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

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

java 程序包org.junit.jupiter.api不存在

问题描述 正常启动springboot报错java 程序包org.junit.jupiter.api不存在。 问题分析 pom文件中缺少junit依赖&#xff0c;但是添加后问题仍然没解决&#xff0c;后面把test部分删掉解决问题。 解决方法 添加junit依赖 <dependency><groupId>junit</group…

GooLeNet模型搭建

一、model import torch from torch import nn from torchsummary import summaryclass Inception(nn.Module):def __init__(self, in_channels, c1, c2 , c3 , c4):super(Inception, self).__init__()self.ReLU nn.ReLU()#路线1:1x1卷积self.p1_1 nn.Conv2d(in_channels i…

C语言 ——— 在控制台实现三子棋游戏(适用于五子棋、十子琪…………)

目录 实现三子棋游戏的简介 三子棋游戏代码的测试文件、实现文件、头文件 实现三子棋游戏 打印菜单&#xff0c;让玩家选择是否玩游戏 --- game.c 玩家对局完后多次选择是否再次进行游戏 --- test.c 三子棋棋子的存储 将二维数组board的行和列定义为常变量 --- game.h 初…

按钮类控件

目录 1.Push Button 代码示例: 带有图标的按钮 代码示例: 带有快捷键的按钮 代码示例: 按钮的重复触发 2.Radio Buttion 代码示例: 选择性别 代码示例: click, press, release, toggled 的区别 代码示例: 单选框分组 3.3 Check Box 代码示例: 获取复选按钮的取值 1.Pu…