在现代应用中,海量非结构化数据的存储和管理愈发重要。MinIO,作为开源且高性能的对象存储解决方案,凭借兼容S3 API和简洁部署方式,成为了开发者和企业用户的首选。本文将带你从基础认识MinIO开始,逐步深入,实战部署单机单盘模式,覆盖Docker Compose部署、HTTPS配置、自签与CA证书管理,最终通过Nginx实现内网端口代理访问,打造一个安全可靠的本地对象存储系统。无论你是初学者还是运维老手,这份教程都值得收藏!
MinIO是一个高性能、分布式、开源的对象存储系统,主要用于存储非结构化数据,如图片、视频、日志文件、备份数据以及容器/虚拟机镜像等。它基于Go语言开发,并实现了大部分亚马逊S3云存储服务接口,因此可以看作是S3的开源版本,能够与现有的S3生态系统无缝集成。
它分为社区版和企业版,其中社区版是完全开源的。它的部署方式分为单机单盘,单机多盘和多机多盘。生产环境是分布式部署,基本要求一个集群至少是3太分布在不同地方的服务器,每台服务器至少4张硬盘。我们自己使用基本就是单机单盘,所以除了没有额外的高可用性和容错性等特性。我们使用单机单盘的模式来进行MinIOn的学习。
只有在下列条件下MinIO才会以单机单盘的模式启动
如果数据卷里不为空,但是不包含MinIO后端数据,则会启动失败。
数据卷状态 | MinIO行为 |
---|---|
无文件,目录和MinIO后端数据 | MinIO以单机单盘模式启动并创建0冗余(纠删码中的冗余级别)后端 |
带偶数校验的对象和MinIO后端数据 | MinIO恢复单机单盘模式 |
带文件系统的目录和文件,无MinIO后端数据 | MinIO无法启动并报错 |
虽然可以使用http来访问,但是个人使用的情况下也建议使用https。如果使用http,可以忽略整数的部分。
/data
/root/.minio/certs
yamlservices:
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
如果证书不是以X.509标准生成的,则会被MinIO自动忽略。
对于默认域名,密钥的格式如下。其他域名则再添加一个影响的目录。
bash/opts/certs
private.key # 默认域名
public.crt
s3-example.net/ # 非默认域名
private.key
public.crt
需要将CA的根证书放到/CAs下。如果由中间CA,也要放到这个目录下。
bash/opts/certs private.key public.crt /CAs my-ca.crt
可以通过https://域名/IP:9001
来访问Admin Console。
查看容器内的日志,可以看到已经切换到https了。
bashMinIO 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
我的Nginx是已经部署了的,代理了不同的应用。由于我是在内网环境,我是通过端口来区分应用的。可以查看 Docker部署Nginx代理多个服务:公网域名与内网IP场景全解 Nginx的部署。
yamlservices:
minio:
image: minio/minio:latest
container_name: minio
volumes:
- ./minio-data:/data
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin123
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
外部访问的只有Admin Console,所以我用宿主机的8010端口代理到MinIO的9001端口上。其他应用可以通过minio-network直接访问MinIO的API 9000端口。
bashserver {
listen 8010 ssl;
server_name ——;
ssl_certificate /etc/nginx/certs/public.cert;
ssl_certificate_key /etc/nginx/certs/private.key;
# SSL/TLS Security Settings
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;
# Enable HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
proxy_pass http://minio:9001/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Connection "keep-alive";
proxy_cache_bypass $http_upgrade;
}
}
可以通过宿主机的https://域名/IP:8010
访问MinIO的Admin Console。
容器内部的日志显示是http,因为是Nginx做的SSL的终结。
bashINFO: Formatting 1st pool, 1 set(s), 1 drives per set.
INFO: WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable.
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: http://172.30.0.6:9000 http://192.168.2.1:9000 http://127.0.0.1:9000
WebUI: http://172.30.0.6:9001 http://192.168.2.1:9001 http://127.0.0.1:9001
Docs: https://docs.min.io
本文作者:潘晓可
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!