【Docker】docker-composeで2つのコンテナをつなぐ no.11

![パンプキン カフェ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f9ab71b4-d85e-f335-783d-db7ae62886c4.png)
こんにちは、まゆみです。

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

今回の記事では、『Docker-compose』について書いていきます。

今までの記事では、Containerを作って、それ単独で動かしてきました

ただ、現実の世界では、2つ以上のContainerをつないでサービスを作ることが多いと思います。

そのような時に役に立つのが『Docker compose』になります

今回の記事では、

>nodeで作ったWebアプリと (アプリへのアクセス数をブラウザーに表示させる)

>インメモリ―データベースのredis-server

のContainerをそれぞれ作り<font color="Red">それらのContainerをつなげるにはどのようしたら良いのか？</font>

を実際に手を動かしてコードを書きつつ解説していきます(下のイメージのようなサービスを作っていきます)

![見出しを追加 - 2021-06-07T132731.291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4425c9c2-cc32-93fb-3484-5352c7708ad2.png)

ではさっそく始めていきますね。


#Docker-compose はDockerと一緒にインストールされている

まず、Docker-composeがちゃんとインストールされているかを確かめてみましょう

Docker-composeは、Dockerをインストールした時に一緒にインストールされています。

試しに、ターミナルに

```
docker-compose 
```
と打ってみてください。

docker-compose で使えるコマンドがずらっと表示されます。

![2021-06-07_8-23-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f0bd397a-f4c8-48db-6b9e-55462550ac8f.png)


#準備するファイル

では実際に、nodeのWebアプリと、redis-serverを作るためのコードをエディターに書いていきます

##package.json

おなじみのpackage.jsonになります

どんなdependenciesを使うのかなどを記載したファイル。

![2021-06-07_13-10-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/db8ec0da-0c4b-9861-16fd-84e7e7ee6301.png)


##index.js

当記事は、Dockerに関する記事なので、詳しいコードの解説は省きますが、アクセスがあるごとに、その訪問数がredisに記録されるようにしました。

下記のスクショのぼかしているところが、Docker-composeを使う時は独特な書き方をする部分なので、後で解説するときにぼかしを取りますね。

![2021-06-07_13-09-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/824f079e-f083-7611-c2b5-535b90892ed4.png)

##Dockerfile

Dockerfileの書き方の詳しい解説は[前回の記事](https://qiita.com/Mayumi_Pythonista/items/3bec2d15980c99503793#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95)でさせていただきましたので、もし分からないって方は読んでみてくださいね。

![2021-06-08_7-32-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4a2f1bbc-5e2c-b883-d5d1-05b79667b56f.png)


これらのファイルが揃ったところで、

>redisのイメージから作ったContainerと

>DockerfileからContainerを

それぞれ起動させました。

が、このままでは2つのContainerはお互いにコミュニケーションが取れません。

#docker-compose.ymlファイルを用意する

そこで2つの独立したContainerをお互いにコミュニケーションできるように、単一のネットワークに実行させます。

そのためには『docker-compose.yml』というファイルが必要になります。

YAMLファイルのなかに、<font color="Red">2つのContainerの情報とどのように実行させたいか</font>の内容を書いていきます。

![見出しを追加 - 2021-06-07T114945.412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/ac9bbf76-1cdf-c5af-007f-d14700565456.png)


下記のようになります

![2021-06-07_11-58-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f4095169-2989-ee3f-945f-2ab0922b9d4f.png)


>①docker-compose.yml でファイルを作ると赤のDockerのアイコンのついたファイルができます

>②versionは"3"になります

>③servicesに実行したいContainer を記載していきます。
service名には、Containerそのものというより、どのようなタイプのContainerなのかを書いていきます

>④redis-server はDockerhub からイメージを引っ張ってきて作ります

>⑤node-appはDockerfileから作るので
build: . と書きます

>⑥portsにはつなげたいポートを記載します。portsには、つなげるポートを複数書くことができます(YAMLファイルでは『-』はarrayを表します)

このようにYAMLファイルを書いて実行することで、水面下ではどんなことが起こっているのかを下記で説明していきます。


まず、先ほどindex.jsのぼかしていた部分のぼかしを取ってみましょう。

![2021-06-07_13-09-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/22a23749-7617-8219-da59-796e9f7fe08e.png)

port: 6379 はredisのデフォルト値になります。

host: "redis-server" と書く理由を下記に解説していきます。

通常、Docker-composeを使わない場合、

『host:』の部分は、"https://URL"　などと書かれますが、

Docker-composeを使う場合、docker-compose.ymlファイルの中のservices: のところに書かれたredis-serverの名前を書きます。(下記参考)

![2021-06-08_8-22-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/68b34eb1-a824-25b4-6338-097e58b4b2d6.png)

どうして、docker-compose.ymlに書かれた、Container名を書くのか？ということについて、docker docsに良い説明がありましたので、引用しておきます


![2021-06-08_8-08-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/e520fe83-e5ea-23e7-4bf1-9e5107992f96.png)
引用元：[docker docs](https://docs.docker.com/compose/networking/)

赤で囲んだ部分を翻訳しますと

>デフォルトでは、Composeによってアプリ用に単一のネットワークが設定されます。各Containerはそのデフォルトのネットワークに組み込まれ、それぞれが双方向にコミュニケーションをすることができます。また各々のContainerはContainer名と同一のホスト名で検索可能です。

ではさっそく実行してみましょう

docker run <imageID>に対応するものは

```
docker-compose up
```

になります。


![2021-06-08_8-42-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f4b6680f-4fa0-cce6-897f-df6e6e7ae816.png)

注目は、赤で囲んだ部分でまず最初にネットワークが構築されているのが分かります。


2つのContainerが作られ、同じネットワーク内でつながったようなので、ブラウザーから訪問してみましょう

```
localhost:8081
```
でアクセスしてみます

![2021-06-08_8-47-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/50928173-3195-8102-972d-f00b5806f9ec.png)

![2021-06-08_8-48-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/842ab681-1f4e-bc5a-d77e-d870b8a1fdcb.png)

リロードするたびに、カウント数も増え、上手くいっています

#まとめ

今回の記事はここで締めくくらせていただきます。

次回の記事では、docker-composeで実行したContainerをストップするにはどうしたら良いのかを書いていきますね。