ようへいの日々精進XP

よかろうもん

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

tl;dr

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


教材

github.com


1. データ用コンテナ

1.1. データ用コンテナ

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

2016033103.png

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

2016033104.png

また、アプリケーションサーバーをスケールアウトさせて複数のアプリケーションコンテナから 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 つのコンテナが起動していることを確認します。図にすると以下のようなイメージの環境で構築されています。

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

2016033001.png

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

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

2016033002.png

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

2016033003.png

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

2016033004.png

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

2016033005.png

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 

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

2016033006.png

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

2016033102.png

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

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 

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

2016033101.png


ということで...

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