容器間通信的底層原理
一、如何讓一個centos容器一直運行
- 拉取一個centos的鏡像
- 創建兩個centos的容器,分別命名爲centos_1、centos_2
使用 -dit 參數後該容器會一直保持運行
docker run -dit --name=centos_1 centos:latest
docker run -dit --name=centos_1 centos:latest
- 使用docker attach可進入容器
docker attach [容器name]
- 退出容器
如果退出時不想讓這個容器繼續運行了,則直接輸入exit即可。
如果退出時還想讓這個容器繼續運行,則【ctrl+p】後【ctrl+q】
二、查看網絡命名空間(network namespace)
- 進入centos_1容器,使用 ip a 命令查看這個容器的網絡命名空間:
- 可以對比下,它的信息與本機、centos_2容器,都不同。
- 說明docker給每個容器都分配了自己的網絡命名空間
- 容器centos_1和容器centos_2是可以互相通信的
三、Linux下手動創建一個網絡命名空間
(1) 新建
通過以下命令,新建一個網絡命名空間:
ip netns add [網絡命名空間名稱]
(2) 查看
通過以下命令,查看本機手動創建的網絡命名空間
ip netns list
(3) 查看網絡命名空間的詳細信息
通過以下命令,查看指定的網絡命名空間的信息(IP等等)
ip netns exec [網絡命名空間名稱] ip a
發現只有一個接口,這個也叫本地迴環口,沒有IP地址。
(4) 查看網絡命名空間的網絡接口
通過以下命令,查看指定的網絡命名空間的網絡接口信息
ip netns exec [網絡命名空間名稱] ip link
(5) 啓用lo網絡接口
通過以下命令,將本地迴環口的狀態啓用
ip netns exec [網絡命名空間名稱] ip link set dev lo up
發現這個網絡命名空間的本地迴環口的狀態變爲了UNKNOWM,這是因爲一個網絡接口的開啓需要兩端都通。
四、使用一對veth使兩個網絡命名空間相通
(1) 在本機創建兩個網絡命名空間
之前創建了net_space_1,再創建一個net_space_2:
(2) Veth
上面我們創建的兩個網絡命名空間並不能互相通信,使用一對Veth可以把兩個網絡命名空間連接起來。
(3) 添加一對veth
- 執行命令添加一對veth
ip link add veth-test1 type veth peer name veth-test2
這樣我們就添加了一對veth,名字是veth-test1、veth-test2
- 執行命令查看veth
ip link
(4) 將一對veth的兩個端口分別添加到兩個網絡命名空間中
- 將veth-test1添加到net_space_1中:
ip link set veth-test1 netns net_space_1
- 查看網絡命名空間1的信息
ip netns exec net_space_1 ip link
- 再看一下本機的連接信息
會發現我們之前創建的一對veth,只剩下一個了,因爲veth-test1@veth-test2這個端已經被添加到網絡命名空間net_space_1中了 - 同上,將veth-test2添加到net_space_2中
ip link set veth-test2 netns net_space_2
ip netns exec net_space_2 ip link
(5) 給一對veth的兩個端口分配IP地址
- 給兩個端口設置IP地址
ip netns exec net_space_1 ip addr add 192.168.1.1/24 dev veth-test1
ip netns exec net_space_2 ip addr add 192.168.1.2/24 dev veth-test2
- 啓用兩個端口
ip netns exec net_space_2 ip link set dev veth-test2 up
ip netns exec net_space_2 ip link set dev veth-test2 up
- 查看兩個網絡命名空間的詳細IP信息
ip netns exec net_space_1 ip a
(6) 測試兩個網絡命名空間是否相通
五、容器間相互通信的原理
使用本機創建兩個容器,本機會爲每個容器分配一個網絡命名空間,然後這兩個容器能互相通信,即是兩個網絡命名空間能夠互相通信,原理與上面基本一致。