导读:在前面的篇章中,我们体验了直接在 CentOS 裸机上运行 MinIO。但在当下的微服务开发和测试环境中,Docker 才是主流。
很多新手一敲
docker run,看到 Web 界面出来了就以为大功告成。结果服务器一重启或者容器一重建,辛辛苦苦上传的文件"一夜回到解放前"!今天,我们就来聊聊如何用 Docker 优雅、安全地部署 MinIO,并彻底避开数据持久化和端口映射的那些大坑。
一、 避坑指南:为什么你的文件会离奇失踪?
经常有新手在群里问:"我昨天用 Docker 起了一个 MinIO,传了几个 G 的测试图片,今天清理了一下 Docker 容器,数据全白板了,Bucket 也没了,这是出 Bug 了吗?"
这不是 Bug,这是不懂 Docker 容器生命周期付出的代价。
Docker 容器默认的文件系统是临时的(Ephemeral)。 如果你不明确地把容器内部的数据目录与宿主机(你的物理机或云服务器)的硬盘挂载起来,当容器被删除或重建时,里面的数据就会跟着容器一起灰飞烟灭。
除此之外,新手用 Docker 部署 MinIO 还容易踩以下三个坑:
- 坑一:不挂载数据卷(Volume)。这是导致数据丢失的直接原因。
- 坑二:看老教程抄错环境变量 。很多网上的老教程还在用
MINIO_ACCESS_KEY,而在新版 MinIO 中这些参数早就被废弃了,写了也白写。 - 坑三:控制台端口随机漂移 。新版 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
四、 拔电源测试:如何验证数据真的安全了?
部署完了,心里还是不踏实?作为合格的运维,上线前必须做破坏性测试:
-
登录 MinIO 控制台(端口 9001)。
-
创建一个名为
test-bucket的存储桶,并手动上传一张图片。 -
回到终端,执行终极破坏命令,直接强制干掉 MinIO 容器!
bashdocker rm -f minio-server -
此时控制台肯定打不开了。然后我们用刚才的命令重新启动一个新的 MinIO 容器。
-
再次登录控制台。
你会惊喜地发现,test-bucket还在,那张图片也安安静静地躺在那里。而且,如果你跑到宿主机的/data/minio/data目录下,用ls命令查看,你会发现里面也生成了对应的文件目录结构。
只要宿主机的物理磁盘不坏、/data/minio/data目录不被误删,你的数据就坚如磐石。
五、 总结
在 Docker 环境下部署 MinIO,核心心法其实就两句:
认准两个端口(API 与 Console 不可混淆),死磕数据挂载(Volume 绝不能忘)。
搞定了稳定可靠的存储基座,基础的运维部署工作就算是踏实落地了。接下来,我们就能放心大胆地写代码,让业务系统真正用上对象存储的强大能力。