コンテンツにスキップ

ネットワーク@Docker

はじめに

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


01. Dockerネットワーク

bridgeネットワーク

▼ bridgeネットワークとは

docker_bridge-network

bridgeネットワークは、

  • コンテナイーサネット (eth)
  • 両端にネットワークインターフェースをもつ仮想イーサネット (veth)
  • 仮想ブリッジ (docker0)
  • NATルーター (iptables)
  • 両端にネットワークインターフェースをもつホストイーサネット (eth)

といったコンポーネントから構成される。

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

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

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

$ brctl show docker0

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

仮想ネットワークインターフェースのIPアドレス

docker network inspect foo-network

[
    {
        "Name": "foo-network",
        "Id": "*****",
        "Created": "2025-02-01T09:10:16.535005673Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    # docker0ブリッジのサブネットマスク
                    "Subnet": "172.18.0.0/16",
                    # docker0ブリッジのゲートウェイのIPアドレス
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

ブリッジのサブネットマスクとゲートウェイのIPアドレスは自動で割り当てられるが、明示的に設定することもできる。

$ docker network create foo-network --subnet=172.18.0.0/16 --gateway=172.18.0.1

▼ 経路例

サーバーに対するリクエストがコンテナに届くまでを以下に示す。サーバーの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