在ubuntu22下配置minio服务
vim docker-compose.yml (这里不需要加 version信息,不然启动会报 docker-compose.yml: `version` is obsolete)
添加如下内容:
services:
minio:
image: minio/minio:latest
container_name: minio
ports:
- "9002:9000" # API 端口 (宿主机访问需要的话保留)
- "9003:9001" # 控制台端口
environment:
MINIO_ROOT_USER: admin
MINIO_ROOT_PASSWORD: secret123
volumes:
- minio_data:/data
command: server /data --console-address ":9001"
restart: unless-stopped
networks:
- docker_network-internal # ✅ 和 symfony 一样的网络
volumes:
minio_data:
networks:
docker_network-internal: # ✅ 定义内部网络
external: true # ⚠️ 如果这个网络已经在 Symfony 的 compose 文件里定义过,就加 external
执行:
docker-compose up -d
查看容器运行状态:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4ee821f0460 minio/minio:latest "/usr/bin/docker-ent…" 51 seconds ago Up 50 seconds 0.0.0.0:9002->9000/tcp, :::9002->9000/tcp, 0.0.0.0:9003->9001/tcp, :::9003->9001/tcp minio
资源访问,默认访问会报如下错误
需要设置内容为public,默认是不能对外访问的
# Mac / Linux
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
添加别名
mc alias set localminio http://localhost:9002 admin secret123
将 Bucket 设置为公开(匿名访问)
mc anonymous set download localminio/media
设置为私有
mc anonymous set none localminio/media
参数说明:
download → 允许匿名下载(公开读取)
media → 你的 Bucket 名称
验证:
$ mc anonymous list localminio/media
media/* => readonly
返回 Bucket 对象列表
访问 URL 就不再报 Access Denied
使用问题
发现第一次上传图片的size一直为0,然后我手动上传一张图片
上传图片并设置 MIME
mc cp --attr "Content-Type=image/jpeg" ./image.jpg localminio/media/
然后再通过控制面板上传就可以了,不知道为什么. 但是通过控制面板上传视频的时候是可以的.
在项目中使用,使用S3上传
symfony7下使用, 安装包:
composer require aws/aws-sdk-php环境变量:
MINIO_ENDPOINT=http://minio:9000 MINIO_ACCESS_KEY=admin MINIO_SECRET_KEY=secret123 MINIO_BUCKET=media测试路由:
#[Route('/test', name: 'test', methods: ['GET'])] public function test() { $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1', // 只需填写任意字符串 'endpoint' => $_ENV['MINIO_ENDPOINT'], 'use_path_style_endpoint' => true, // MinIO 必须开启 path style 'credentials' => [ 'key' => $_ENV['MINIO_ACCESS_KEY'], 'secret' => $_ENV['MINIO_SECRET_KEY'], ], ]); //$filePath = $this->getParameter('kernel.project_dir') . '/public/images/logo_test.png'; $filePath = $this->getParameter('kernel.project_dir') . '/public/images/publishing.mp4'; $bucket = $_ENV['MINIO_BUCKET']; //$key = 'uploads/example.jpg'; $key = 'uploads/wuhan.mp4'; $s3->putObject([ 'Bucket' => $bucket, 'Key' => $key, 'SourceFile' => $filePath, 'ACL' => 'public-read', // 公开访问 ]); echo "File uploaded: {$key}"; }访问上传图片:
http://localhost:9002/media/uploads/example.jpg
相关拓展
- 视频播放配置
<video
src="http://localhost:9002/media/Artificial_Intelligence_(AI)_and_AI-assisted_technology_in_publishing.mp4"
autoplay muted playsinline controls>
</video>
其中:
controls
必须要有,不然啥都没有
什么是s3
S3 是什么,以及为什么 MinIO / Laravel / Symfony 里老是提到它。
1. S3 的本质
- S3 全称:Amazon Simple Storage Service
- 是 亚马逊云(AWS) 提供的一种 对象存储服务
- 类似网盘,但专门为程序和服务器使用,而不是人手动上传/下载
特点:
- 以 Bucket(桶) 组织文件
- 文件叫 Object(对象),有
Key(路径+文件名) - 访问通过 HTTP(S) API
- 可以存放不限大小、数量的文件
- 提供权限控制、临时签名 URL、版本管理等
2. S3 API
- S3 API 是 Amazon 定义的一套 HTTP 接口规范
- 全世界几乎所有对象存储(阿里 OSS、腾讯 COS、七牛云 Kodo、MinIO…)都 兼容 S3 API
- 这样一来,开发者只需要学会 S3 的 SDK 或 API,就能无缝切换存储服务
例子:上传一个文件 (HTTP PUT 请求)
PUT /mybucket/uploads/photo.jpg HTTP/1.1
Host: s3.amazonaws.com
Authorization: AWS4-HMAC-SHA256 Credential=xxxx
Content-Length: 1234
Content-Type: image/jpeg
3. MinIO 与 S3 的关系
- MinIO 并不是 AWS 的一部分
- 它是一个开源项目,目标就是 100% 兼容 S3 API
- 这样,你用 AWS SDK / S3 SDK 写的代码,不改动就能用 MinIO
换句话说: 👉 MinIO = 自己搭建一个小型的 AWS S3
4. 在 Laravel / Symfony 里为什么用 s3 驱动
Laravel 的 filesystem 是基于 Flysystem
Flysystem 内置很多适配器:
local、ftp、sftp、s3…s3驱动的意思是:通过 S3 API 访问对象存储所以:
- 配 AWS →
s3 - 配 MinIO →
s3 - 配七牛云(兼容 S3)→ 也用
s3
- 配 AWS →
5. 举个例子
Storage::disk('s3')->put('hello.txt', 'Hello world');
- 如果你配置了 AWS S3 → 存到 AWS
- 配了 MinIO → 存到 MinIO
- 配了七牛云(兼容 S3)→ 存到七牛云
因为大家都兼容 S3 API,所以 Laravel/Flysystem 只需要一个 s3 驱动即可。
✅ 总结:
- S3 = Amazon 的对象存储服务
- S3 API = 一套事实上的对象存储行业标准
- MinIO 兼容 S3 API,所以 Laravel/Symfony 里配置
s3驱动就能直接用 MinIO
