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 ...
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