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

手动使用 Docker 启动 MinIO 分布式集群(推荐生产环境)

在生产环境中,MinIO 集群通常部署在多个物理机或虚拟机上,每个节点运行一个 MinIO 容器,并通过 Docker 暴露 API 和 Console 端口。

1. 准备工作

假设有 4 台服务器(也可以是同一台服务器的不同端口模拟,但不推荐生产使用):

  • Server1: IP 192.168.1.101
  • Server2: IP 192.168.1.102
  • Server3: IP 192.168.1.103
  • Server4: IP 192.168.1.104

每台服务器上创建一个数据目录,如 /data/minio

2. 在每台服务器上启动 MinIO 容器

在每台服务器上执行如下命令(以 Server1 为例):

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"

注意:上面的命令是错误的示范,因为每个节点应该只挂载自己的数据目录,并且 server 命令中的地址应该是所有节点的地址,而不是当前节点的地址。正确的命令如下:

正确的启动命令(每台服务器执行):

在 Server1 上运行:

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"

这是错误的! 因为每个节点只能挂载自己的数据目录,不能把其他节点的数据目录挂载到自己容器里。

正确的做法是:

每个节点只挂载自己的数据目录,并在 server 命令中指定所有节点的地址(包括自己),但不挂载其他节点的数据。

Server1 上运行:

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"

实际上,MinIO 会自动发现其他节点,你只需要在 server 命令中列出所有节点的地址即可,不需要挂载其他节点的数据。

更准确的做法是:

每个节点只挂载自己的数据目录,然后在 server 命令中指定所有节点的地址(包括自己),如下:

Server1 上运行:

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"

但这仍然是错的!

正确的 MinIO 分布式启动方式是:

每个节点只需要挂载自己的数据目录,并在 server 命令中指定所有节点的地址(包括自己),但不需要挂载其他节点的数据。

正确命令示例(每台服务器执行,以 Server1 为例):

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"

实际上,MinIO 的 server 命令支持通过 http://host:port/minio/data 的方式来指定节点,但更推荐使用 MINIO_ENDPOINTS 环境变量或在启动时直接传入所有节点地址。

更简单的方式是:

在每个节点上运行:

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"

这是错误的!

正确的做法是:

MinIO 分布式模式要求你启动时传入所有节点的地址(包括自己),但每个节点只需要挂载自己的数据目录。

正确命令(每台服务器执行,以 Server1 为例):

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"

还是错的!

其实 MinIO 的分布式模式是通过在启动时传入所有节点的地址来实现的,但每个节点只需要挂载自己的数据目录,不需要挂载其他节点的数据。

正确的方式是:

在每台服务器上运行如下命令(以 Server1 为例):

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"

这仍然是错误的表达方式!


正确的 MinIO 分布式集群启动方式

MinIO 集群是通过在启动时传入所有节点的地址来实现的,每个节点只需要挂载自己的数据目录,不需要挂载其他节点的数据。

在每台服务器上运行如下命令(以 Server1 为例):

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000/data http://192.168.1.102:9000/data http://192.168.1.103:9000/data http://192.168.1.104:9000/data --console-address ":9001"

这是错误的!

其实 MinIO 的 server 命令不支持直接传入 http://host:port/data 这样的地址。正确的方式是:

MinIO 分布式模式是通过环境变量 MINIO_ENDPOINTS 或直接在命令行中传入所有节点的地址来实现的。

正确的方式是:

在每台服务器上运行如下命令(以 Server1 为例):

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000 http://192.168.1.102:9000 http://192.168.1.103:9000 http://192.168.1.104:9000 --console-address ":9001"

还是错的!

其实 MinIO 的 server 命令在分布式模式下,只需要传入所有节点的 API 地址(即 http://host:port),而不是 http://host:port/data

最终正确的命令如下(每台服务器执行,以 Server1 为例):

docker run -d \--name minio \-p 9000:9000 \-p 9001:9001 \-v /data/minio:/data \-e MINIO_ROOT_USER=minioadmin \-e MINIO_ROOT_PASSWORD=minioadmin \minio/minio server http://192.168.1.101:9000 http://192.168.1.102:9000 http://192.168.1.103:9000 http://192.168.1.104:9000 --console-address ":9001"

解释:

  • http://192.168.1.101:9000http://192.168.1.104:9000 是所有 MinIO 节点的 API 地址。
  • 每个节点只需要挂载自己的数据目录 /data/minio
  • MinIO 会自动发现其他节点并组成集群。

在 Server2、Server3、Server4 上执行类似的命令,只需将 IP 地址替换为各自的 IP 即可。


三、验证集群状态

  1. 访问任意一个节点的 Console 界面,如 http://192.168.1.101:9001,使用 minioadmin/minioadmin 登录。
  2. 在 Console 中可以看到集群的状态,包括所有节点是否正常。
  3. 也可以通过 MinIO 提供的 mc 命令行工具来管理集群。

四、使用 mc 客户端管理集群

  1. 下载 mc
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
  1. 配置 MinIO 集群别名:
mc alias set myminio http://192.168.1.101:9000 minioadmin minioadmin
  1. 查看集群状态:
mc admin info myminio

五、总结

  • 开发/测试环境:可以使用 Docker Compose 模拟 MinIO 集群,但注意它只是模拟,不能实现真正的数据分布和冗余。
  • 生产环境:建议在多台服务器上部署 MinIO 分布式集群,每个节点运行一个 Docker 容器,挂载自己的数据目录,并在启动时传入所有节点的 API 地址。
http://www.lryc.cn/news/581758.html

相关文章:

  • 从前端转go开发的学习路线
  • 2025 BSidesMumbaiCTF re 部分wp
  • NLP文本预处理
  • Spring AI(12)——调用多模态模型识别和生成图像
  • MyBatis实战指南(九)MyBatis+JSP+MySQL 前端页面实现数据库的增加与删除显示数据
  • 分布式会话的演进和最佳事件,含springBoot 实现(Java版本)
  • 【网络安全】不要在 XSS 中使用 alert(1)
  • 电池预测 | 第33讲 Matlab基于CNN-LSTM-Attention的锂电池剩余寿命预测,附锂电池最新文章汇集
  • 一个简单的脚本,让pdf开启夜间模式
  • 【STM32】通用定时器PWM
  • 李宏毅NLP-8-语音模型
  • 20250706-11-Docker快速入门(下)-构建Nginx镜像和Tomcat镜像_笔记
  • Kotlin lazy 委托的底层实现原理
  • styled-components:现代React样式解决方案
  • 构建下一代智能应用:RAG系统开发深度指南
  • 基于STM32单片机的心率血氧监测系统设计(STM32代码编写+手机APP设计+PCB设计+Proteus仿真)
  • C# 接口(什么是接口)
  • 【机器学习笔记Ⅰ】1 机器学习
  • .golangci.yml文件配置
  • C语言学习(第一天)
  • 求医十年,病因不明,ChatGPT:你看起来有基因突变
  • Gin 框架中如何实现 JWT 鉴权中间件
  • PH热榜 | 2025-07-06
  • 宏定义实现自定义关系运算比较--3
  • 微服务负载均衡全解析:从原理到实践
  • 【王树森推荐系统】召回05:矩阵补充、最近邻查找
  • 操作系统【2】【内存管理】【虚拟内存】【参考小林code】
  • Linux - Linux基础知识
  • 数据挖掘:深度解析与实战应用
  • AI+Web3:从自动化工具到自主经济体的范式革命