こんにちは。まゆみです。
Dockerについての記事をシリーズで書いています
以前にno.11の記事で、複数のContainerを『docker-compose』を使ってつなぐことを紹介させていただきました。
今回の記事では、
docker-compose ではなく、『Docker』を使って複数のContainerをつなごうと思ったらどれだけ面倒くさいかという、やや自虐的な実験をやってみましたので記事にまとめていきます。
ただ、この面倒くさいプロセスを実際に試してみることで、どのようにネットワークが構築されているかを身をもって理解する事ができました。
この面倒くさい経験を、みなさまと共有させていただきます。
#今回作るアプリ
『作った』と言っても、コードはgit hubより、拝借させていただきました。
github のコードはこちらからどうぞ
ネットワーク構築の概要は下記のようになっています。
アプリの概要は
Dog か Catどちらが好きか?を投票して、集計してデータベースに収めた結果をまた表示させる
というものです。
#git cloneでリポジトリの複製をする
赤の➡で示されているファイルのアイコンをクリックして、コピーする
#Dockerfileをbuildする
voteディレクトリの中にある、Dockerfile をbuildします。(-t voting-app というオプションを付け、voting-appという名前のついたImageを作りました)
docker build -t voting-app .
では、作ったImageからContainerを起動してみます。Webアプリなので、ポートマッピングして実行する事を忘れずに。
docker run -p 5000:80 voting-app
そして、localhost:5000にアクセスしてみます。
無事に表示されました。
ただ、ここで犬か猫かの投票をしようとどちらかのボタンをクリックすると、エラーが出ます。
ターミナルに戻ると、redisとつながっていないことが原因でエラーが出ていることが分かります。
まだ、redisのContainerを起動していないですし、当然と言えば当然ですね。
#redisのContainerを起動する
redis Containerを
ディタッチモードで (-d オプションを付ける)
redis という名前を付けて (--name="redis" というオプションを付ける)
起動させます。
docker run -d --name=="redis" redis
redisが起動したことを確かめてから、先ほどDockerfile から作ったImage(voting-appと名前を付けたやつ)から再びContainerを起動させます。
注意点
redis とvoting-appをつなげるために、--link redis:redisというオプションを付けて実行します
docker run -p 5000:80 --link redis:redis voting-app
localhost:5000にアクセスして、CATS かDOGSのボタンをクリックしてみると、今回はちゃんとチェックマークがつきました。
#Postgresを準備する
voting-app ➡ redis とつながったので、次はworkerにと言いたいところですが、その前提として、Postgresを起動させましょう
git hub の
example-voting-app > docker-compose.yml
に使用するべきPostgreのバージョンが載っていますので、そのバージョンのPostgreのContainerを実行させます。
docker run -d --name="db" postgres:9.4
注意点
上記のコードで、Containerは起動するけどPostgreが動いたままにならない場合は下記のコードで試してみてください。
docker run -d --name=db -e POSTGRES_PASSWORD=postgres postgres:9.4
ではworkerディレクトリーにある、DockerfileからImageを作ります。
docker build -t worker-app .
Architecture の概要を見てもらえればわかるように、workerはPostgreとredisとつながっていますので、
--link オプションで
workerと二つのサーバーをつなげて実行させます
docker run --link redis:redis --link db:db worker-app
#result ディレクトリのDockerfile を実行する
最後に、投票結果を集計して結果を表示するresult-appのDockerfileを起動させます。
resultディレクトリの中のDockerfileを実行してください。
docker build -t result-app .
Imageが作り終わった後、このImageを使ってContainerを実行します。
docker run -p 5001:80 --link db:db result-app
localhost:5001にアクセスしてみましょう
voting-appであなたがCATSに投票していたなら、CATSが100%として表示されているはずです。
#まとめ
今回の記事では、コードはgit hub から拝借して、どのContainer とどのContainerをつなげるべきかということに焦点を置いて書かせていただきました。
あえて、docker-composeを使わず、DockerCLIを使ってみました。
とても面倒くさかったです。(笑)
次回は同じアプリを『docker-compose』を利用して起動させてみたいと思います