在现代应用中,海量非结构化数据的存储和管理愈发重要。MinIO,作为开源且高性能的对象存储解决方案,凭借兼容S3 API和简洁部署方式,成为了开发者和企业用户的首选。本文将带你从基础认识MinIO开始,逐步深入,实战部署单机单盘模式,覆盖Docker Compose部署、HTTPS配置、自签与CA证书管理,最终通过Nginx实现内网端口代理访问,打造一个安全可靠的本地对象存储系统。无论你是初学者还是运维老手,这份教程都值得收藏!
1. MinIO介绍
MinIO是一个高性能、分布式、开源的对象存储系统,主要用于存储非结构化数据,如图片、视频、日志文件、备份数据以及容器/虚拟机镜像等。它基于Go语言开发,并实现了大部分亚马逊S3云存储服务接口,因此可以看作是S3的开源版本,能够与现有的S3生态系统无缝集成。
它分为社区版和企业版,其中社区版是完全开源的。它的部署方式分为单机单盘,单机多盘和多机多盘。生产环境是分布式部署,基本要求一个集群至少是3太分布在不同地方的服务器,每台服务器至少4张硬盘。我们自己使用基本就是单机单盘,所以除了没有额外的高可用性和容错性等特性。我们使用单机单盘的模式来进行MinIOn的学习。
2. 部署条件
只有在下列条件下MinIO才会以单机单盘的模式启动
- 数据卷或是挂载点是空的。
- 数据卷包含之前由单机单盘部署而储存的文件。
如果数据卷里不为空,但是不包含MinIO后端数据,则会启动失败。
数据卷状态 | MinIO行为 |
---|---|
无文件,目录和MinIO后端数据 | MinIO以单机单盘模式启动并创建0冗余(纠删码中的冗余级别)后端 |
带偶数校验的对象和MinIO后端数据 | MinIO恢复单机单盘模式 |
带文件系统的目录和文件,无MinIO后端数据 | MinIO无法启动并报错 |
3. Docker无代理模式部署
虽然可以使用http来访问,但是个人使用的情况下也建议使用https。如果使用http,可以忽略整数的部分。
3.1 Docker Compose文件详解
- 数据卷是存储位置
/data
- 默认的证书位置为
/root/.minio/certs
- 环境变量设置Root用户名密码
- 命令设置Admin Console监听的端口
- 9000端口用于API,9001端口用于Admin Console
services:
minio:
image: minio/minio:latest
container_name: minio
volumes:
- ./minio-data:/data
- ./etc/minio/certs:/root/.minio/certs:ro # Optional for HTTPS
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin123
command: server /data --console-address ":9001"
ports:
- "9000:9000" # API
- "9001:9001" # Admin Console
restart: unless-stopped
3.2 证书
如果证书不是以X.509标准生成的,则会被MinIO自动忽略。
3.2.1 自签证书
对于默认域名,密钥的格式如下。其他域名则再添加一个影响的目录。
/opts/certs
private.key # 默认域名
public.crt
s3-example.net/ # 非默认域名
private.key
public.crt
3.2.2 三方CA签发的证书
需要将CA的根证书放到/CAs下。如果有中间CA,也要放到这个目录下。
/opts/certs
private.key
public.crt
/CAs
my-ca.crt
3.3 测试
可以通过https://域名/IP:9001
来访问Admin Console。
查看容器内的日志,可以看到已经切换到https了。
MinIO Object Storage Server
Copyright: 2015-2025 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2025-06-13T11-33-47Z (go1.24.4 linux/amd64)
API: https://172.18.0.2:9000 https://127.0.0.1:9000
WebUI: https://172.18.0.2:9001 https://127.0.0.1:9001
Docs: https://docs.min.io
4. Docker部署在Nginx代理后
我的Nginx是已经部署了的,代理了不同的应用。由于我是在内网环境,我是通过端口来区分应用的。可以查看 Docker部署Nginx代理多个服务:公网域名与内网IP场景全解 Nginx的部署。
4.1 Docker Compose文件详解
- nginx-proxy-network网络是用于Nginx代理到容器
- minio-network网络是用于应用使用对象存储
- 使用MINIO_BROWSER_REDIRECT_URL来跳转到特定的路径,通过Nginx将特定的路径转发的后端的9001端口上,来实现Admin Console的访问。
services:
minio:
image: minio/minio:latest
container_name: minio
volumes:
- ./minio-data:/data
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin123
- MINIO_SERVER_URL=https://HOST_IP:8010
- MINIO_BROWSER_REDIRECT_URL=https://HOST_IP:8010/minio/ui
command: server /data --console-address ":9001"
networks:
- nginx-proxy-network
- minio-network
expose:
- 9000
- 9001
restart: unless-stopped
networks:
nginx-proxy-network:
external: true
minio-network:
external: true
4.2 Nginx 配置文件
我用宿主机的8010端口代理到MinIO容器。只有/minio/ui路径会代理到MinIO的Admin Console 9001端口上,其他路径代理到MinIO的API 9000端口。
server {
listen 8010 ssl;
server_name HOST_IP;
ssl_certificate /etc/nginx/certs/HOST_IP.cert.pem;
ssl_certificate_key /etc/nginx/certs/HOST_IP.key.pem;
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_pass http://minio:9000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
}
location /minio/ui/ {
proxy_pass http://minio:9001;
rewrite ^/minio/ui/(.*) /$1 break;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
# This is necessary to pass the correct IP to be hashed
real_ip_header X-Real-IP;
proxy_connect_timeout 300;
# To support websockets in MinIO versions released after January 2023
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
chunked_transfer_encoding off;
}
}
4.4 测试
可以通过宿主机的https://域名/IP:8010
访问MinIO的Admin Console。
MinIO Object Storage Server
Copyright: 2015-2025 MinIO, Inc.
License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Version: RELEASE.2025-06-13T11-33-47Z (go1.24.4 linux/amd64)
API: https://HOST_IP:Port:8010
WebUI: https://HOST_IP:Port/minio/ui
Docs: https://docs.min.io
📚 延伸阅读
更多内容持续更新于我的博客:https://www.zenseek.site