見出し画像

コンテナのネットワークを操作してみました。

はじめに

ハローワールド!マイクです。
 Dockerはオープンなプラットフォームです。Dockerオブジェクトと呼ばれるイメージ、コンテナ、ネットワーク、ボリュームなどで構成され、これらを操作する事でアプリケーションを開発、配布、実行することが出来ます。
Dockerネットワーク(以下ネットワーク)がどうなっているのか見てみましょう。

使ったもの

 今回の環境を下記に示しておきます。
 ・Ubuntu 22.04 LTS Desktop 64-bit
 ・Docker version 20.10.13 build a224086

ネットワークを簡単な図でまずみてみましょう

 下の図をご覧ください。コンテナAとコンテナCはネットワークαを使っています。コンテナBはネットワークβを使っています。各コンテナは、それぞれ一つのネットワークを使っている状態です。ネットワークα、βはバーチャルネットワーク(ソフトウェアネットワーク)です。
 コンテナAとコンテナCはコンテナ名でお互いに通信することができます。コンテナが起動するとき、内部IPアドレスが割り振りされますが同じネットワークを使っているコンテナ同士はDockerに組み込まれているDNSサーバを使用して通信します。バーチャルネットワークはコンテナが稼働中でも設定を変更することができます。コンテナを追加したり削除したりすることを考えるとコンテナ名で通信した方が便利だと思います。コンテナAとコンテナBがインターネットなどの外部のネットワークと通信するときはDocker Firewall(NAT firewallです)を通過します。このときは内部IPアドレスを使用して通信します。
 では、コンテナAまたはコンテナCがコンテナBと通信するときはどういう経路をたどるのでしょうか?コンテナBはネットワークβを使っているので内部DNSサーバもネットワークαとは違うものですので、内部IPアドレスを使ってDocker Firewall経由で通信することになります。
 コンテナを起動するときにネットワークに関して一つ注意が必要です。それは、バーチャルネットワークを指定しないと”bridge/docker0”というデフォルトのバーチャルネットワークに接続されてしまいます。”bridge/docker0”には内部DNSサーバが無いので、同じ”bridge/docker0”を使用しているコンテナ同士はコンテナ名で通信できません。(コンテナ名でも通信可能とのことですので、調べて後日追記させていただきます。)

 次の図ではコンテナAはネットワークαとネットワークβを同時に使っています。(コンテナは同時に複数のネットワークを使用することができます。)この例ではコンテナAはコンテナC、コンテナBとコンテナ名で通信できることになります。

ここでのまとめとして。
 ・コンテナはバーチャルネットワークを使います。
 ・同じバーチャルネットワークを使っているコンテナは内部DNSを使ってコンテナ名で通信します。
 ・コンテナが稼働中でもバーチャルネットワークの設定を変更することができます。
 ・デフォルトのバーチャルネットワークにはDNSサーバがありません。

ネットワーク操作に関するコマンドをみてみましょう

ネットワーク操作するコマンドをいくつか紹介したいと思います。

・ネットワークの一覧を表示する

 > docker network ls
 NAMEがbridgeになっているのがデフォルトネットワークです。

docker network lsの例

・ネットワークの設定を見てみる

 > docker network inspect ”ネットワーク名”
 ネットワークの設定のコンテナがそのネットワークを使っている場合は、そのコンテナ名、マックアドレス、内部IPアドレスなど見ることができます。

bridgeネットワークをnginxコンテナが使用中の例

・バーチャルネットワークを作成する

 > docker network create ”ネットワーク名”
 作成が完了するとNETWORK IDが表示されます。

my_network3というバーチャルネットワークを作成した例

・コンテナをネットワークと接続する

 > docker network connect ”ネットワーク名” ”コンテナ名”
 コンテナ起動時に接続されたネットワークも接続したままなので注意してください。ネットワークの接続を追加した形になります。

・コンテナからネットワークを切り離す

 > docker network disconnect ”ネットワーク名” "コンテナ名"

・コンテナを起動するときにネットワークを指定して起動する

 > docker container run -d --network "ネットワーク名" ”イメージ名”

最後に

 今回はコンテナのネットワークについて書いてみました。最後まで読んで頂きありがとうございます。

参考

履歴

2022年12月21日:投稿


この記事が気に入ったらサポートをしてみませんか?