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

image

在现代应用中,海量非结构化数据的存储和管理愈发重要。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网络是用于应用使用对象存储
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端口。

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的终结。

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

📚 延伸阅读

更多内容持续更新于我的博客:https://www.zenseek.site

posted @ 2025-07-16 18:34  潘晓可  阅读(222)  评论(0)    收藏  举报