😋

dockerコンテナのネットワーク

2021/02/13に公開

はじめに

くーばねてすをやっつけるために新たなステージに上がるためについにdockerさんに会いに行くことにした。dockerさんと仲良くなることでコンテナシステムの仕組みの理解とくーばねてすを倒すための調査をする。

概要

■コンテナコンテナネットワークのコマンド
■コンテナネットワークの色んな接続形式

をまとめた!(>_<)

■コンテナコンテナネットワークのコマンド

コンテナの接続にはコンテナホストの内部ネットワークのみの接続と、ポートを公開し外部からコンテナに接続するなど、色んな接続方式がある。
↓コンテナのネットワークに関するコマンド
|コマンド|意味|
| --- | --- | --- |
|docker network ls|コンテナネットワークをリスト表示する|
|docker network inspect|ネットワークの詳細を表示する|
|docker network create|コンテナネットワークを生成する|
|docker network rm|コンテナネットワークを削除する|
|docker network connect|コンテナをコンテナネットワークに接続する|
|docker network disconnect|コンテナをコンテナネットワークから引き離す|

■コンテナネットワークの色んな接続形式

Dockerをインストールした時に、自動的に3つのネットワークが作成される。ネットワーク一覧を表示するには docker network ls コマンドを使う。

コンテナネットワークワークを一覧表示する
$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
8354a6451885   bridge    bridge    local
6d896bed8ed2   host      host      local
ccf965a5f653   none      null      local

Dockerをインストールした全ての環境には、docker0というブリッジ( bridge )ネットワークが作成される。
デフォルトでは自動的に bridge ネットワークを作成される。

none ネットワーク

none: ネットワーク・インターフェースを使用しないネットワーク構成。

none ネットワークは接続のない ネットワークドライバになる。
ネットワーク接続を必要としないコンテナを作成する場合に使用される。

noneネットワークに指定してコンテナを起動する
$ docker attach nonenetcontainer
または
$ docker run --net=none ...

ifconfigコマンドを使用するとネットワーク環境の状態確認や設定確認をすることができる。

noneネットワークでコンテナ起動
$ docker run --name none_net_busybox --net=none -ti busybox /bin/sh
# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ifconfigの出力結果はここ見て↓(わかりやすかった)
https://qiita.com/pe-ta/items/aff8db72530c6baa11b2
nullネットワークはどことも繋がってないので、lo(ローカルのコンテナ)だけが表示される。
ネットワークがローカルのコンテナだけなのがわかる。

hostネットワーク

host: ホストマシンと同一のネットワークインターフェースを使用する。
コンテナ内ではeth0を通じてネットワーク通信が出来る。

hostネットワークでコンテナ起動
$ docker run --net=host ...
$ docker run --name host_net_busybox --net=host -ti busybox /bin/sh
/ # cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:D9:9C:B6:AA
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  HWaddr 02:50:00:00:00:01
          inet addr:192.168.65.3  Bcast:192.168.65.15  Mask:255.255.255.0
          inet6 addr: fe80::50:ff:fe00:1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1735 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1465 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:976315 (953.4 KiB)  TX bytes:131379 (128.2 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:820 errors:0 dropped:0 overruns:0 frame:0
          TX packets:820 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:79656 (77.7 KiB)  TX bytes:79656 (77.7 KiB)

ifconfigの出力結果でlo(ローカルのコンテナ)がdocker0(内部インターフェイス)、eth0(外部インターフェース)を通じてホストマシンと同一のネットワークインターフェース(eth0)で構成されているのがわかる。

bridgeネットワーク

bridge: docker0を使用する。コンテナ起動時にネットワーク・インターフェースを指定しなければ自動的にこれが割り当てられる。
コンテナ内ではeth0を通じてネットワーク通信が出来る。
docker runで--netオプションを指定しない場合、bridge が適用される

Docker ホスト上の全てのデフォルト・ネットワーク・ブリッジを表示するには、docker network inspect を使う。
JSON形式で表示されるブリッジのネットワーク構成を確認できる。

$  docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "d6375085c5a07e1602345e7c13a60e06b6de606de15c8942cec4c12ff7948881",
        "Created": "2021-02-12T20:19:38.1033905Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "8b060cf9d5eb8d4fb78115cef17b3a51fc89aae4cdd0024f93605ad32fb081dd": {
                "Name": "reverent_saha",
                "EndpointID": "2df897619d3e76d192ac58b5952d84623d342c3a75dbcf989ebb7f738baab51c",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

まとめ

なぜかdockerコマンドが使えなくなって、死んでた(>_<)
再インストールしたらなおった!

Discussion