编辑
2025-07-16
服务器
00

目录

1. MinIO介绍
2. 部署条件
3. Docker无代理模式部署
3.1 Docker Compose文件详解
3.2 证书
3.2.1 自签证书
3.2.2 三方CA签发的证书
3.3 测试
4. Docker部署在Nginx代理后
4.1 Docker Compose文件详解
4.2 Nginx 配置文件
4.4 测试

minio.jpg

在现代应用中,海量非结构化数据的存储和管理愈发重要。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
yaml
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 自签证书

对于默认域名,密钥的格式如下。其他域名则再添加一个影响的目录。

bash
/opts/certs private.key # 默认域名 public.crt s3-example.net/ # 非默认域名 private.key public.crt

3.2.2 三方CA签发的证书

需要将CA的根证书放到/CAs下。如果由中间CA,也要放到这个目录下。

bash
/opts/certs private.key public.crt /CAs my-ca.crt

3.3 测试

可以通过https://域名/IP:9001来访问Admin Console。 查看容器内的日志,可以看到已经切换到https了。

bash
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网络是用于应用使用对象存储
yaml
services: 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

4.2 Nginx 配置文件

外部访问的只有Admin Console,所以我用宿主机的8010端口代理到MinIO的9001端口上。其他应用可以通过minio-network直接访问MinIO的API 9000端口。

bash
server { 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; } }

4.4 测试

可以通过宿主机的https://域名/IP:8010访问MinIO的Admin Console。

容器内部的日志显示是http,因为是Nginx做的SSL的终结。

bash
INFO: 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 许可协议。转载请注明出处!