Docker コンテナー・ネットワークを使用する
Docker コンテナー・ネットワークの概要
セキュアに連動する Web アプリケーションを構築するには、Docker のネットワーク機能を使用してください。ネットワークとは、定義上、コンテナーを完全に分離するためのものです。したがって、アプリケーションの実行場所とするネットワークを制御することが重要となります。その制御を可能にするのが、Docker コンテナー・ネットワークです。
このセクションでは、Docker エンジンがネイティブに提供するデフォルトのネットワーキング動作の概要を説明します。Docker エンジンがデフォルトで作成するネットワークのタイプについて解説し、独自のユーザー定義ネットワークを作成する方法を紹介します。
デフォルト・ネットワーク
Docker をインストールすると、3 つのネットワークが自動的に作成されます。docker network ls コマンドを使用すると、自動的に作成されるこれらのネットワークを一覧表示できます。
$ docker network ls NETWORK ID NAME DRIVER 7fca4eb8c647 bridge bridge 9f904ee27bf5 none null cf03ee007fb4 host host
これら 3 つのネットワークは、Docker の一部として実装されます。コンテナーを実行する際に、どのネットワークでコンテナーを実行するかを指定するには、--net フラグを使用します。特定のネットワークを指定したとしても、3 つすべてのネットワークを引き続き利用できます。
- bridge ネットワークは、Docker をインストールしたすべての環境に存在する docker0 ネットワークを表します。docker run --net=<ネットワーク> オプションを指定しない限り、Docker デーモンはデフォルトでこのネットワークにコンテナーを接続します。ホスト上で ifconfig コマンドを使用すると、この bridge ネットワークがホストのネットワーク・スタックの一部として表示されます。
- none ネットワークは、コンテナー固有のネットワーク・スタックにコンテナーを追加します。none コンテナーにはネットワーク・インターフェースがありません。
- host ネットワークは、ホスト・ネットワーク・スタックにコンテナーを追加します。コンテナー内のネットワーク構成を見ると、それがホストのネットワーク構成とまったく同じであることがわかります。
ユーザー定義ネットワーク
独自のユーザー定義ネットワークを作成すると、コンテナーをさらに確実に分離できます。Docker には、そのようなネットワークを作成するためのデフォルトのネットワーク・ドライバーが用意されています。これらのネットワーク・ドライバーを使用して、新しい bridge ネットワークを作成したり、ネットワークをオーバーレイしたりできます。さらに、ネットワーク・プラグインやリモート・ネットワークを独自の仕様に合わせて作成することもできます。
複数のネットワークを作成することも、コンテナーを複数のネットワークに追加することも可能ですが、コンテナーが通信できるのはネットワーク内に限られます。コンテナーが、ネットワークをまたいで通信することはできません。例えば、あるコンテナーが2 つのネットワークに接続されている場合、そのコンテナーはどちらのネットワーク内のメンバー・コンテナーとも通信できます。コンテナーが複数のネットワークに接続される場合は、内部ネットワークではない、辞書順で最初のネットワークを介して外部接続が提供されます。
Power 上にオーバーレイ Docker ネットワークを作成する
Docker はデフォルトで、docker0 ブリッジに対応する bridge ネットワークを作成しますが、ユーザーが独自のネットワークを作成することもできます。docker network コマンドには、ネットワークを管理するために使用できる多数のオプションがあります。
[root@localhost ~]# docker network create test-network e2f569d57eb8506602fdfc3e8a20b12073782dcfd6046ce4ef76de8db3275d21 [root@localhost ~]# docker network inspect test-network [ { "Name": "test-network", "Id": "e2f569d57eb8506602fdfc3e8a20b12073782dcfd6046ce4ef76de8db3275d21", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ {} ] }, "Containers": {}, "Options": {} } ] [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER e12f674fea62 bridge bridge 0151f24befe9 host host e2f569d57eb8 test-network bridge e72a1d986a84 none null
上記の他にも使用できるオプションがあります (--subnet、--gateway、--ip-range など)。詳細を表示するには、docker network –help または docker network [COMMAND] –help コマンドを使用してください。
コンテナーをネットワークに接続するには、コンテナーを作成する際に、明示的に接続先ネットワークを指定します。
[root@localhost ~]# docker run -itd --name=test1 --net=test-network ppc64le/busybox /bin/sh 7699fe682353835166482d1416a70f0361ddf88940bd7102e2f84f6d46b3d113 [root@localhost ~]# docker network inspect test-network [ { "Name": "test-network", "Id": "e2f569d57eb8506602fdfc3e8a20b12073782dcfd6046ce4ef76de8db3275d21", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ {} ] }, "Containers": { "7699fe682353835166482d1416a70f0361ddf88940bd7102e2f84f6d46b3d113": { "EndpointID": "cf1f3e319a1c1ec83c3eaf0d5380b9ee50c1f2d37e713425996ada6788f8e77a", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" } }, "Options": {} } ]
コンテナーを動的にネットワークに接続することもできます。
[root@localhost ~]# docker run -itd --name=test2 ppc64le/busybox /bin/sh 69d79cddbdf8a920d24993bfc16e8d064479327d8cc23f10ae25e96a2b9b057a [root@localhost ~]# docker network connect test-network test2 [root@localhost ~]# docker network inspect test-network [ { "Name": "test-network", "Id": "e2f569d57eb8506602fdfc3e8a20b12073782dcfd6046ce4ef76de8db3275d21", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ {} ] }, "Containers": { "69d79cddbdf8a920d24993bfc16e8d064479327d8cc23f10ae25e96a2b9b057a": { "EndpointID": "5dc4877e71eca2243167e97153d56c5334d98991fcc3eb2f7f968d0b68416255", "MacAddress": "02:42:ac:12:00:03", "IPv4Address": "172.18.0.3/16", "IPv6Address": "" }, "7699fe682353835166482d1416a70f0361ddf88940bd7102e2f84f6d46b3d113": { "EndpointID": "cf1f3e319a1c1ec83c3eaf0d5380b9ee50c1f2d37e713425996ada6788f8e77a", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" } }, "Options": {} } ]