Dockerのネットワークについて

前回の記事の続きです。今回は、Dockerがサポートしている、コンテナーのネットワーキングについて見ていきたいと思います。

Dockerエンジンには、デフォルトで3つのネットワークがインストールされています。次のコマンドで確認ができます。

$ docker network ls
NETWORK ID NAME DRIVER SCOPE
675d041ec5a7        bridge              bridge              local
f3d52d30c122        host                host                local
ff11ec3c0eb7        none                null                local

bridge は、デフォルトの、つまりネットワークを指定しない時に使われるものになります。

このネットワーク、 bridge を調べるコマンドは次のようになります。

$ docker network inspect bridge
[
{
  "Name": "bridge",
  "Id": "675d041ec5a75946c1a95616ad0a5d64c500a2da85b2ede4b510da2ab6efd2a2",
  "Created": "2017-09-05T05:05:35.269071987Z",
  "Scope": "local",
  "Driver": "bridge",
  "EnableIPv6": false,
// [...]

また、あるコンテナー(networktestとする)のdefaultネットワーク(bridge)を、取り除く処理は次のコマンドになります。

$ docker network disconnect bridge networktest

では、独自のネットワーク(pre-installedされたネットワーク以外)のものを作成する方法を見ていきます。

今回作成するものは、bridgeネットワークになります。(Docker Engineはoverlayネットワークを作って、複数のホストを組み入れることもできます)

$ docker network create -d bridge my_bridge
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
675d041ec5a7        bridge              bridge              local
ad94ab3c474b        my_bridge           bridge              local
f3d52d30c122        host                host                local
ff11ec3c0eb7        none                null                local
$ docker network inspect my_bridge
// [...]
// PosgreSQLを動かすコンテナーを、上で作ったネットワークにつなげて、走らせます。
$ docker run -d --net=my_bridge --name db training/postgres
// my_bridgeに新しくコンテナーが追加されるのを確認
$ docker network inspect my_bridge
// コンテナーがどのネットワークにつながっているかの確認
$ docker inspect --format='{{json .NetworkSettings.Networks}}' db
// アプリを、ネットワークを指定しない(defaultのbridgeネットワーク)で、立ち上げます。
$ docker run -d --name web training/webapp python app.py
// defaultのbridgeネットワークの下で、アプリが走っていることを確認
$ docker inspect --format='{{json .NetworkSettings.Networks}}' web
// webのIPアドレスを確認
$ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
// 実行中のdbコンテナーに対して、shellを開きます。
$ docker exec -it db bash
// pingを叩き、応答をみます。途中で、CTRL+Cで処理を止めます。
root@a205f0dd33b2:/# ping 172.17.0.2
// [...]
root@a205f0dd33b2:/# exit
/*
上のshell上でのpingが失敗した理由は、webがデフォルトのbridgeネットワークを使ってていたのに対して、dbは独自ネットワークmy_bridgeと異なる経路を通っているためです。
お互いのネットワークを同じにすると、webとdbとの通信が可能になります。
*/
// 今度は、先程つくった、独自ネットワークとwebとをつなげます。コンテナーに複数のネットワークをつなげることは、Dockerネットワークでは可能になります。
$ docker network connect my_bridge web
// 再度、pingを叩いて、通信が可能なことを確認します。
$ docker exec -it db bash

root@a205f0dd33b2:/# ping web
// [...]
//今度はping通信が成功することが、分かります。
root@a205f0dd33b2:/# exit

上の例では、webに my_bridge ネットワークを繋げる前と後では、異なるIPアドレスであることが示されています。

以上が、Dockerにおけるネットワークの管理方法になります。

Show your support

Clapping shows how much you appreciated Tuyoshi Akiyama’s story.