こんにちは。まゆみです。
Docker についての記事をシリーズで書いています。
今回の記事では、Dockerのネットワークについての簡単なまとめ記事を書いていこうと思います
リアルなアプリケーション開発では、1つだけのコンテナではなく、2つ以上のコンテナを相互にコミュニケーションを取らせて開発していくことが多くなってくると思います
そこで
- WWWを使って外部とつながる時
- ホストマシーンとつながる時
- ほかのコンテナとつながる時
に分けて解説していきます。
では、はじめていきますね。
#WWWで外部とつながる時
Containerの中からWWWで外部とつながりたい時(例えばAPIを使用したい時)は、とても簡単です。
何も特にする事なく、APIを使うことができます
#ローカルホストとつながる時
例えば、ローカルホストにデータベースを置いて、それをContainerとつなげたい時。
特別のドメインである(host.docker.internal)を使います。
例えば、node.jsとmongodbを使ったアプリを開発している時、下のコードの<つなげたい先>と書いているところをhost.docker.internalに変えます。
mongoose.connect("mongodb://<つなげたい先>")
docker docsドキュメントで確認したい方はこちらからどうぞ
#他のContainerとつながる時
Containerを作る時のベストプラクティスは
1つのContainerにつき1つのタスク
と言われています。(WebサーバーのContainer, データベースのContainerでそれぞれ別個のContainerを作る)
それゆえ、アプリ開発においては、複数のContainerを作りそれらをつなげて使うという場面が多くなります。
今回の記事では、node.appとmonogodbを組み合わせてアプリを作るということを想定して
ContainerとContainerをつなげるため
にはどうしたらいいのか書いていきます
2つ以上のContainerをつなげる方法は2つあります
2つの選択肢を別々に下記に書いていきますね。
##IPアドレスを使って他のContainerとつながる
Docker hub にオフィシャルのmongoイメージがあるので、Dockerfileから作るのではなくオフィシャルのImageを使います
docker run -d --name mongodb mongo
ディタッチモードでmongo Image からcontainer を作りました。
バックグラウンドでmongoが実行中になりますから、そのまま
docker container inspect mongodb
で詳細を見てください。
すると、たくさんの情報が出てきますので、その中の『"NetworkSetting" > "IPADDRESS"』
を見つけてください。(下のスクショ参考)
ソースコードのアドレスを表しているところに貼り付けます
これで、このIPアドレスを使ってmongodbのContainerとつながることができます
ただ、IPアドレスを調べないといけなかったりして面倒くさいですよね。
他のContainerをつながる方法はもう一つあります。
下記にその方法を書いていきます
#同じネットワークに入れる
ContainerとContainerをつなぐもう一つの方法は、つなげたいContainerを同じネットワークに入れることです。
2つ以上のContainerを同じネットワークに入れるには『--network』を使います
##networkを作る
--networkオプションを使えば、2つ以上のContainerを同じnetworkに入れることができると言いましたが、 その前にnetwork自体を作らなければいけません。
docker network create <好きな名前>
とコマンドを打ち、まずネットワークを作ってください。
その後
docker run --name <containerの名前> --network <ネットワークの名前> <ImageID>
とします(ちなみに--nameオプションでContainerに名前を付けることができます。次のプロセスでcontainerの名前が必要なのでContainer名を覚えておいてください。)
実際にコマンドを実行した様子は下のスクショになります
これでmongodbのContainerが起動しました。
その後、このmongodbのContainerとnodeアプリをつなげるため、下記のようにコードを書き換えます。
上のスクショの赤で囲まれた部分に先ほどrunする時に--name オプションによって付けたContainerの名前を入れてください。
2つ以上のContainerを同じネットワーク内に入れることで、『Containerの名前によって』Container同士をつなげることができるようになります
今回は2つのContainerをつなげるので、同じネットワーク内(--network my-netのオプションをつけて)2つのContainerを実行しました(下のスクショ参考)
docker logs で上のようなWarningが出ればうまく行っています。
同じネットワーク内のContainerをつなぐには『-p』を使うのではなく、『container名』によって認識させます。
#まとめ
今回の記事は、mongodbの知識が少し必要だったりして、記事をまとめるのに少し時間がかかりました。(mongoose.connectの使い方が分かればスムーズに記事を読めると思います)
ただ、実際の現場では2つ以上のContainer同士、お互いコミュニケーションを取らせて開発する事が多くなると思います。
今回の記事が、少しでもお役に立てれば幸いです。