跨主機間的 Docker overlay network (使用 swarm)

若要使不同主機間的 Docker 中的 container 能互相溝通 (讓他們在同個網路底下) 有幾種方式,今天介紹一個最簡單的方式。

透過 Docker Swarm

隨著現在 Docker Swarm 越來越發達與普及,很多人是直接透過 Swarm 來做 container orchestration 的工具,做為跨主機的 container 群集。只要我們將各 Docker node 加入 Swarm 群集後,在 Swarm manager 角色的主機建立 overlay 網路,再以 docker service 指令集來建立服務,這些服務的容器間即可相互溝通。

建立 overlay 網路:

1
docker network create -d overlay --scope swarm my-network

透過 Docker swarm 在各 Docker node 部署同一 image 測試:

1
2
docker service create --name test-service --network my-network bash sleep 180
docker service scale test-service=2

各自從 container 取得 ip:

1
2
3
4
5
6
7
8
9
10
11
12
13
# sx01
docker exec -it `docker ps | grep test-service | cut -d\ -f1` ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:00:38
inet addr:10.0.0.56 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
...

# sx02
docker exec -it `docker ps | grep test-service | cut -d\ -f1` ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:00:41
inet addr:10.0.0.52 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
...

各自 container 可互相 ping 到對方:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# sx01
docker exec -it `docker ps | grep test-service | cut -d\ -f1` ping 10.0.0.52
PING 10.0.0.52 (10.0.0.52): 56 data bytes
64 bytes from 10.0.0.52: seq=0 ttl=64 time=0.351 ms
64 bytes from 10.0.0.52: seq=1 ttl=64 time=0.367 ms
64 bytes from 10.0.0.52: seq=2 ttl=64 time=0.258 ms
64 bytes from 10.0.0.52: seq=3 ttl=64 time=0.304 ms

# sx02
docker exec -it `docker ps | grep test-service | cut -d\ -f1` ping 10.0.0.56
PING 10.0.0.56 (10.0.0.56): 56 data bytes
64 bytes from 10.0.0.56: seq=0 ttl=64 time=0.338 ms
64 bytes from 10.0.0.56: seq=1 ttl=64 time=0.325 ms
64 bytes from 10.0.0.56: seq=2 ttl=64 time=0.306 ms
64 bytes from 10.0.0.56: seq=3 ttl=64 time=0.212 ms

收工!