Docker不同宿主機網路打通

兰嘉轩發表於2024-08-19

本方式使用docker Swarm叢集的方式建立overlay 網路進行打通

背景

因java微服務使用nacos做配置中心,為了解決Nacos服務註冊使用Docker容器內網ip問題,使用此方案

前置條件

1、宿主機之間需要開通埠

管理埠:

2377/tcp: 用於管理 Swarm 模式叢集。這是 Swarm Manager 和 Worker 節點之間進行通訊的主要埠,用於叢集管理和任務排程。

節點間通訊埠:

2375/tcp: 用於 Docker API 的通訊。在 Swarm 模式下,這個埠通常只在 Manager 節點上開啟,供外部客戶端訪問。
2376/tcp: 與 2375 類似,但使用了 TLS 加密。如果啟用了 TLS,那麼 2376 埠將被用於安全的 Docker API 訪問。

網路埠:

4789/udp: 用於 VXLAN 通訊,當使用 overlay 網路驅動時會用到此埠。這是 Swarm 用於跨節點容器通訊的主要埠之一。
7946/tcp and/or 7946/udp: 用於節點間的服務發現和心跳訊息。這兩個埠用於 Raft 協議中的通訊,以便維護叢集狀態的一致性。

2、docker版本

Swarm 在 Docker 1.12 版本之前屬於一個獨立的專案,在 Docker 1.12 版本釋出之後,該專案合併到了 Docker 中,成為 Docker 的一個子命令。目前,Swarm 是 Docker 社群提供的唯一一個原生支援 Docker 叢集管理的工具。它可以把多個 Docker 主機組成的系統轉換為單一的虛擬 Docker 主機,使得容器可以組成跨主機的子網網路。因此,docker版本必須大於1.12,以下我使用的docker版本為 27.1.1

安裝docker

因為docker源被遮蔽以後,安裝docker需要從阿里源進行安裝,如果需要詳細安裝過程,請參考文件:https://www.cnblogs.com/lanheader/p/14260710.html

前期只需要替換源即可,這裡不做過多的描述,系統我使用的是ubuntu 22

# 安裝GPG證書
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 安裝源
sudo sh -c 'echo "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list'
# 驗證是否成功安裝了docker
sudo systemctl status docker
docker --version

安裝Swarm叢集

master執行

docker swarm init --advertise-addr=192.168.0.1 # 注意替換這裡的IP,IP為master的ip
Swarm initialized: current node (maw28ll7mlxuwp47z5c5vo2v1) is now a manager.
To add a worker to this swarm, run the following command:
 
docker swarm join --token xxxxxxxxxxxxxxxxxxxxxxxxxxxxx 192.168.0.1:2377  # 注意儲存此行命令
 
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

work節點執行

這個是加入節點的命令,刪除節點使用 docker swarm leave

docker swarm join --token xxxxxxxxxxxxxxxxxxxxxxxxxxxxx 192.168.0.1:2377

在 manager 節點,檢視當前網路叢集的節點情況

root@ubuntu22:~# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
7r4vvml8kd2jem850rqfl158h *   ubuntu22   Ready     Active         Leader           27.1.1
lrvsq6quwaxleqejf0w1nawvu     ubuntu22   Ready     Active                          27.1.1
u4v4os8zats4ro795a4l6lw3y     ubuntu22   Ready     Active                          27.1.1
root@ubuntu22:~# 

在 manager 節點,建立 overlay 網路

注意,這裡強調使用--attachable引數,否則docker-compose不能使用此網路

docker network create -d overlay  --attachable test

在 master 節點的檢視是否建立成功

正常情況下,如果網路未啟用,則節點不會有test網路,需要執行後才會出現網路

root@ubuntu22:~# docker network ls
NETWORK ID     NAME                   DRIVER    SCOPE
28d3903acdb2   bridge                 bridge    local
c2147e916c72   docker_gwbridge        bridge    local
7jczo6vw7mig   test                   overlay   swarm
63fa0e285c02   host                   host      local
ypqnzuafqukz   ingress                overlay   swarm
b0e97299b587   none                   null      local

啟用網路,使節點存在overlay網路

建立一個映象

busybox 映象可能拉取不到,各位大佬自行想辦法解決...,再次感謝 方老師~

FROM busybox
MAINTAINER  lanheader@163.com
ENTRYPOINT  ["tail","-f","/etc/hosts"]

打包映象

docker build -t busybox-swarm . swarm 

啟用overlay 網路

docker service create --replicas 3 --name  busybox-net  --network  test busybox-swarm 

檢視服務

root@ubuntu22:~# docker service  ls
ID             NAME          MODE         REPLICAS   IMAGE                  PORTS
iicn2h7rw3af   busybox-net   replicated   3/3        busybox-swarm:latest   

檢視節點容器工作狀態

# 檢視節點
root@ubuntu22:~# docker  service  ps busybox-net
ID             NAME                IMAGE                  NODE       DESIRED STATE   CURRENT STATE               ERROR                         PORTS
s9reawp6seu5   busybox-net.1       busybox-swarm:latest   ubuntu22   Running         Running 41 minutes ago                                    
iw3fvcy3tu14   busybox-net.2       busybox-swarm:latest   ubuntu22   Running         Running about an hour ago                                 
vn16j18a2jzd   busybox-net.3       busybox-swarm:latest   ubuntu22   Running         Running about an hour ago           

測試

使用docker inspect xxx 檢視容器IP地址

在docker exec -it xxx sh 進入容器進行測試

Docker-compose 配置檔案中新增網路

容器中執行使用test網路即可

networks:
  test:
    external: true

完畢!!!

相關文章