Docker环境下的MinIO安装,以及如何正确配置数据持久化(避坑篇)

导读:在前面的篇章中,我们体验了直接在 CentOS 裸机上运行 MinIO。但在当下的微服务开发和测试环境中,Docker 才是主流。

很多新手一敲 docker run,看到 Web 界面出来了就以为大功告成。结果服务器一重启或者容器一重建,辛辛苦苦上传的文件"一夜回到解放前"!今天,我们就来聊聊如何用 Docker 优雅、安全地部署 MinIO,并彻底避开数据持久化和端口映射的那些大坑。

一、 避坑指南:为什么你的文件会离奇失踪?

经常有新手在群里问:"我昨天用 Docker 起了一个 MinIO,传了几个 G 的测试图片,今天清理了一下 Docker 容器,数据全白板了,Bucket 也没了,这是出 Bug 了吗?"

这不是 Bug,这是不懂 Docker 容器生命周期付出的代价。
Docker 容器默认的文件系统是临时的(Ephemeral)。 如果你不明确地把容器内部的数据目录与宿主机(你的物理机或云服务器)的硬盘挂载起来,当容器被删除或重建时,里面的数据就会跟着容器一起灰飞烟灭。

除此之外,新手用 Docker 部署 MinIO 还容易踩以下三个坑:

  1. 坑一:不挂载数据卷(Volume)。这是导致数据丢失的直接原因。
  2. 坑二:看老教程抄错环境变量 。很多网上的老教程还在用 MINIO_ACCESS_KEY,而在新版 MinIO 中这些参数早就被废弃了,写了也白写。
  3. 坑三:控制台端口随机漂移 。新版 MinIO 如果不明确指定控制台端口,每次启动会随机分配一个,导致你用 Docker 映射的静态端口根本打不开后台页面。
    接下来,我们用正确的姿势,一步步避开这些坑。

二、 正确的 docker run 部署姿势

为了让数据持久化,我们需要在宿主机上准备一个目录,比如 /data/minio/data,然后把它映射到容器内部。
1. 创建宿主机的数据存储目录

(请在宿主机的 Linux 终端执行)

bash 复制代码
mkdir -p /data/minio/data
mkdir -p /data/minio/config

2. 执行启动命令(请仔细看下方参数解析)

bash 复制代码
docker run -d \
  -p 9000:9000 \
  -p 9001:9001 \
  --name minio \
  --restart=always \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=Admin_password123" \
  -v /data/minio/data:/data \
  -v /data/minio/config:/root/.minio \
  minio/minio server /data --console-address ":9001"

核心保命参数解析:

  • -p 9000:9000:映射 API 通信端口,你的 Java/Go 代码里连的就是这个。
  • -p 9001:9001:映射 Web 管理控制台端口。
  • --restart=always:保证 Docker 服务重启(或宿主机重启)时,MinIO 容器也能自动拉起。
  • -e "MINIO_ROOT_USER=..."【新版必填】 替代老的 Access Key,设置超级管理员账号。
  • -e "MINIO_ROOT_PASSWORD=..."【新版必填】 设置超级管理员密码(长度必须大于等于 8 位)。
  • -v /data/minio/data:/data【持久化核心】 将宿主机的目录挂载到容器内的 /data 目录。你以后上传的文件,其实都是实打实地存在宿主机的 /data/minio/data 下。
  • --console-address ":9001"【避坑核心】 强制 MinIO 的 Web 控制台绑定在 9001 端口,绝不允许它随机漂移!
    跑完这段命令,输入 docker ps,看到 MinIO 正在运行,就可以在浏览器里访问 http://服务器IP:9001 了。

三、 进阶推荐:使用 Docker Compose 一键部署

相比于又长又容易敲错的 docker run 命令,在实际的开发环境和生产运维中,我们更推荐使用 Docker Compose 。它能把复杂的配置固化到 YAML 文件里,一目了然。
1. 创建并编辑 docker-compose.yml 文件

在一个空目录下新建 docker-compose.yml 文件:

yaml 复制代码
version: '3.8'
services:
  minio:
    image: minio/minio:latest
    container_name: minio-server
    restart: always
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      - MINIO_ROOT_USER=admin
      - MINIO_ROOT_PASSWORD=Admin_password123
      - TZ=Asia/Shanghai  # 修正时区,防止查日志时时间错乱
    volumes:
      - /data/minio/data:/data
      - /data/minio/config:/root/.minio
    command: server /data --console-address ":9001"

2. 一键启动

在这个文件所在的目录下,执行以下命令即可在后台启动:

bash 复制代码
docker-compose up -d

想要停止并删除容器(此时由于做了挂载,数据绝对不会丢):

bash 复制代码
docker-compose down

四、 拔电源测试:如何验证数据真的安全了?

部署完了,心里还是不踏实?作为合格的运维,上线前必须做破坏性测试:

  1. 登录 MinIO 控制台(端口 9001)。

  2. 创建一个名为 test-bucket 的存储桶,并手动上传一张图片。

  3. 回到终端,执行终极破坏命令,直接强制干掉 MinIO 容器!

    bash 复制代码
    docker rm -f minio-server
  4. 此时控制台肯定打不开了。然后我们用刚才的命令重新启动一个新的 MinIO 容器。

  5. 再次登录控制台。
    你会惊喜地发现,test-bucket 还在,那张图片也安安静静地躺在那里。而且,如果你跑到宿主机的 /data/minio/data 目录下,用 ls 命令查看,你会发现里面也生成了对应的文件目录结构。
    只要宿主机的物理磁盘不坏、/data/minio/data 目录不被误删,你的数据就坚如磐石。


五、 总结

在 Docker 环境下部署 MinIO,核心心法其实就两句:
认准两个端口(API 与 Console 不可混淆),死磕数据挂载(Volume 绝不能忘)。

搞定了稳定可靠的存储基座,基础的运维部署工作就算是踏实落地了。接下来,我们就能放心大胆地写代码,让业务系统真正用上对象存储的强大能力。

相关推荐
Agent产品评测局2 小时前
物流供应链自动化解决方案选型,全链路提效指南:从硬件集成到AI Agent的演进路径
运维·人工智能·ai·chatgpt·自动化
会飞的大可3 小时前
Docker容器项目无法访问MySQL的解决策略
mysql·docker·容器
钟智强3 小时前
Linux SSH密码爆破脚本,从原理到实践
linux·运维·ssh
cool32003 小时前
二进制基于kubeasz部署 K8s 1.34.x 高可用集群实战指南-第一章节基础环境准备(1-4)
云原生·容器·kubernetes
sg_knight3 小时前
MinIO自带的Web Console管理后台怎么用?日常管理操作全解
前端·文件管理·minio·ftp·cos·oss
Linux蓝魔3 小时前
麒麟官方yum源配置V10SP2-V10SP3-V10SP3-2403
大数据·linux·运维
helloliyh3 小时前
linux 删除指定日期目录(包括目录下文件)
linux·运维·服务器
半个俗人3 小时前
06.Linux用户权限相关命令
linux·运维·服务器
涛声依旧393163 小时前
构建部署kubernetes所需主机
linux·运维·云原生·容器·kubernetes