指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

在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
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