ネットワーク@Docker¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. Dockerネットワーク¶
bridgeネットワーク¶
▼ bridgeネットワークとは¶
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ネットワークとは¶
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