本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 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 服务的基础搭建。 ## 写在前面 说起 MinIO 和“对象存储”,其实在早些时候,已经写过不少和 MinIO 相关的内容了: - 2021 年《[使用容器搭建简单可靠的容器仓库](https://soulteary.com/2021/04/13/use-docker-to-build-a-simple-and-reliable-container-registry.html)》文章中,分享了使用 MinIO 作为容器的存储后端。 - 2021 年《[从零开始使用开源文档/Wiki软件 Outline(二)](https://soulteary.com/2021/09/11/opensource-documentation-wiki-software-outline-part-2.html#%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E5%9B%BE%E7%89%87%E7%AE%A1%E7%90%86)》文章中,使用 MinIO 作为 Outline 的存储后端,介绍了如何编写初始化配置程序来对 MinIO 进行快速初始化等。 - 2021 年《[装在笔记本里的私有云环境:网络存储篇(上)](https://soulteary.com/2021/11/04/private-cloud-environment-installed-in-a-notebook-storage-part-1.html#%E6%90%AD%E5%BB%BA%E9%80%9A%E7%94%A8%E5%AD%98%E5%82%A8%E7%BD%91%E5%85%B3-minio)》文章中,讲过如何使用 Traefik v2 快速搭建 MinIO 存储网关。 - 2021 年《[装在笔记本里的私有云环境:网络存储篇(中)](https://soulteary.com/2021/11/09/private-cloud-environment-installed-in-a-notebook-storage-part-2.html)》文章中,讲了如何对 MinIO 添加监控程序,做性能指标收集。 - 2022 年《[使用 Mastodon 搭建个人信息平台:调优篇](https://soulteary.com/2022/01/25/building-a-personal-information-platform-with-mastodon-part-2.html)》文章中,聊了解决直接使用 MinIO 提供静态资源服务,并解决跨域资源使用的问题。 … ![MinIO 是目前开源领域实至名归的头部方案](https://attachment.soulteary.com/2024/08/05/minio.jpg) 这几年随着 AI 行业的爆炸式发展,MinIO 的用户量和应用范围变的更加广阔。除了基础模型厂商和研究机构,在前几年已经开始大规模使用 MinIO 作为模型训练场景的基础组件,多数用户或许只是拿它作为简单的存储组件使用。 时至今日,我们不仅仅可以用它来打通各种软件数据存储和共享、进行跨设备的数据备份、同步,还能够在 RAG 场景中,使用它来做大规模的语料存储。 **为了后续上述场景中,我们能够愉快玩耍。** 让我们从最简单的用法开始,了解该如何和 Traefik 一起结合使用,快速完成私有化的对象存储服务的搭建。 文本中相关的代码,我已经开源在了 [soulteary/traefik-minio-example](https://github.com/soulteary/traefik-minio-example),有需要自取。 ## 准备工作 这篇文章的准备工作非常简单,只需要完成 Docker 运行环境的安装、下载基础配置代码、程序镜像的下载即可。 ### 获取基础配置代码 使用 `git` 将包含基础配置的项目下载到本地: ```bash git clone https://github.com/soulteary/traefik-minio-example.git ``` 然后,进入代码目录: ```bash cd traefik-minio-example ``` ### Docker 环境的准备 如果你已经安装了 Docker ,那么可以跳过这个小节。 如果你还没有安装 Docker,不论你使用的是 Windows、Linux、macOS,都可以相对快速简单的完成 Docker 的安装和简单配置。 你可以参考之前的一些文章:《[Docker 环境下使用 Traefik 3 的最佳实践:快速上手](https://soulteary.com/2024/08/04/best-practices-for-traefik-3-in-docker-getting-started-quickly.html#docker-%E7%8E%AF%E5%A2%83)》中的“Docker 环境”、《[基于 Docker 的深度学习环境:Windows 篇](https://soulteary.com/2023/07/29/docker-based-deep-learning-environment-under-windows.html)》中的“准备 Docker 虚拟化运行环境” 或者《[在笔记本上搭建高性价比的 Linux 学习环境:基础篇](https://soulteary.com/2022/06/21/building-a-cost-effective-linux-learning-environment-on-a-laptop-the-basics.html)》中的“更简单的 Docker 安装”,来根据不同的操作系统,完成相关的配置,这里就不多做赘述了。 ### MinIO Docker 镜像下载 虽然 MinIO 官方的文档告诉我们,使用它直接下载 `latest` 镜像就行(不携带版本)。但是,在以往的使用过程中,发现过升级版本,没有完整向后兼容的问题。 为了减少不必要的麻烦,这里建议始终携带一个较新版本的,如: ```bash docker pull minio/minio:RELEASE.2024-08-03T04-33-23Z ``` 因为 MinIO 特别小巧,下载过程会相对比较快: ```yaml # 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 官方的下载页面](https://min.io/download?license=agpl&platform=docker),我们能够看到官方推荐的使用方法: ```bash podman run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address ":9001" ``` 用上一篇文章提到的 “[命令行转换配置大法](https://soulteary.com/2024/08/04/best-practices-for-traefik-3-in-docker-getting-started-quickly.html#%E5%BF%AB%E9%80%9F%E5%90%AF%E5%8A%A8%E4%B8%80%E4%B8%AA%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C%E5%88%B0-traefik-%E4%B8%8A)”,可以快速的得到下面的 Docker Compose 配置: ```yaml 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` 来启动一个服务 `9000` 和 `9001` 端口的 minio 容器实例。 如果你已经完成了基础配置代码的下载,上面的配置已经保存在示例的基础配置代码中了。我们可以执行下面的命令,快速的体验最基础的 MinIO 使用方法。 ```bash cp docker-compose.simple.yml docker-compose.yml docker compose up ``` 当我们看到类似下面的日志之后,就可以通过浏览器访问 MinIO 了。 ```bash 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 控制面板登录界面](https://attachment.soulteary.com/2024/08/05/minio-dashboard.jpg) 默认情况下,我们使用 `minioadmin` 作为账号和密码,就能够登录 MinIO 后台进行管理了。 ![MinIO 控制面板登录后界面](https://attachment.soulteary.com/2024/08/05/minio-admin.jpg) 如果你使用过 AWS S3、阿里云或腾讯云的对象存储,那么你对左侧的“对象浏览器”、“访问密钥管理”、“存储桶管理”、“访问策略管理”、“用户身份管理” 等等功能应该会比较熟悉。 如果你不熟悉也没有关系,接下来的内容和后续的使用中,多使用使用,自然就熟悉了。 ### 使用 MinIO 管理后台存储文件 考虑到有一部分同学没有接触过对象存储或 MinIO 类似的产品,这里我们简单介绍下 MinIO 的基础使用。如果你已经熟悉,可以跳过这个小节,了解更完善的搭建方法。 ![在 MinIO 后台创建一个“存储桶”](https://attachment.soulteary.com/2024/08/05/minio-create-bucket.jpg) 想要使用 MinIO 这类产品进行对象存储,我们首先需要创建一个“存储桶”(Bucket),在 MinIO 侧边栏中选择 Bucket,然后创建一个新的 Bucket 即可,名字根据自己的需求起即可,我这里随便写了一个“say-hi”。 ![查看 Bucket 的详细情况](https://attachment.soulteary.com/2024/08/05/minio-bucket-info.jpg) 创建之后,我们可以在后台看到这个 Bucket 的详细情况,以及做一些细节的权限设置,副本设置等等。 ![在 MinIO 后台完成文件的上传](https://attachment.soulteary.com/2024/08/05/minio-file-upload.jpg) 选择侧边栏的“对象管理器”,然后选择这个我们创建的 Bucket,可以随便上传文件或者文件夹。我这里上传了一个使用 AI 将图片生成的短视频。 ![在 MinIO 后台进行文件的操作](https://attachment.soulteary.com/2024/08/05/minio-file-op.jpg) 文件上传之后,我们能够在这个控制台进行一些简单的操作:下载、分享、预览、删除等等。 ![在 MinIO 后台预览上传文件](https://attachment.soulteary.com/2024/08/05/minio-file-preview.jpg) 比如,我这里点击了预览,就能够直接在浏览器中浏览这个视频啦。当然,你也可以将预览或者下载的链接嵌入你需要嵌入的文档、程序中使用。 ### 使用客户端来完成文件的管理 使用网页进行操作,当然非常的简单。但是如果我们想要操作大量的文件,或者在其他的程序中使用 MinIO 提供的对象存储能力呢? MinIO 和我们使用的云服务商一样,支持通过编程的方式,或标准化集成的方式来访问存储能力。 首先,我们需要创建一个“访问授权”密钥。 ![在 MinIO 后台选择 “Access Keys”](https://attachment.soulteary.com/2024/08/05/minio-ak-list.jpg) 选择侧边栏的 “Access Keys”,创建一个新的授权密钥。 ![在 MinIO 后台创建 Access Key](https://attachment.soulteary.com/2024/08/05/create-ak.jpg) 默认创建的密钥都是随机创建的字符串 “乱码”。 ![在 MinIO 后台为访问密钥起名字](https://attachment.soulteary.com/2024/08/05/minio-custom-ak.jpg) 这里有个小经验,密钥名称其实是可以修改的。为了更好的区分访问密钥的用途,建议手动修改密钥的名字。 如果你有支持 S3 协议的软件,可以使用你自己的软件来测试和验证刚刚启动的 MinIO 服务。如果你没有的话,可以根据自己的操作系统,选择一些支持 S3 协议的软件。 ![Windows 可以使用的 S3 浏览器](https://attachment.soulteary.com/2024/08/05/s3-tool.jpg) 如果你是 Windows 环境,可以使用一些类似 S3 Browser 的工具、包括 Cyberduck 等等,完成简单配置,进行服务验证。 ![macOS 可以使用类似的软件](https://attachment.soulteary.com/2024/08/05/minio-fs-mount.jpg) macOS 同样可以使用 Cyberduck,不过我这里使用的是另外一款类似的软件,完成简单的配置之后,选择“挂载”,就能够将 MinIO 中的某个 Bucket,挂载为本地的磁盘使用了。 ![完成 S3 本地磁盘挂载](https://attachment.soulteary.com/2024/08/05/minio-s3-drive.jpg) 当然,我们也可以在各种编程语言中使用对应的 S3 SDK 来使用这个存储能力。除了 AWS 和 MinIO S3 SDK 之外,GitHub 上还有许多[其他社区用户的实现](https://github.com/search?q=s3+sdk&type=repositories),都可以参考使用。 ## 更完善的 MinIO Docker 使用方案 相比较直接使用官方的默认命令转换的 Docker Compose 配置,下面的配置中会更适合我们快速本地搭建一个存储服务: ```yaml 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 容器服务啦。 ```bash cp docker-compose.standalone.yml docker-compose.yml docker compose up ``` 执行完命令,就能够看到熟悉,但是有一些不同的服务运行状态啦(更明确的运行状态)。 ```bash # 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 使用 还是使用上面的配置,在配置中添加“网络”相关内容: ```yaml name: minio services: minio: ... networks: - traefik networks: traefik: external: true ``` 接着,在程序容器“标签”中声明一些必要的信息,来辅助 Traefik 更好的理解和注册我们的程序为 HTTPS 服务: ```yaml 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 和管理后台绑定了不同的服务域名。这里,我们还可以在后台的“中间件”中添加更多的“安全访问”限制的功能,比如额外的身份验证。 ```yaml 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](https://github.com/soulteary/traefik-minio-example/blob/main/docker-compose.traefik.yml),考虑到篇幅长度,就不再粘贴。 使用方法和上面一样: ```bash cp docker-compose.traefik.yml docker-compose.yml docker compose up ``` 服务启动后,我们就能够通过新的域名(`minio.console.lab.io`)来访问 MinIO 管理后台啦。 ![使用独立域名访问 MinIO 管理后台](https://attachment.soulteary.com/2024/08/05/use-domain-access-dashboard.jpg) 我们可以通过许多种方式,来通过 MinIO API 接口域名,来提供资源的访问,包括开放“存储桶”的访问权限,给私有存储桶开放某些路径的访问权限,或者使用 API 来获取桶中的内容。 因为是验证,这里做一个简单的演示,将桶类所有路径都设置为开放访问。 ![开放存储桶的访问权限](https://attachment.soulteary.com/2024/08/05/open-access.jpg) 在我们设置完所有路径都开放访问后,就可以使用下面的路径来访问上文中上传到服务中的资源啦。 ```bash # https://域名/桶名称/资源名称 https://minio.lab.io/say-hi/bigbro.mp4 ``` ![爱因斯坦,你好呀](https://attachment.soulteary.com/2024/08/05/use-domain-access-res.jpg) ## 对上面的服务进行抽象 上面的服务配置中,我们 HardCode 了一些内容。 为了能够更快的搭建各种“个性化”的服务,来适配不同的场景,和上篇文章一样,我们对它进行服务抽象。 ### 抽象配置文件 先来定义核心的配置文件 `.env`: ```yaml # 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 的容器配置: ```yaml 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 使用的容器配置: ```yaml 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](https://github.com/soulteary/traefik-minio-example),希望你玩的开心。 ## 其他 相信看完上面的内容后,你应该已经能够搭建出单一磁盘支持的私有化的 S3 存储服务。 为了服务的可靠性,我个人建议做两件事情。 你可以通过各种方式,让容器能够同时访问多块物理磁盘。然后结合 [MinIO 服务目录](https://min.io/docs/minio/linux/reference/minio-server/minio-server.html#minio.server.DIRECTORIES),设置 MinIO 使用多块磁盘,而非一块磁盘。[MinIO 支持的纠删码](https://min.io/product/erasure-code-calculator),能够让我们以相对低的成本,完成数据在物理层面的可靠性保障。 当遇到极端情况的时候,数据依旧能够被正确的读取和修复。 除此之外,我们还可以进行一些数据备份操作,参考 “[桶复制](https://min.io/docs/minio/kubernetes/upstream/administration/bucket-replication.html)” ,你可以使用 MinIO 的 CLI 或者管理界面,配置数据同步、备份策略,确保数据有多份副本存储。 ## 最后 好了,这篇文章,同样写了比较长的篇幅,希望对你有帮助。 --EOF