使用Docker Swarm實現跨宿主機容器間訪問
背景:
在SerA服務器,運行了一個任務調度系統xxl容器ConA。
在SerB服務器,運行了一個SpringBoot服務ConB,註冊到任務調度系統中。
在任務調度系統中,看到的調度器節點IP是SerB服務器分配給ConB容器的IP地址。 導致任務調度系統調度失敗,提示ConB地址鏈接不上。
分析下來,是由於ConA和ConB是跨宿主機的容器,無法通信。
網上看到了很多方案,包括Overlay網絡、OpenvSwitch、consul方案等,最終使用Docker Swarm解決了,發現很簡單,過程如下。
1. 初始化swarm
在主節點運行docker swarm init
,初始化swarm。
docker swarm init
# Swarm initialized: current node (0r4xjgtu4nd9txrsbfn1lo5gu) is now a manager.
#
# To add a worker to this swarm, run the following command:
#
# docker swarm join \
# --token SWMTKN-1-0q35cj5j0va82a0t3mhkbesirqb6lqgqlkmznbwx1ojbou4u75-ejrors77ezcw25nmy9g90u9a0 \
# 172.16.0.226:2377
#
# To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2. 創建Overlay網絡
在主節點,創建overlay模式網絡。
docker network create --driver=overlay --gateway 192.168.1.1 --subnet 192.168.1.0/24 --attachable my_network
# m3k69pn88gtre361upi
可以通過docker network ls
命令,查看網絡列表。
docker network ls
# NETWORK ID NAME DRIVER SCOPE
# acaeb6e14a1e bridge bridge local
# a8e5fdd055b9 docker_gwbridge bridge local
# b50eb414bcb4 host host local
# om6lst4j52go ingress overlay swarm
# m3k69pn88gtr my_network overlay swarm
# 0c76adacfcfc none null local
3. 子節點加入集羣
複製上面初始化swarm命令結果中的語句,在子節點運行即可。
docker swarm join \
--token SWMTKN-1-va82a0t3mhkbesirqb6lqgqlkmznbwxu4u75-ejrors790u9a0 \
172.16.0.226:2377
# This node joined a swarm as a worker.
可以在主節點,通過docker node ls
命令,查看節點列表。
docker node ls
# ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
# 0r4xjgtu4nd9tsbfn1lo5gu * ecs-01 Ready Active Leader
# s67afk1e9nx0174yeqff6g2 ecs.h02 Ready Active
4. 運行容器加入網絡
在容器運行命令中,加入--network my_network --ip 192.168.1.123
即可。
docker run -it -d --network my_network --ip 192.168.1.123 ubuntu