12/08/2018, 13:50

Tìm hiểu và làm việc với docker container networks (P3)

Trong bài viết trước chúng ta đã tìm hiểu về cách kết nối các container trong docker network thông qua command. Ở bài viết này chúng ta tiếp tục tìm hiểu về cách ngắt kết nối container ra khỏi docker network, hoặc remove một network: 1. Network-scoped alias Trong khi *link*s cung cấp một ...

docker_commands.png

Trong bài viết trước chúng ta đã tìm hiểu về cách kết nối các container trong docker network thông qua command. Ở bài viết này chúng ta tiếp tục tìm hiểu về cách ngắt kết nối container ra khỏi docker network, hoặc remove một network:

1. Network-scoped alias

Trong khi *link*s cung cấp một private name giới hạn bên trong mỗi container thì network-scoped alias lại cung cấp một phương thức giúp các container được tìm ra bởi các tên thay thế bằng bất kỳ container nào khác bên trong phạm vi của mạng đặc thù. Không giống như link alias, được định nghĩa bởi các đối tượng sử dụng service, network-scoped alias được định nghĩa bởi chính container đưa ra service vào network.

Tiếp tục ví dụ ở phần 2, ta tạo một container khác bên trong isolated_nw với một network alias.

$ docker run --network=isolated_nw -itd --name=container6 --network-alias app busybox

8ebe6767c1e0361f27433090060b33200aac054a68476c3be87ef4005eb1df17
$ docker attach container4

/ # ping -w 4 app
PING app (172.25.0.6): 56 data bytes
64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms
64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms

--- app ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.070/0.081/0.097 ms

/ # ping -w 4 container6
PING container5 (172.25.0.6): 56 data bytes
64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms
64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms

--- container6 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.070/0.081/0.097 ms

Bây giờ hãy thử connect container6 vào local_alias network với một network-scoped alias khác.

$ docker network connect --alias scoped-app local_alias container6

container6 trong ví dụ này có:

  • alias là: app trong network isolated_nw
  • alias là: scoped-app trong network local_alias.

Thử kết nối tới các aliases này từ container4 (Container được connect tới cả 2 networks) và container5 (Chỉ được connect tới isolated_nw network).

$ docker attach container4

/ # ping -w 4 scoped-app
PING foo (172.26.0.5): 56 data bytes
64 bytes from 172.26.0.5: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.26.0.5: seq=1 ttl=64 time=0.080 ms
64 bytes from 172.26.0.5: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.26.0.5: seq=3 ttl=64 time=0.097 ms

--- foo ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.070/0.081/0.097 ms

$ docker attach container5

/ # ping -w 4 scoped-app
ping: bad address 'scoped-app'

Như bạn có thể thấy, alias được giới hạn bên trong network mà nó định nghĩa và chỉ có các containers kết nối tới network có thể truy cập alias.

In addition to the above features, multiple containers can share the same network-scoped alias within the same network. For example, let’s launch container7 in isolated_nw with the same alias as container6

Ngoài các tính năng trên, nhiều container có thể chia sẻ một network-scoped alias bên trong một network. Ví dụ, chúng ta hãy khởi động container7 trong isolated_nw với alias như container6

$ docker run --network=isolated_nw -itd --name=container7 --network-alias app busybox

3138c678c123b8799f4c7cc6a0cecc595acbdfa8bf81f621834103cd4f504554

Khi nhiều container cùng chia sẻ một alias, name resolution tới các alias sẽ xảy ra với một trong các container (thông thường sẽ là container đầu tiên được aliased). Khi một container liên kết tới alias bị tắt bỏ hoặc ngắt kết nối khỏi network, thì container tiếp đó liên kết tới alias sẽ được resolved.

Thử ping tới alias app từ container4 và tắt bỏ container6 để xác nhận container7 resolving app alias.

$ docker attach container4

/ # ping -w 4 app
PING app (172.25.0.6): 56 data bytes
64 bytes from 172.25.0.6: seq=0 ttl=64 time=0.070 ms
64 bytes from 172.25.0.6: seq=1 ttl=64 time=0.080 ms
64 bytes from 172.25.0.6: seq=2 ttl=64 time=0.080 ms
64 bytes from 172.25.0.6: seq=3 ttl=64 time=0.097 ms

--- app ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.070/0.081/0.097 ms

$ docker stop container6

$ docker attach container4

/ # ping -w 4 app
PING app (172.25.0.7): 56 data bytes
64 bytes from 172.25.0.7: seq=0 ttl=64 time=0.095 ms
64 bytes from 172.25.0.7: seq=1 ttl=64 time=0.075 ms
64 bytes from 172.25.0.7: seq=2 ttl=64 time=0.072 ms
64 bytes from 172.25.0.7: seq=3 ttl=64 time=0.101 ms

--- app ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.072/0.085/0.101 ms

2. Disconnecting containers

Bạn có thể disconnect một container với network bằng cách sử dụng docker network disconnect command.

$ docker network disconnect isolated_nw container2

$ docker inspect --format='  container2 | python -m json.tool

{
    "bridge": {
        "NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812",
        "EndpointID": "9e4575f7f61c0f9d69317b7a4b92eefc133347836dd83ef65deffa16b9985dc0",
        "Gateway": "172.17.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "MacAddress": "02:42:ac:11:00:03"
    }
}

$ docker network inspect isolated_nw

[
    {
        "Name": "isolated_nw",
        "Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1/16"
                }
            ]
        },
        "Containers": {
            "467a7863c3f0277ef8e661b38427737f28099b61fa55622d6c30fb288d88c551": {
                "Name": "container3",
                "EndpointID": "dffc7ec2915af58cc827d995e6ebdc897342be0420123277103c40ae35579103",
                "MacAddress": "02:42:ac:19:03:03",
                "IPv4Address": "172.25.3.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {}
    }
]

Một container bị disconnected khỏi một network sẽ không thể nói chuyện với các containers khác đang connected tới network đó. Ví dụ, container2 sẽ ko thể nói chuyện với container3 trên isolated_nw network.

$ docker attach container2

/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:03
          inet addr:172.17.0.3  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:3/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:9001  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)

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: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)

/ # ping container3
PING container3 (172.25.3.3): 56 data bytes
^C
--- container3 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

Trong khi container2 vẫn kết nối tới bridge network

/ # ping container1
PING container1 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.119 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.174 ms
^C
--- container1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.119/0.146/0.174 ms
/ #

Ở một số trường hợp như khởi động lại Docker daemon trong mạng multi-host network(đa máy chủ), nơi mà các daemon là không thể cleanup kết nối cũ. Enpoint đó có thể gây ra lỗi "container already connected to network" khi có một container mới được kết nối với mạng có cùng tên với endpoint cũ. Để cleanup các điểm kết cuối cũ, ta cần force disconnect (docker network disconnect -f). Một khi các thiết bị đầu cuối được cleanup, các container có thể kết nối vào mạng.

$ docker run -d --name redis_db --network multihost redis

ERROR: Cannot start container bc0b19c089978f7845633027aa3435624ca3d12dd4f4f764b61eac4c0610f32e: container already connected to network multihost

$ docker rm -f redis_db

$ docker network disconnect -f multihost redis_db

$ docker run -d --name redis_db --network multihost redis

7d986da974aeea5e9f7aca7e510bdb216d58682faa83a9040c2f2adc0544795a

3. Remove a network

Khi tất cả các containers bên trong một network được stopped hoặc disconnected, bạn có thể gỡ bỏ network đó.

$ docker network disconnect isolated_nw container3
docker network inspect isolated_nw

[
    {
        "Name": "isolated_nw",
        "Id": "06a62f1c73c4e3107c0f555b7a5f163309827bfbbf999840166065a8f35455a8",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1/16"
                }
            ]
        },
        "Containers": {},
        "Options": {}
    }
]

$ docker network rm isolated_nw

Liệt kê lại tất cả các networks để xác nhận rằng isolated_nw đã bị gỡ bỏ:

$ docker network ls

NETWORK ID          NAME                DRIVER
72314fa53006        host                host
f7ab26d71dbd        bridge              bridge
0f32e83e61ac        none                null

4.

0