コンテンツにスキップ

ネットワーク@Docker

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Dockerネットワーク

bridgeネットワーク

▼ bridgeネットワークとは

docker_bridge-network

bridgeネットワークは、コンテナのネットワークインターフェース (eth) 、ホストの仮想ネットワークインターフェース (veth) 、ホストのブリッジ (docker0) 、NATルーター (iptables) 、ホストのネットワークインターフェース (eth) 、といったコンポーネントから構成される。

ホスト上にブリッジを作成し、L2 (データリンク層) で複数のコンテナ間を接続する。

また、ホストのiptablesがNAPTルーターとして働き、ブリッジとホストの間を接続する。

brctlコマンドを使用し、docker0ブリッジがどの仮想インターフェースと接続されているかを確認できる。

$ brctl show docker0

bridge name     bridge id               STP enabled     interfaces
docker0         8000.02426c931c59       no              vethc06ae92

▼ 経路例

サーバーに対するリクエストがコンテナに届くまでを以下に示す。サーバーの8080番ポートと、WWWコンテナの80番ポートのアプリケーションの間で、ポートフォワーディングを行う。これにより、『http://<サーバーのプライベートIPアドレス (localhost) >:8080』にリクエストを送信すると、WWWコンテナのポート番号に転送されるようになる。

処理場所 リクエストの流れ プライベートIPアドレス例 ポート番号例
コンテナ内プロセス インバウンド通信を待ち受けるポート :80
⬆︎
コンテナ コンテナポート http://127.0.0.1
http://<Dockerのhostnameの設定値>
:80
⬆︎
ホスト 仮想ネットワーク http://172.*.*.*
⬆︎
ホスト 仮想ブリッジ
⬆︎
ホストハードウェア サーバーのNIC (イーサネットカード) http://127.0.0.1 :8080


noneネットワーク

▼ noneネットワークとは

特定のコンテナを、ホストや他のコンテナとは、ネットワーク接続させない。

$ docker network list

NETWORK ID          NAME                    DRIVER              SCOPE
7edf2be856d7        none                    null                local


hostネットワーク

▼ hostネットワークとは

docker_host-network

hostネットワークは、コンテナのネットワークインターフェース (eth) 、ホストのネットワークインターフェース (eth*) 、といったコンポーネントから構成される。

特定のコンテナとホストを直接的に接続する。

コンテナのIPアドレスは、ホストのIPアドレスになる。

$ docker network list

NETWORK ID          NAME                    DRIVER              SCOPE
ac017dda93d6        host                    host                local


02. ホストコンテナ間の接続方法

ホストから

▼ 『ホスト』から『コンテナ (localhost) 』にリクエスト

あらかじめコンテナに対してポートフォワーディングを実行しておき、『ホスト』から『コンテナ』に対して、リクエストを送信する。

ここでのコンテナ側のホスト名は、『localhost』となる。

ホストとコンテナの間のネットワーク接続の成否を確認できる。

*例*

『ホスト』から『コンテナ』に対してリクエストを送信し、ホストとアプリコンテナの間の成否を確認する。

# ホストで実行
$ curl --fail http://127.0.0.1:8080


コンテナから

▼ 『コンテナ』から『コンテナ』にリクエスト

『コンテナ』から『コンテナ』に対して、リクエストを送信する。

ここでのコンテナのホスト名は、コンテナ内の『/etc/hosts』に定義されたものとなる。

リクエストはホストを経由せず、そのままコンテナに送信される。

コンテナ間のネットワーク接続の成否を確認できる。

コンテナのホスト名の定義方法については、以下のリンクを参考にせよ。

*例*

『アプリコンテナ』から『Webコンテナ』に対して、リクエストを送信し、アプリコンテナとWebコンテナの間の成否を確認する。

# コンテナ内で実行
$ curl --fail http://<webコンテナに割り当てたホスト名>:80/

▼ 『コンテナ』から『ホスト (host.docker.internal) 』にリクエスト

『コンテナ』から『ホスト』に対して、リクエストを送信する。

ここでのホスト側のホスト名は、『host.docker.internal』になる。

リクエストは、ホストを経由して、ポートフォワーディングされたコンテナに転送される。

ホストとコンテナの間のネットワーク接続の成否を確認できる。

*例*

# コンテナ内で実行
$ curl --fail http://host.docker.internal:8080