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ủIPLưu ý
ubfox1192.168.11,21master
ubfox2192.168.11.22worker

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.

4.3 3 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments