tl;dr

Docker Compose とデータ用コンテナを使って、画像をアップロードしてデータコンテナに保存しつつ、ブラウザでアップロードした画像を見ることが出来る環境を作成してみました。

教材

Contribute to handson-docker-compose-storage development by creating an account on GitHub.

github.com

1. データ用コンテナ

1.1. データ用コンテナ

Docker ではデータを保存するだけのコンテナを作成して、下図のように他のコンテナのデータ領域として利用することが出来ます。尚、データ用コンテナは OS イメージのコンテナや busybox コンテナを利用して作成することが出来ます。

5896adb8-0d36-646b-d395-be863e3e1913

今回は下図のようなファイルアップロードシステムにおいて、アップロードしたファイルを保存する為にアプリケーションサーバーにマウントして利用します。

421e616e-3f8c-a7b9-5028-a0ab01114196

また、アプリケーションサーバーをスケールアウトさせて複数のアプリケーションコンテナから NFS のように(あくまでも擬似的に)利用してみたいと思います。

2. ファイルアップロードを試してみる

2.1. docker-compose.yml と Dockerfile を取得する

以下のように GitHub のリポジトリからプロジェクト一式を適当なディレクトリに clone します。

cd ~/dockerfile/
git clone https://github.com/inokappa/handson-docker-compose-storage.git

以下のように出力されることを確認します。

Cloning into 'handson-docker-compose-storage'...
remote: Counting objects: 42, done.
remote: Compressing objects: 100% (33/33), done.
remote: Total 42 (delta 6), reused 42 (delta 6), pack-reused 0
Unpacking objects: 100% (42/42), done.
Checking connectivity... done.

2.2. 環境を起動する

以下のようにコマンドを実行してデモ環境を起動します。

cd ~/dockerfile/handson-docker-compose-storage
./_demo.sh

以下のように出力されることを確認します。(コンテナのビルドが走りますので暫くお待ち下さい…)

(略)

Successfully built 8ea22ce2162b
Creating handsondockercomposestorage_storage_1
Creating handsondockercomposestorage_app_1
Creating handsondockercomposestorage_consul_server_1
Creating handsondockercomposestorage_registrator_1
Creating handsondockercomposestorage_haproxy_1

以下のようにコマンドを実行して起動しているコンテナの状態を確認します。

docker-compose -f docker-compose.yml.v1 ps

以下のように出力されることを確認します。


               Name                      Command                State   Ports
------------------------------------------------------------------------------------
handsondockercomposestorage_app_1  sh run-app.sh                  Up 0.0.0.0:32832->4567/tcp
handsondockercomposestorage_consul /bin/consul agent -server  ... Up 8300/tcp,8301/tcp,8301/udp,
_server_1                                                            8302/tcp,8302/udp,8400/tcp,
                                                                     8500/tcp,8600/tcp,8600/udp
handsondockercomposestorage_haprox /docker-entrypoint.sh /bin ... Up 0.0.0.0:80->80/tcp
y_1
handsondockercomposestorage_regist /bin/registrator --interna ... Up
rator_1
handsondockercomposestorage_storag tail -f /dev/null              Up
e_1

5 つのコンテナが起動していることを確認します。図にすると以下のようなイメージの環境で構築されています。
更に以下のようにブラウザでアクセスすると起動中のコンテナ一覧を確認することが出来ます。

b93f77ae-a0ee-ca1c-0e63-45a46dedd43d

2.3. ファイルアップロードして確認する

以下のように Uploader ページにアクセスしてファイルのアップロードを行います。

576ef3e0-7c9e-60fc-9e54-1134f65d5b6b

適当な画像ファイルを選択してアップロードします。

a95f2746-cb4a-39d8-8cd3-c8b4c9d241af

アップロード完了ページからファイルのリンクをクリックして画像を表示してみましょう。

523af49e-7cc8-f1d6-c033-2bfd3e3c56db

ブラウザバックを利用して前のページに戻った後、Go to Images page をクリックして画像一覧ページにもアクセスしてみます。

8dd0f03c-eec4-f2f5-32d7-d9e9dea70612

2.4. データ用コンテナにファイルが保存されていることを確認する

以下のようにコマンドを実行してデータ用コンテナに前のステップでアップロードしたファイルが保存されていることを確認します。

docker exec -t -i handsondockercomposestorage_storage_1 ls -l /mnt/dat

以下のように出力されることを確認します。

total 4
-rw-r--r-- 1 root root 1539 Mar 30 14:29 46246da8fbae_General_AWScloud.png

2.5. アプリケーションコンテナをスケールイン、スケールアウトしてファイルアップロードを試してみる

以下のようにコマンドを実行してスケールイン、スケールアウトを行います。

  • スケールアウト
docker-compose -f docker-compose.yml.v1 scale app=2

以下のように出力されることを確認します。

Creating and starting 2 ... done

以下のようにスケールアウト(アプリケーションコンテナが追加)されたことを確認することが出来ます。

docker-compose -f docker-compose.yml.v1 ps app

以下のように出力されることを確認します。

 Name                     Command      State            Ports
-------------------------------------------------------------------------------------------------------------
handsondockercomposestorage_app_1   sh run-app.sh   Up      0.0.0.0:32832-> 4567/tcp
handsondockercomposestorage_app_2   sh run-app.sh   Up      0.0.0.0:32833-> 4567/tcp

以下のようにブラウザでアクセスするとコンテナ一覧に追加されたアプリケーションコンテナを確認することが出来ます。

e536e5da-1bbb-0bca-d78b-1916d33c7292

2.3. と同様にファイルのアップロードを試してみましょう。

ff4e4388-6fc5-0cc1-001f-3d999ab1bf79

また、データ用コンテナにファイルが保存されているかも確認しましょう。

docker exec -t -i handsondockercomposestorage_storage_1 ls -l /mnt/data

ファイルが保存されていることを確認しましょう。

total 8
-rw-r--r-- 1 root root 1539 Mar 30 14:29 46246da8fbae_General_AWScloud.png
-rw-r--r-- 1 root root  660 Mar 30 22:28 b2d1025534dd_General_AWSManagementConsole.png
  • スケールイン
docker-compose -f docker-compose.yml.v1 scale app=1

以下のように出力されることを確認します。

Stopping and removing handsondockercomposestorage_app_2 ... done

以下のようにスケールイン(アプリケーションコンテナが削除)されたことを確認することが出来ます。

docker-compose -f docker-compose.yml.v1 ps app

以下のように出力されることを確認します。

   Name                     Command      State            Ports
-----------------------------------------------------------------------------------
handsondockercomposestorage_app_1   sh run-app.sh   Up      0.0.0.0:32832->4567/tcp

以下のようにブラウザでアクセスするとコンテナ一覧を確認することが出来ます。

bedbf7c2-ba28-c095-4da0-46bdcde1c62c

ということで…

データコンテナ使えば NFS っぽいこと出来るなあって思ったけど、あくまでもデモレベルなのでご容赦下さいmm

元記事はこちら

(朝の 15 分八苦)Docker Compose とデータ用コンテナを使ったデモ