从零开始部署MinIO对象存储:单机单盘+Docker+Nginx代理全攻略!

在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值