【Docker】ネットワークについての概要 no.20

![パンプキン カフェ (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/df2e7854-3877-086d-5ffa-f73bcc96e707.png)


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

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

今回の記事では、Dockerのネットワークについての簡単なまとめ記事を書いていこうと思います

リアルなアプリケーション開発では、1つだけのコンテナではなく、2つ以上のコンテナを相互にコミュニケーションを取らせて開発していくことが多くなってくると思います

そこで

<ul>
<li>WWWを使って外部とつながる時</li>
<li>ホストマシーンとつながる時</li>
<li>ほかのコンテナとつながる時</li>
</ul>

に分けて解説していきます。

では、はじめていきますね。

#WWWで外部とつながる時

Containerの中からWWWで外部とつながりたい時(例えばAPIを使用したい時)は、とても簡単です。

何も特にする事なく、APIを使うことができます

#ローカルホストとつながる時

例えば、ローカルホストにデータベースを置いて、それをContainerとつなげたい時。

<font color="Red">特別のドメインである(host.docker.internal)</font>を使います。

例えば、node.jsとmongodbを使ったアプリを開発している時、下のコードの<つなげたい先>と書いているところをhost.docker.internalに変えます。

```
mongoose.connect("mongodb://<つなげたい先>")
```


docker docsドキュメントで確認したい方は[こちら](https://matsuand.github.io/docs.docker.jp.onthefly/docker-for-windows/networking/#use-cases-and-workarounds)からどうぞ

#他のContainerとつながる時

Containerを作る時のベストプラクティスは

>1つのContainerにつき１つのタスク

と言われています。(WebサーバーのContainer, データベースのContainerでそれぞれ別個のContainerを作る)

それゆえ、アプリ開発においては、複数のContainerを作りそれらをつなげて使うという場面が多くなります。


今回の記事では、node.appとmonogodbを組み合わせてアプリを作るということを想定して

<font color="Red">ContainerとContainerをつなげるため</font>

にはどうしたらいいのか書いていきます

![node app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/7905b07f-5727-e456-ce45-8710bef224a1.png)

<font color="Red">2つ以上のContainerをつなげる方法は２つあります</font>

2つの選択肢を別々に下記に書いていきますね。


##IPアドレスを使って他のContainerとつながる

Docker hub にオフィシャルのmongoイメージがあるので、Dockerfileから作るのではなくオフィシャルのImageを使います

![2021-06-27_11-08-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/3c12ebed-4256-fe87-99fd-27efc9425b6d.png)

```
docker run -d --name mongodb mongo
```

ディタッチモードでmongo　Image からcontainer を作りました。

バックグラウンドでmongoが実行中になりますから、そのまま

```
docker container inspect mongodb
```

で詳細を見てください。

すると、たくさんの情報が出てきますので、その中の『"NetworkSetting" > "IPADDRESS"』

を見つけてください。(下のスクショ参考)

![2021-06-28_13-01-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/adc8c083-17ab-444b-9dbb-2b1111308bcb.png)

ソースコードのアドレスを表しているところに貼り付けます


![2021-06-28_13-03-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1da0f9a1-bb21-187b-afeb-85d344e23b55.png)

これで、このIPアドレスを使ってmongodbのContainerとつながることができます

ただ、IPアドレスを調べないといけなかったりして面倒くさいですよね。

他のContainerをつながる方法はもう一つあります。

下記にその方法を書いていきます

#同じネットワークに入れる

 <font color="Red">ContainerとContainerをつなぐもう一つの方法は、つなげたいContainerを同じネットワークに入れる</font>ことです。

2つ以上のContainerを同じネットワークに入れるには『--network』を使います

##networkを作る

--networkオプションを使えば、2つ以上のContainerを同じnetworkに入れることができると言いましたが、 <font color="Red">その前にnetwork自体を作らなければ</font>いけません。

```
docker network create <好きな名前>
```

とコマンドを打ち、まずネットワークを作ってください。

その後

```
docker run --name <containerの名前> --network <ネットワークの名前> <ImageID>
```

とします(ちなみに--nameオプションでContainerに名前を付けることができます。次のプロセスでcontainerの名前が必要なのでContainer名を覚えておいてください。)

実際にコマンドを実行した様子は下のスクショになります

![2021-06-28_15-14-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/843f7dc5-6248-8c8c-4fd6-a5c144d2cdab.png)

これでmongodbのContainerが起動しました。

その後、このmongodbのContainerとnodeアプリをつなげるため、下記のようにコードを書き換えます。

![2021-06-28_13-46-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/6bbe77ed-cfe5-00e9-491b-df8e3bbd3c25.png)

上のスクショの赤で囲まれた部分に先ほどrunする時に--name オプションによって付けたContainerの名前を入れてください。

2つ以上のContainerを同じネットワーク内に入れることで、『Containerの名前によって』Container同士をつなげることができるようになります


今回は2つのContainerをつなげるので、同じネットワーク内(--network my-netのオプションをつけて)２つのContainerを実行しました(下のスクショ参考)

![2021-06-28_15-33-50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/6a65a023-1e23-c163-f356-302b7ef93c1c.png)

docker logs <container名>で上のようなWarningが出ればうまく行っています。

 <font color="Red">同じネットワーク内のContainerをつなぐには『-p』を使うのではなく、『container名』によって</font>認識させます。

#まとめ

今回の記事は、mongodbの知識が少し必要だったりして、記事をまとめるのに少し時間がかかりました。(mongoose.connectの使い方が分かればスムーズに記事を読めると思います)

ただ、実際の現場では2つ以上のContainer同士、お互いコミュニケーションを取らせて開発する事が多くなると思います。

今回の記事が、少しでもお役に立てれば幸いです。