docker-compose: как использовать 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

Как видите, я использую minio в качестве хранилища, совместимого с AWS S3. Это работает очень хорошо, но когда я генерирую URL-адрес для файла (Storage::disk('s3')->url('some-file.txt')), очевидно, я получаю такой URL-адрес http://s3:9000/Bucket/some-file.txt, который не работает за пределами сети Docker.

Я уже пытался установить AWS_ENDPOINT на http://127.0.0.1:9000, но тогда Laravel не может подключиться на сервер Minio...

Есть ли способ настроить Docker / Laravel / Minio для создания URL-адресов, доступных внутри и за пределами сети Docker?


person Nio    schedule 17.06.2019    source источник


Ответы (3)


Я расширил решения в этом вопросе, чтобы создать решение, которое работает для меня как на локальном хосте, так и на сервере с доступным DNS.

Решение для локального хоста по сути является решением, описанным выше.

Создать сопоставление хоста localhost

sudo echo "127.0.0.1       my-minio-localhost-alias" >> /etc/hosts

Установите HOSTNAME, используйте «my-minio-localhost-alias» для локального хоста

export HOSTNAME=my-minio-localhost-alias

Создать привет.txt

Hello from Minio!

Создайте файл docker-compose.yml

Этот компоновочный файл содержит следующие контейнеры:

  • минио: сервис минио
  • 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:

Запустите мини-контейнер

docker-compose up -d minio

Создайте корзину в minio и загрузите файл

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

Создайте предварительно подписанный URL-адрес, доступный внутри и за пределами сети докеров.

docker-compose run s3-client --endpoint-url http://${HOSTNAME}:9000 s3 presign s3://my-bucket/hello.txt
person terrywb    schedule 14.04.2020

Поскольку вы сопоставляете порт 9000 на хосте с этой службой, вы сможете получить к нему доступ через s3: 9000, если просто добавите s3 в файл hosts (/etc/hosts на Mac/Linux)

Добавьте этот 127.0.0.1 s3 в файл hosts, и вы сможете получить доступ к контейнеру s3 с вашего хост-компьютера, используя https://s3:9000/path/to/file

Это означает, что вы можете использовать имя хоста s3 внутри и вне сети докеров.

person Kārlis Ābele    schedule 17.06.2019
comment
Я уже думал об этом, но для меня это больше похоже на обходной путь. - person Nio; 17.06.2019
comment
На самом деле это не такой уж обходной путь, поскольку в локальной среде разработки иногда все так и работает... Разве вы не добавляете имена хостов веб-приложений в файл hosts при их разработке? Вы также можете настроить прокси-сервер, работающий на вашем хост-компьютере, и перенаправлять запросы на s3 на локальный хост. Или просто сделайте службу minio полностью недоступной с хост-компьютера и обрабатывайте запросы портов 9000 с помощью прокси-службы nginx, которая является частью проекта docker-compose. - person Kārlis Ābele; 17.06.2019
comment
Имея ту же проблему, и я согласен с @Nio, это не идеальное решение, даже если оно единственное. Не должно быть необходимости в локальной конфигурации DNS, если предположить, что приложение может запускаться с локального хоста, а уровень прокси-сервера nginx кажется излишним, если minio является лишь небольшой частью общего приложения. Кажется, лучшим решением здесь было бы разрешить Minio альтернативное имя хоста при создании подписанных URL-адресов, но, похоже, в этом нет никаких изменений: github.com/minio/minio/issues/2848 - person Dan; 19.06.2019
comment
Ну, это решение, которое мы можем сделать сами... Сидеть и надеяться, что разработчики реализуют функциональность в своих инструментах, не будет слишком продуктивно. Вероятно, вы можете попробовать создать прокси-сервер, через который вы будете обслуживать все свои файлы, используя nginx или какое-либо другое облегченное решение. - person Kārlis Ābele; 19.06.2019
comment
Согласен по обоим пунктам, ваш ответ, вероятно, единственный вариант на данный момент. Кажется странным, что это широко нигде не рассматривается, хотя даже инструменты, аналогичные Minio (FakeS3 и т. д.), похоже, также не учитывают этот вариант использования. Многие люди, использующие docker-compose в наши дни, вероятно, столкнулись бы с этим, если бы попытались дублировать свою инфраструктуру локально. - person Dan; 19.06.2019

как насчет адреса привязки? (не проверено)

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

person guesswho    schedule 12.05.2020