1. Đặt vấn đề
Như chúng ta đã biết, các container chạy trên cùng một host chúng ta có nhiều cách để có thể kết nối chúng với nhau ví dụ như dùng bridge network hay host network. Vậy làm thế nào để kết nối các container nằm trên nhiều server khác nhau để chúng có thể nói chuyện được với nhau.
Trong trường hợp này chúng ta có thể dùng Overlay network
trong docker.
- Overlay network là mạng có thể kết nối nhiều container trên các Docker Engine lại với nhau, trong môi trường cluster.
- Swarm tạo ra overlay network chỉ available với các nodes bên trong swarm. Khi bạn tạo ra một service sử dụng overlay network, manager node sẽ tự động kế thừa overlay network tới các nodes chạy các service tasks.
Môi trường thử nghiệm
Ở đây tôi sẽ dùng 2 server để tiến hành thử nghiệm, hệ điều hành là Ubuntu 18.04, hệ thống đi kèm với kernel là 4.15.0-72-generic, lưu ý rằng overlay yêu cầu phiên bản kernel 3.16 trở lên.
Tên máy chủ | IP | Lưu ý |
---|---|---|
ubfox1 | 192.168.11,21 | master |
ubfox2 | 192.168.11.22 | worker |
2. Cài đặt docker
Cài đặt docker trên tất cả các server đã chuẩn bị, sử dụng các nguồn APT chính thức.
Bạn có thể tham khảo cách cài docker trong linux tại đây ,hoặc trên windows hoặc trên macos.
#Remove docker đi kèm với hệ thống sudo apt-get remove docker docker-engine docker.io # Cài đặt mô-đun sudo apt install apt-transport-https ca-certificates curl software-properties-common #Add key curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - #Add repo APT sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" #Install docker sudo apt-get update sudo apt-get install docker-ce # check docker running sudo systemctl status docker
3. Cấu hình firewall
Chúng ta sẽ cần phải cấu hình firewall để các node có thể connect được đến nhau.
- Cổng TCP 2376 để giao tiếp Docker client an toàn. Cổng này là cần thiết để Docker Machine hoạt động.
- Cổng TCP 2377. Cổng này được sử dụng để liên lạc giữa các node của Docker Swarm hoặc cluster. Nó chỉ cần được mở trên các node master.
- Cổng TCP và UDP 7946 để liên lạc giữa các node (container network discovery).
- Cổng UDP 4789 cho overlay network traffic (container ingress networking).
4. Cấu hình cụm swarm
Khởi tạo cụm trên node master và chạy lệnh như sau:
root@ubuntu1:/etc/apt# docker swarm init --advertise-addr 192.168.11.21 Swarm initialized: current node (tg8klhxnuk89tya2lhe35tqx7) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4m8sl3yl15aop8g7045evqcdh7yxvkrg6be2hhatz2wcyne4d2-ed56hwycegzmq18bvpm3pmodz 10.16.16.56:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
Thêm nút worker vào cluster và thực hiện lệnh sau trên worker:
docker swarm join --token SWMTKN-1-4m8sl3yl15aop8g7045evqcdh7yxvkrg6be2hhatz2wcyne4d2-ed56hwycegzmq18bvpm3pmodz 10.16.16.56:2377
OK, bây giờ chúng ta có thể xem cluster và network trên node master:
root@ubuntu1:/etc/apt# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 150g6f1pd68qjk7wqggtc4zyf * ubuntu1 Ready Active Leader 18.06.0-ce mzdlapyot4zb7dj15t0wcy99h ubuntu2 Ready Active 18.06.0-ce root@ubuntu1:/etc/apt# root@ubuntu1:/etc/apt# docker network ls NETWORK ID NAME DRIVER SCOPE 9b76e6c3cada bridge bridge local 97a02511ca57 docker_gwbridge bridge local bb0a7a05d2c5 host host local ojjiuarwgrpm ingress overlay swarm 68dac67e9965 none null local
5. Tạo mới một overlay network
#tạo một overlay network root@ubuntu1:/etc/apt# docker network create -d overlay --subnet=192.168.0.0/24 --gateway=192.168.0.254 --attachable testnetwork 0crsggk0wycauo9kjwj8z00f1 #xem network root@ubuntu1:/etc/apt# docker network ls NETWORK ID NAME DRIVER SCOPE 9b76e6c3cada bridge bridge local 97a02511ca57 docker_gwbridge bridge local bb0a7a05d2c5 host host local ojjiuarwgrpm ingress overlay swarm 68dac67e9965 none null local 0crsggk0wyca testnetwork overlay swarm #xem chi tiết thông tin của network root@ubuntu1:/etc/apt# docker network inspect testnetwork [ { "Name": "testnetwork", "Id": "0crsggk0wycauo9kjwj8z00f1", "Created": "2018-08-09T17:05:06.757781593Z", "Scope": "swarm", "Driver": "overlay", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "192.168.0.0/24", "Gateway": "192.168.0.254" } ] }, "Internal": false, "Attachable": true, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": null, "Options": { "com.docker.network.driver.overlay.vxlanid_list": "4097" }, "Labels": null } ]
6. Kiểm tra network container
Tạo một container busybox1 trên master node:
root@ubuntu1:/etc/apt# docker run -itd --name=busybox1 --network=testnetwork busybox /bin/sh Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 8c5a7da1afbc: Pull complete Digest: sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd Status: Downloaded newer image for busybox:latest 1a0c723dd2990813a07d1e9d95b8924edea0bf4e507471ebb619a3ad68ee3a70 # Kiểm tra lại network, bạn có thể tìm thấy IP của container và IP LB root@ubuntu1:/etc/apt# docker network inspect testnetwork [ { "Name": "testnetwork", "Id": "0crsggk0wycauo9kjwj8z00f1", "Created": "2018-08-10T01:06:34.830676798+08:00", "Scope": "swarm", "Driver": "overlay", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "192.168.0.0/24", "Gateway": "192.168.0.254" } ] }, "Internal": false, "Attachable": true, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "1a0c723dd2990813a07d1e9d95b8924edea0bf4e507471ebb619a3ad68ee3a70": { "Name": "busybox1", "EndpointID": "95bc3d1c0ddd3aacb15070aafb8aebb9dc31029ca0684288af72081ab34ad085", "MacAddress": "02:42:c0:a8:00:03", "IPv4Address": "192.168.0.3/24", "IPv6Address": "" }, "lb-testnetwork": { "Name": "testnetwork-endpoint", "EndpointID": "0f28c078488afb7a19a2d8ec37bb6df5991f763db2f714c0f8c1f23728fb5b46", "MacAddress": "02:42:c0:a8:00:01", "IPv4Address": "192.168.0.1/24", "IPv6Address": "" } }, "Options": { "com.docker.network.driver.overlay.vxlanid_list": "4097" }, "Labels": {}, "Peers": [ { "Name": "67603512578a", "IP": "192.168.11.21" }, { "Name": "f77f0897a85b", "IP": "192.168.11.22" } ] } ]
Tạo một container busybox2 trên node worker:
root@ubuntu2:~# docker run -itd --name=busybox2 --network=testnetwork busybox /bin/sh Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 8c5a7da1afbc: Pull complete Digest: sha256:cb63aa0641a885f54de20f61d152187419e8f6b159ed11a251a09d115fdff9bd Status: Downloaded newer image for busybox:latest bb544eaf149086f93e6c35d9098a937282ed442be582e4516c24ac5fce9100da root@ubuntu2:~# docker network inspect testnetwork [ { "Name": "testnetwork", "Id": "0crsggk0wycauo9kjwj8z00f1", "Created": "2018-08-10T01:07:23.121549142+08:00", "Scope": "swarm", "Driver": "overlay", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "192.168.0.0/24", "Gateway": "192.168.0.254" } ] }, "Internal": false, "Attachable": true, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "bb544eaf149086f93e6c35d9098a937282ed442be582e4516c24ac5fce9100da": { "Name": "busybox2", "EndpointID": "bd61b48e4b066d9e9ca81a267ee0c554c047f6bd68e16795fff81180f4b3fcdd", "MacAddress": "02:42:c0:a8:00:04", "IPv4Address": "192.168.0.4/24", "IPv6Address": "" }, "lb-testnetwork": { "Name": "testnetwork-endpoint", "EndpointID": "f912103a56c705c31c8ee9476dfca1c53d0e2e321781a38338b3a180c3d08f36", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/24", "IPv6Address": "" } }, "Options": { "com.docker.network.driver.overlay.vxlanid_list": "4097" }, "Labels": {}, "Peers": [ { "Name": "67603512578a", "IP": "192.168.11.21" }, { "Name": "f77f0897a85b", "IP": "192.168.11.22" } ] } ]
Như vậy chúng ta đã có 2 container:
- Container busybox1 trên node master có ip là: 192.168.0.3
- Container busybox2 trên node worker có ip là: 192.168.0.4
Chúng ta hãy ping nhau trong 2 container mà chúng ta vừa tạo để thử nghiệm:
#trên node master root@ubuntu1:/etc/apt# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1a0c723dd299 busybox "/bin/sh" About a minute ago Up About a minute busybox1 root@ubuntu1:/etc/apt# docker exec -it 1a0c723dd299 ping 192.168.0.4 PING 192.168.0.4 (192.168.0.4): 56 data bytes 64 bytes from 192.168.0.4: seq=0 ttl=64 time=1.040 ms 64 bytes from 192.168.0.4: seq=1 ttl=64 time=0.763 ms 64 bytes from 192.168.0.4: seq=2 ttl=64 time=0.854 ms 64 bytes from 192.168.0.4: seq=3 ttl=64 time=0.745 ms 64 bytes from 192.168.0.4: seq=4 ttl=64 time=0.846 ms 64 bytes from 192.168.0.4: seq=5 ttl=64 time=0.716 ms 64 bytes from 192.168.0.4: seq=6 ttl=64 time=0.889 ms ^C --- 192.168.0.4 ping statistics --- 7 packets transmitted, 7 packets received, 0% packet loss round-trip min/avg/max = 0.716/0.836/1.040 ms #trên worker root@ubuntu2:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb544eaf1490 busybox "/bin/sh" 2 minutes ago Up 2 minutes busybox2 root@ubuntu2:~# docker exec -it bb544eaf1490 ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3): 56 data bytes 64 bytes from 192.168.0.3: seq=0 ttl=64 time=0.754 ms 64 bytes from 192.168.0.3: seq=1 ttl=64 time=0.677 ms 64 bytes from 192.168.0.3: seq=2 ttl=64 time=0.873 ms ^C --- 192.168.0.3 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.677/0.768/0.873 ms root@ubuntu2:~#
Có thể thấy rằng các container trên hai máy chủ đã có thể ping nhau.
7. Kết luận
Như vậy chúng ta đã tìm hiểu qua khái niệm và thử nghiệm overlay network. Theo dõi blog để update thêm nhiều bài viết mới.
Nếu bạn có bất kì câu hỏi nào, vui lòng để lại bình luận.