docker-compose:如何在 docker 网络内外使用 minio

Nio*_*Nio 6 amazon-s3 laravel docker minio

我有以下内容docker-compose.yml为我的 Laravel 应用程序运行本地环境。

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: .docker/php/Dockerfile
    ports:
      - 80:80
      - 443:443
    volumes:
      - .:/var/www:delegated
    environment:
      AWS_ACCESS_KEY_ID: minio_access_key
      AWS_SECRET_ACCESS_KEY: minio_secret_key
      AWS_BUCKET: Bucket
      AWS_ENDPOINT: http://s3:9000
    links:
      - database
      - s3
  database:
    image: mariadb:10.3
    ports:
      - 63306:3306
    environment:
      MYSQL_ROOT_PASSWORD: secret
  s3:
    image: minio/minio
    ports:
      - "9000:9000"
    volumes:
      - ./storage/minio:/data
    environment:
      MINIO_ACCESS_KEY: minio_access_key
      MINIO_SECRET_KEY: minio_secret_key
    command: server /data
Run Code Online (Sandbox Code Playgroud)

如您所见,我使用 minio 作为 AWS S3 兼容存储。这很有效,但是当我为文件 ( Storage::disk('s3')->url('some-file.txt'))生成 url 时,显然我得到了这样的 url http://s3:9000/Bucket/some-file.txt,它在 Docker 网络之外不起作用。

我已经尝试设置AWS_ENDPOINThttp://127.0.0.1:9000但随后 Laravel 无法连接到 Minio 服务器...

有没有办法配置 Docker/Laravel/Minio 来生成可在 Docker 网络内外访问的 URL?

ter*_*ywb 9

我扩展了这个问题中的解决方案,创建了一个在本地主机和具有可访问 DNS 的服务器上都适用的解决方案。

localhost 解决方案本质上就是上面描述的解决方案。

创建 localhost 主机映射

sudo echo "127.0.0.1       my-minio-localhost-alias" >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)

设置 HOSTNAME,使用 'my-minio-localhost-alias' 作为 localhost

export HOSTNAME=my-minio-localhost-alias
Run Code Online (Sandbox Code Playgroud)

创建你好.txt

Hello from Minio!
Run Code Online (Sandbox Code Playgroud)

创建 docker-compose.yml

该撰写文件包含以下容器:

  • minio:minio服务
  • minio-mc:初始化内容的命令行工具
  • s3-client:生成预签名 URL 的命令行工具
version: '3.7'
networks:
  mynet:
services:
  minio:
    container_name: minio
    image: minio/minio
    ports:
    - published: 9000
      target: 9000
    command: server /data
    networks:
      mynet:
        aliases:
        # For localhost access, add the following to your /etc/hosts
        # 127.0.0.1       my-minio-localhost-alias
        # When accessing the minio container on a server with an accessible dns, use the following
        - ${HOSTNAME}
  # When initializing the minio container for the first time, you will need to create an initial bucket named my-bucket.
  minio-mc:
    container_name: minio-mc
    image: minio/mc
    depends_on:
    - minio
    volumes:
    - "./hello.txt:/tmp/hello.txt"
    networks:
      mynet:
  s3-client:
    container_name: s3-client
    image: amazon/aws-cli
    environment:
      AWS_ACCESS_KEY_ID: minioadmin
      AWS_SECRET_ACCESS_KEY: minioadmin
    depends_on:
    - minio
    networks:
      mynet:

Run Code Online (Sandbox Code Playgroud)

启动minio容器

docker-compose up -d minio
Run Code Online (Sandbox Code Playgroud)

在minio中创建一个bucket并加载一个文件

docker-compose run minio-mc mc config host add docker http://minio:9000 minioadmin minioadmin
docker-compose run minio-mc mb docker/my-bucket
docker-compose run minio-mc mc cp /tmp/hello.txt docker/my-bucket/foo.txt
Run Code Online (Sandbox Code Playgroud)

创建一个可在 docker 网络内部和外部访问的预签名 URL

docker-compose run s3-client --endpoint-url http://${HOSTNAME}:9000 s3 presign s3://my-bucket/hello.txt
Run Code Online (Sandbox Code Playgroud)


gue*_*who 8

绑定地址怎么样?(未测试)

...
  s3:
    image: minio/minio
    ports:
      - "9000:9000"
    volumes:
      - ./storage/minio:/data
    environment:
      MINIO_ACCESS_KEY: minio_access_key
      MINIO_SECRET_KEY: minio_secret_key
    command: server --address 0.0.0.0:9000 /data
Run Code Online (Sandbox Code Playgroud)

  • 命令部分现在已更改:`command: server /data --console-address ":9001"` (2认同)

Kār*_*ele 1

由于您将主机上的 9000 端口映射到该服务,因此如果您只需将 s3 添加到您的主机文件(Mac/Linux 上的 /etc/hosts),您应该能够通过 s3:9000 访问它

将其添加127.0.0.1 s3到您的主机文件中,您应该能够使用https://s3:9000/path/to/file从主机访问 s3 容器

这意味着您可以从 docker 网络内部和外部使用 s3 主机名