眾所皆知,Container是個封閉的空間,但難免有些功能開發是需要與其他Containers甚至是外界串接的,因此Docker network因應不同需求發展出了多種類別的network,我們這章節就是來探討這些networks!
Docker network因應不同需求分為幾種類別,分別是Bridge networks、Overlay networks、Host networking以及Macvlan networks。
若無更改network driver,docker network預設為Bridge networks,Bridge networks通常運用做需要獨立通信的Container當中

Host networking會使Container的隔離性質消失,在該Container當中可以直接使用例如localhost來找尋到主機上的port或其他資源。
Overlay networks能使不同docker daemons間互相通信,使不同群集的服務能夠交流,亦也能使不同的獨立Containers間互相通信。

Maclvan允許使用者能將實體網卡設定多個mac address,並將這些address分配給Container使用,使其在network上顯示為physical address 而非 virtual address。maclvan希望能讓某些只能連到物理設備的應用程序能夠正常運作。

看完了Docker常用的4種 network strategy後,我們來講解如何使用這四種strategy吧。
docker network --help
$ docker network --help
Usage:	docker network COMMAND
Manage networks
Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
docker network create
$ docker network create ironman-net
1b91cad2401fdf36482e1abbf47ee5cd74f1600be3556572678738623fd14991
docker network ls
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0978533ef4d1        bridge              bridge              local
a40bb020e8b9        host                host                local
1b91cad2401f        ironman-net         bridge              local
256d21120265        none                null                local
docker network inspect
$ docker network insepct bridge
[
    {
        "Name": "bridge",
        "Id": "653a3066b79384304599e1d343e39885ae623494bb04bbde0d8605a3aa0974a0",
        "Created": "2020-09-23T01:39:19.986816788Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "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 network rm
$ docker network rm ironman-net
1b91cad2401fdf36482e1abbf47ee5cd74f1600be3556572678738623fd14991
$ docker run --name ironman -d --network ironman-net  -p 8100:8100 ghjjhg567/ironman:latest
c26ebd3d29bd3af588204e7d0279c0587334a64aedbf0c285a23b4634f22f9c7
$ docker network connect ironman-net ironman
$ docker network disconnect ironman-net ironman
$ docker run --name ironman1 -dit --network ironman-net alpine ash
docker run --name ironman2 -dit --network ironman-net alpine ash
$ docker network inspect ironman-net
[
    {
        "Name": "ironman-net",
        "Id": "859d37a80ce2caa432ff55251f132b362af44b2b702b7caa08bd1bee6d98f797",
        "Created": "2020-09-23T02:12:05.436153605Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "4c75eb83197bda1f42e4eacc00ffcf52f451b68c46e2e530895e573c6e46e0fa": {
                "Name": "ironman1",
                "EndpointID": "83b4afdfa4781d0b62b4e153552b5d262aab0289683b9c33dd0ff41427039483",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "bc982f774a104557e2082415ca8452b2a5929b1a237f810dcf75b925030ec549": {
                "Name": "ironman2",
                "EndpointID": "3bd12690f8b7b06dbe666421f96f8df627c475ef0e22b3e1051dc7e85167fd07",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
$ docker exec -it ironman1 ping -c 5 ironman2
PING ironman2 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.093 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.083 ms
64 bytes from 172.19.0.2: seq=2 ttl=64 time=0.111 ms
64 bytes from 172.19.0.2: seq=3 ttl=64 time=0.121 ms
64 bytes from 172.19.0.2: seq=4 ttl=64 time=0.111 ms
--- ironman2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.083/0.103/0.121 ms
透過這次的測試我們能確定,在同個bridge的containers能夠以container name當作host互通訊息。
如前言所述,overlay network主要用來連接不同docker engine所創建的network,使不同cluster中的containers能夠相互通訊。但由於本系列追求循序漸進,因此overlay network會放在後面篇章再來解說。
—network host
$ docker run --name ironman -d --network host ghjjhg567/ironman:latest
在創建macvlan network時,需要輸入
$ docker network create -d macvlan \                                                  2526  18:14:40
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1 \
  -o parent=eth0 ironman-net
148e412e37ef660272c407f01d9dda952e8d0abd31e62871653ee8292f213a0a
若想排除特定IP address,可能因為已經被使用,則需加上-aux-addresses
$ docker network create -d macvlan \                                            127 ↵  2535  18:25:35
  --subnet=172.16.86.0/24 \
  --gateway=172.16.86.1 \
  --aux-address="my-router=172.16.86.2" \
  -o parent=eth0 ironman-net
148e412e37ef660272c407f01d9dda952e8d0abd31e62871653ee8292f213a0a
若docker daemon允許ipv6,當然也能讓macvlan支援ivp6 protocol
$ $ docker network create -d macvlan \
    --subnet=192.168.216.0/24 --subnet=192.168.218.0/24 \
    --gateway=192.168.216.1 --gateway=192.168.218.1 \
    --subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10 \
     -o parent=eth0.218 \
     -o macvlan_mode=bridge macvlan216
這章節透過Docker CLI來練習除了overlaying外的其他docker networks,並讓我們知道在何種情況應該讓Container選擇使用何種Network,在後面的篇章中也會再回頭介紹Overlay network,敬請期待!

https://docs.docker.com/network/
https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/