S3互換のオブジェクトストレージ MinioをDocker Composeで利用する

MinioはAmazon S3互換の分散オブジェクトストレージサーバです。

Minio: Private cloud storage
https://www.minio.io/

Dockerイメージが提供されており手軽にローカルで環境構築できるので試してみました。


## 前提

DockerとAWS CLIがインストールされている前提です。

```sh
> docker --version
Docker version 18.09.2, build 6247962

> docker-compose --version
docker-compose version 1.23.2, build 1110ad01

> aws --version
aws-cli/1.16.27 Python/3.6.6 Darwin/18.0.0 botocore/1.12.17
```

## 準備

`docker-compose.yml`を用意します。公式サイトでyamlファイル生成のためのツールが提供されているので、それを利用します。

<img width="1253" alt="スクリーンショット 2019-02-18 10.59.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/14ded1fb-ea1f-599f-ba84-fccd8c548830.png">


```sh
> mkdir 任意のディレクトリ
> cd 任意のディレクトリ
> touch docker-compose.yml
```

```yaml:docker-compose.yml
version: '2'

services:
 minio1:
  image: minio/minio
  volumes:
   - hoge1:/export
  ports:
   - "9001:9000"
  environment:
   MINIO_ACCESS_KEY: hogehoge
   MINIO_SECRET_KEY: hogehoge
  command: server http://minio{1...4}/export
 minio2:
  image: minio/minio
  volumes:
   - hoge2:/export
  ports:
   - "9002:9000"
  environment:
   MINIO_ACCESS_KEY: hogehoge
   MINIO_SECRET_KEY: hogehoge
  command: server http://minio{1...4}/export
 minio3:
  image: minio/minio
  volumes:
   - hoge3:/export
  ports:
   - "9003:9000"
  environment:
   MINIO_ACCESS_KEY: hogehoge
   MINIO_SECRET_KEY: hogehoge
  command: server http://minio{1...4}/export
 minio4:
  image: minio/minio
  volumes:
   - hoge4:/export
  ports:
   - "9004:9000"
  environment:
   MINIO_ACCESS_KEY: hogehoge
   MINIO_SECRET_KEY: hogehoge
  command: server http://minio{1...4}/export


## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
  hoge1:
  hoge2:
  hoge3:
  hoge4:
```

最低ノード数が4つですが、開発で利用するだけならば1つにしても良いかもしれません。

## 起動してみる

```sh
> docker-compose up
(略)
minio1_1  | Status:         4 Online, 0 Offline.
minio1_1  | Endpoint:  http://172.21.0.2:9000  http://127.0.0.1:9000
minio1_1  |
minio1_1  | Browser Access:
minio1_1  |    http://172.21.0.2:9000  http://127.0.0.1:9000
minio1_1  |
minio1_1  | Object API (Amazon S3 compatible):
minio1_1  |    Go:         https://docs.minio.io/docs/golang-client-quickstart-guide
minio1_1  |    Java:       https://docs.minio.io/docs/java-client-quickstart-guide
minio1_1  |    Python:     https://docs.minio.io/docs/python-client-quickstart-guide
minio1_1  |    JavaScript: https://docs.minio.io/docs/javascript-client-quickstart-guide
minio1_1  |    .NET:       https://docs.minio.io/docs/dotnet-client-quickstart-guide
```

出力を見る限り`9000` ポートからアクセスできそうなのですが、`docker-compse.yml` で各ノードの`9000` を`9001-4`に割り当てているので、そちらからアクセスすることができます。

<img width="1269" alt="スクリーンショット 2019-02-18 11.11.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/9ed95510-551d-f98d-a96f-f7ba60a88b4a.png">


`docker-compse.yml` を編集して、ノードを1つにしてみます。

```yaml:docker-compose.yml
version: '2'

services:
 minio1:
  image: minio/minio
  volumes:
   - hoge:/export
  ports:
   - "9000:9000"
  environment:
   MINIO_ACCESS_KEY: hogehoge
   MINIO_SECRET_KEY: hogehoge
  command: server http://minio{1...4}/export


## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
  hoge:
```

あらためてコンテナを立ち上げます。

```sh
> docker-compose up -d
```

立ち上がったらAWS CLIでバケットの作成とファイル(オブジェクト)をPUTしてみます。

```sh
> aws configure --profile minio
# docker-compose.ymlで指定した`Access Key ID`と`Secret Access Key`を指定

# バケットの作成
> aws \
  --endpoint-url http://127.0.0.1:9000 \
  --profile minio s3 mb s3://hoge
make_bucket: hoge

# ファイルのアップロード
> aws \
  --endpoint-url http://127.0.0.1:9000 \
  --profile minio s3 cp ./docker-compose.yml \
  s3://hoge
upload: ./docker-compose.yml to s3://hoge/docker-compose.yml

# ファイルリストの取得
> aws \
  --endpoint-url http://127.0.0.1:9000 \
  --profile minio s3 ls s3://hoge
2019-02-18 11:15:58        365 docker-compose.yml
```

ブラウザで確認してもオブジェクトがPUTされていることが確認できました。

<img width="1264" alt="スクリーンショット 2019-02-18 11.18.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/d96ebb85-b1a9-a182-aff4-dec84ed96520.png">



今回はお試しだったので、コンテナ内にファイルが保存されるようにしたままなので、コンテナを削除すると保存しているファイルも消えてしまうので、必要に応じでホスト側にファイルが保持されるようにしてください。


## まとめ

ローカルでの開発でS3が必要な場合、Dockerで環境構築することができるならば、利用しやすいツールだと思います。


## 参考

Minio: Private cloud storage
https://www.minio.io/

S3 互換のシンプルなオブジェクトストレージ Minio を使う - Qiita
https://qiita.com/rerofumi/items/21f7a22b8b824859754f

S3互換のオブジェクトストレージminioを試す ｜ DevelopersIO
https://dev.classmethod.jp/tool/s3-compatible-storage-minio/

Minio: Private cloud storage
https://www.minio.io/