手动使用 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:9000
到http://192.168.1.104:9000
是所有 MinIO 节点的 API 地址。- 每个节点只需要挂载自己的数据目录
/data/minio
。 - MinIO 会自动发现其他节点并组成集群。
在 Server2、Server3、Server4 上执行类似的命令,只需将 IP 地址替换为各自的 IP 即可。
三、验证集群状态
- 访问任意一个节点的 Console 界面,如
http://192.168.1.101:9001
,使用minioadmin/minioadmin
登录。 - 在 Console 中可以看到集群的状态,包括所有节点是否正常。
- 也可以通过 MinIO 提供的
mc
命令行工具来管理集群。
四、使用 mc
客户端管理集群
- 下载
mc
:
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
- 配置 MinIO 集群别名:
mc alias set myminio http://192.168.1.101:9000 minioadmin minioadmin
- 查看集群状态:
mc admin info myminio
五、总结
- 开发/测试环境:可以使用 Docker Compose 模拟 MinIO 集群,但注意它只是模拟,不能实现真正的数据分布和冗余。
- 生产环境:建议在多台服务器上部署 MinIO 分布式集群,每个节点运行一个 Docker 容器,挂载自己的数据目录,并在启动时传入所有节点的 API 地址。