LoginSignup
0
0

More than 1 year has passed since last update.

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

Posted at

パンプキン カフェ (2).png
こんにちは、まゆみです。

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

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

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

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

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

今回の記事では、

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

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

のContainerをそれぞれ作りそれらのContainerをつなげるにはどのようしたら良いのか?

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

見出しを追加 - 2021-06-07T132731.291.png

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

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

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

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

試しに、ターミナルに

docker-compose 

と打ってみてください。

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

2021-06-07_8-23-53.png

準備するファイル

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

package.json

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

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

2021-06-07_13-10-39.png

index.js

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

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

2021-06-07_13-09-37.png

Dockerfile

Dockerfileの書き方の詳しい解説は前回の記事でさせていただきましたので、もし分からないって方は読んでみてくださいね。

2021-06-08_7-32-31.png

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

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

DockerfileからContainerを

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

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

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

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

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

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

見出しを追加 - 2021-06-07T114945.412.png

下記のようになります

2021-06-07_11-58-50.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

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

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

2021-06-08_8-08-49.png
引用元:docker docs

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

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

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

docker run に対応するものは

docker-compose up

になります。

2021-06-08_8-42-59.png

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

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

localhost:8081

でアクセスしてみます

2021-06-08_8-47-41.png

2021-06-08_8-48-24.png

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

まとめ

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

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0