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

news2024/11/15 8:56:04

上一篇文章中,我们使用 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-23Z

RELEASE.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:9001
    image: minio/minio:RELEASE.2024-08-03T04-33-23Z
    command: server /data --console-address ":9001"

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

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

cp docker-compose.simple.yml docker-compose.yml

docker 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: minio

services:
  minio:
    container_name: minio
    ports:
      - 9000:9000
      - 9001:9001
    image: minio/minio:RELEASE.2024-08-03T04-33-23Z
    environment:
      # 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.html
    command: server /data --address=":9000" --console-address=":9001"
    volumes:
      - ./minio/data:/data
      - ./minio/config:/root/.minio
    extra_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/18389
        test: ["CMD", "mc", "ready", "local"]
        interval: 3s
        timeout: 10s
        retries: 12

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

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

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

cp docker-compose.standalone.yml docker-compose.yml

docker 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: minio

services:
  minio:
    ...
    networks:
      - traefik

networks:
  traefik:
    external: true

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

name: minio

services:
  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: minio

services:
  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.yml

docker 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: minio

services:
  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.html
    command: server /data --address=":${API_PORT}" --console-address=":${DASHBOARD_PORT}"
    volumes:
      - ./minio/data:/data
      - ./minio/config:/root/.minio
    extra_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/18389
        test: ["CMD", "mc", "ready", "local"]
        interval: 3s
        timeout: 10s
        retries: 12

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

name: minio

services:
  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.html
    command: server /data --address=":${API_PORT}" --console-address=":${DASHBOARD_PORT}"
    networks:
      - traefik
    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(`${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/.minio
    extra_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/18389
        test: ["CMD", "mc", "ready", "local"]
        interval: 3s
        timeout: 10s
        retries: 12

networks:
  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.coloradmin.cn/o/1981321.html

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

相关文章

C语言:qsort详解

在上一篇文章我们大致的了解了回调函数的用法和作用,在这一篇让我们来了解一下在回调函数qsort的使用吧。 一.qsort qsort是一种用来排各种类型数据的函数,利用的是快速排序的方式。说到排序,我们就想到了之前学习的冒泡排序,但…

MySQL数据如何高效实时同步到Elasticsearch?【送源码】

概述 在实际的项目开发与运维过程中,MySQL 常常扮演着业务数据库的核心角色,以其强大的事务处理能力和数据完整性保障,支撑着系统的稳定运行。然而,随着数据量的急剧增长和查询复杂度的不断提升,单一依赖 MySQL 进行高…

文章管理接口——里面有动态SQL编写,在分页查询里

1.实体类和表结构 2. 新增文章分类 接口文档 实现 完整代码放在校验部分 结果: 参数校验(Validation自定义) 对state的校验(已发布|草稿),已有的注解不能满足校验需求,这时就需要自定义校验注解…

Day30 | 62.不同路径 63. 不同路径 II 343.整数拆分 96不同的二叉搜索树

语言 Java 62.不同路径 不同路径 题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问…

JVM类加载中的双亲委派机制

【1】什么是双亲委派 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理&#xff0c…

【Git企业级开发实战指南①】Git安装、基本操作!

目录 一、Git是什么?1.1特点1.2功能1.3基本概念 二、Git安装2.1Ubuntu下安装2.2Centos下安装Git 三、Git基本操作3.1创建git本地仓库3.2配置Git3.3 工作区&暂存区&版本库3.4 实操案例3.4.1添加文件 3.5 修改文件3.6版本回退3.7查看历史操作日志3.7撤销修改3…

广东省各区县农业产量数据,数据精度至各区县,2020-2023年四年数据可选!

数据名称: 广东省各区县农业产量数据 数据格式: Shpexcel 数据几何类型: 面 数据坐标系: WGS84 数据时间:2020-2023年 数据来源:广东省统计年鉴 数据字段: 序号字段名称字段说明1province省份名称2city城市名称3county区县名称4cou…

【C++深度探索】红黑树的底层实现机制

🔥 个人主页:大耳朵土土垚 🔥 所属专栏:C从入门至进阶 这里将会不定期更新有关C/C的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 前言 红…

VNC未授权访问漏洞

VNC 是虚拟网络控制台Virtual Network Console的英文缩写。它是一款优秀的远程控制工具软件由美国电话电报公司AT&T的欧洲研究实验室开发。VNC是基于 UNXI 和 Linux 的免费开源软件由 VNC Server 和 VNC Viewer 两部分组成。VNC 默认端口号为 5900、5901。VNC 未授权访问漏…

STM32F407移植LVGL(V8.3版本)

一、LVGL简述 1.丰富且强大的模块化图形组件:按钮、图表、列表、滑条、图片等 2.高级图形引擎:动画、抗锯齿、透明度、平滑滚动、图层混合等效果 3.支持多种输入设备:触摸屏、键盘、编码器、按键等 4.配置可裁剪,最低资源占用&am…

latex中Function函数报错

latex写伪码时,发现报错,截图如下: 解决办法,添加宏包,截图如下: \usepackage{algpseudocode}

虚幻引擎 C++ 实现平面阴影

1、平面阴影介绍 平面阴影是一种相对简单的渲染阴影的方式,可以理解为对一个模型渲染两次,一次是渲染模型本身,另一次是渲染模型的投影。渲染投影可以看作是将模型的顶点变换到地面的投影空间再渲染,可以理解为渲染了一个“压扁”…

pytorch学习笔记6 tensor拼接和拆分

cat 合并 dim必须首选相同(上例都是3),其次除了合并的dim(上例中为dim0)外,其它dim的size必须相同(dim 1的size是32,dim2的size是8),否则需要手动处理到相同…

vue3 + Spingboot + oracle 通过Base64存储图片

一 、前言 近期在做vue3 Springboot oracle 的工作&#xff0c;有个小功能通过页面导入图片保存到oracle数据库中&#xff0c;本人对前端不是很熟悉&#xff0c;借此记录一下实现方法&#xff1b; 二、前端部分代码 <template><div class"dialog-mian"&…

SQL注入实例(sqli-labs/less-7)

0、初始页面 1、确定闭合字符 确定闭合字符为单引号括号括号 )) ?id1 and 11 ?id1 and 12 ?id1 ?id1)) 2、查看securie_file_priv参数 ?id1)) and upddatexml(1,concat(0x7e,(select secure_file_priv),0x7e),1) -- 3、写入一句话木马 ?id1)) union select null,&q…

SFT、RLHF、DPO、IFT —— LLM 微调的进化之路

TL;DR • SFT、RLHF 和 DPO 都是先估计 LLMs 本身的偏好&#xff0c;再与人类的偏好进行对齐&#xff1b; • SFT 只通过 LLMs 生成的下一个单词进行估计&#xff0c;而 RLHF 和 DPO 通过 LLMs 生成的完整句子进行估计&#xff0c;显然后者的估计会更准确&#xff1b; • 虽然…

壹连科技净利润增速放缓:毛利率清一色下滑,研发费用率远弱同行

《港湾商业观察》施子夫 王璐 从2022年6月20日递表创业板以来&#xff0c;深圳壹连科技股份有限公司&#xff08;以下简称&#xff0c;壹连科技&#xff09;已经走了2年多的历程&#xff0c;如今离挂牌上市近在咫尺。 今年7月22日&#xff0c;壹连科技提交了注册申请。8月2日…

哪个电脑桌面便签好用并且无广告弹窗?

在日常生活和工作中&#xff0c;很多人喜欢在电脑桌面上使用便签软件。便签软件可以方便地记录临时任务、重要信息或者待办事项&#xff0c;帮助用户更好地管理时间和提高工作效率。想象一下&#xff0c;在繁忙的工作中&#xff0c;你能够快速在桌面便签上记下即将要做的任务&a…

基本K8s搭建Jekins+gitee项目自动部署

这里写目录标题 1.基本K8s部署安装Jekins2.设置Jenkins国内镜像源2.安装Gitee插件1.安装Gitee Plugin2.验证安装Gitee Plugin 3.新建任务1.输入任务名称2.输入你gitee上的项目链接3.测试构建 4.查看项目在k8s集群master节点的位置1.确认 Jenkins Pod 名称2.使用kubectl exec到 …

大数据技术复习--概述

概述 数据的概念&#xff1a;数据是指对客观事件进行记录并可以鉴别的符号&#xff0c;是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合&#xff0c;是可识别的、抽象的符号。 数据类型&#xff1a;文本、图片、音频、视频 从数据的结构化程…