【Docker】複数のContainerをDockerでつないでみた no.13

![パンプキン カフェ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/0a23ebc6-6287-42bd-3c82-4afa31131a3d.png)


こんにちは。まゆみです。

Dockerについての記事をシリーズで書いています

以前に[no.11の記事](https://qiita.com/Mayumi_Pythonista/items/b866fad31eb3b17c30d0)で、複数のContainerを『docker-compose』を使ってつなぐことを紹介させていただきました。

![※docker-composeのロゴをまねてみました。(笑).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/93270f75-7b41-7620-7dd5-d12b8dc92a3d.png)


今回の記事では、

>docker-compose ではなく、『Docker』を使って複数のContainerをつなごうと思ったらどれだけ面倒くさいかという、やや自虐的な実験をやってみましたので記事にまとめていきます。


ただ、この面倒くさいプロセスを実際に試してみることで、どのようにネットワークが構築されているかを身をもって理解する事ができました。

この面倒くさい経験を、みなさまと共有させていただきます。

#今回作るアプリ

『作った』と言っても、コードは[git hub](https://github.com/dockersamples/example-voting-app)より、拝借させていただきました。

github のコードは[こちら](https://github.com/dockersamples/example-voting-app)からどうぞ

ネットワーク構築の概要は下記のようになっています。

![2021-06-13_9-58-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/63b4fe4c-4e10-d37c-5da9-40106534df36.png)

アプリの概要は

>Dog か Catどちらが好きか？を投票して、集計してデータベースに収めた結果をまた表示させる

というものです。

#git cloneでリポジトリの複製をする

赤の➡で示されているファイルのアイコンをクリックして、コピーする
![2021-06-13_10-01-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/74cdd7bc-6261-f1b2-4fae-ac1a54c2ca44.png)

![2021-06-13_10-04-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/28f31eaa-c639-2d32-c763-f53ffb3ba036.png)

#Dockerfileをbuildする

voteディレクトリの中にある、Dockerfile をbuildします。(-t voting-app　というオプションを付け、voting-appという名前のついたImageを作りました)


![2021-06-13_10-08-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/cd6738f4-c659-c850-b725-4c474ae5ffae.png)


```
docker build -t voting-app .
```

![2021-06-13_10-12-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5508a0fe-0bd9-dade-ede4-1b10d7d9d012.png)


では、作ったImageからContainerを起動してみます。Webアプリなので、ポートマッピングして実行する事を忘れずに。

```
docker run -p 5000:80 voting-app
```

そして、localhost:5000にアクセスしてみます。

無事に表示されました。


![2021-06-13_10-20-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5d7a266d-656a-b8bc-d7d8-dc47a57df515.png)

ただ、ここで犬か猫かの投票をしようとどちらかのボタンをクリックすると、エラーが出ます。

![2021-06-13_10-23-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/bf473b44-4ac8-e870-02b5-27058bc1f2e0.png)

ターミナルに戻ると、redisとつながっていないことが原因でエラーが出ていることが分かります。

まだ、redisのContainerを起動していないですし、当然と言えば当然ですね。

![2021-06-13_10-24-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/72e4f204-3874-549f-921c-da7a61beed01.png)

#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のボタンをクリックしてみると、今回はちゃんとチェックマークがつきました。


![2021-06-13_10-56-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/a7fe8fe5-e9e8-4a9a-ce61-e39dd4554fd2.png)


#Postgresを準備する

voting-app ➡　redis とつながったので、次はworkerにと言いたいところですが、その前提として、Postgresを起動させましょう

git hub の

>example-voting-app > docker-compose.yml

に使用するべきPostgreのバージョンが載っていますので、そのバージョンのPostgreのContainerを実行させます。


![2021-06-13_11-04-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e70f0f70-e379-38de-b3ed-c16356e97d36.png)

![2021-06-13_11-01-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4e8277cc-a237-92f7-48ae-09b86f63e91e.png)


```
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 の概要を見てもらえればわかるように、<font color="Red">workerはPostgreとredisとつながっています</font>ので、

--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にアクセスしてみましょう


![2021-06-13_11-43-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/2d2a475f-8c9e-a59a-ff65-6bbf3050895b.png)

voting-appであなたがCATSに投票していたなら、CATSが100％として表示されているはずです。

#まとめ

今回の記事では、コードはgit hub から拝借して、どのContainer とどのContainerをつなげるべきかということに焦点を置いて書かせていただきました。

あえて、docker-composeを使わず、DockerCLIを使ってみました。

とても面倒くさかったです。(笑)

次回は同じアプリを『docker-compose』を利用して起動させてみたいと思います