当前位置: 首页 > 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.dtcms.com/a/268308.html

相关文章:

  • list和list中的注意事项
  • 三位一体:Ovis-U1如何以30亿参数重构多模态AI格局?
  • K8s系列之:Kubernetes 的 RBAC (Role-Based Access Control)
  • 定时器怎么玩?做个LED渐变灯练手
  • 【面板数据】全球贸易救济立案案件(1995-2024年)
  • xyctf2025第三届京麒CTF
  • STM32之继电器模块
  • 11.6 ChatGPT训练第一步:深度解析SFT监督微调核心技术与实战全指南
  • C++ 基于广度优先搜索(BFS)的拓扑排序算法
  • 20250706-9-Docker快速入门(下)-Docker在线答疑_笔记
  • Linux 内存分配理论与水位机制全解
  • Mybatis--动态SQL
  • 前端防抖Debounce如何实现
  • Kafka “假死“现象深度解析与解决方案
  • JavaScript 中导入模块时,确实不需要显式地写 node_modules 路径。
  • week2
  • 基于 Rust 的前端工具基本实现
  • 【它加上100是一个完全平方数,再加上168又是一个完全平方数】2022-7-17
  • 第十六节:第三部分:多线程:线程安全问题、取钱问题的模拟
  • 浅谈漏洞扫描与工具
  • 计算机网络实验——互联网安全实验
  • 10046 解决 Oracle error
  • NLP文本预处理
  • Chunking-free RAG
  • 拼好题(各个平台的零散题目)
  • vue什么时候可以用index作为:key的索引
  • Vue计算属性(computed)全面解析:原理、用法与最佳实践
  • Python库 python-pyper 的详细使用(优秀的并发数据处理框架)
  • 第一次ctf比赛的赛后复现记录
  • ​保持矩阵秩不变的乘法