一、詳解Docker容器的通信
默認情況下,啟動docker時會采用bridge的網絡鏈接方式,查看方式
sudo docker inspect CONTAINER
且網橋為docker0,docker0為啟動docker服務時會自動創建的一個虛擬網卡
docker容器之間的通信 就是通過網橋鏈接方式進行的
具體的通信方式為:
當我們啟動一個docker容器時,docker會自動生成一對網卡,一半放在docker容器內,一半放在docker0上,容器之間的通信 就是通過docker0來進行轉發
docker還有其他的三種網絡模式,分別為host,container(不同容器公用網絡名稱空間,IPC,UTS),null,默認為bridge
sudo docker network ls 查看網絡
sudo yum install bridge-utils -y
查看網橋的具體信息
brctl show
可以看到docker0 上鏈接了4個虛擬網卡
查看主機網絡名稱空間中的網卡設備
Ip link show
可以看到每一個網卡都有@標志,其實就是鏈接到docker的另一半網卡
查看docker中的網橋設備
Docker network inspect bridge
docker中的網橋也是docker0
具體查看容器的信息
sudo docker container inspect web1
二、采用netns來模擬實現docker之間的通信
可以看到docker是通過網絡名稱空間來進行網絡隔離,不同的網絡名稱通過一對網卡進行通信,它們是如何生成對一對網卡并且進行通信的呢?下面一起來做這個操作
首先下載ip包
查看下網絡名稱的幫助信息
ip netns
Usage: ip netns list
ip netns add NAME
ip netns set NAME NETNSID
ip [-all] netns delete [NAME]
ip netns identify [PID]
ip netns pids NAME
ip [-all] netns exec [NAME] cmd …
ip netns monitor
ip netns list-id
1.我們最開始添加兩個網絡名稱空間用來模擬網絡隔離
Ip netns add r1
Ip netns add r2
2..增加一對網卡
ip link add name veth1.1 type veth peer name veth1.2
默認不會激活該對網卡
可以通過ifconfig查看網卡是否被激活
2.將該對網卡的一端移動到網絡名稱空間r1中
ip link set dev veth1.2 netns r1
查看網絡名稱空間r1中的網卡信息
[root@localhost ~]# ip netns exec r1 ifconfig -a
ip [-all] netns exec [NAME] cmd …
可以修改網絡名稱r1中的網卡名稱
[root@localhost ~]# ip netns exec r1 ip link set dev veth1.2 name eth0
[root@localhost ~]# ip netns exec r1 ifconfig -a
3.給veth1.1分配IP地址 并啟動
[root@localhost ~]# ifconfig veth1.1 10.1.0.1/24 up
4.給r1網絡名稱空間中的eth0 添加ip 并激活
ip netns exec r1 ifconfig eth0 10.1.0.2/24 up
5.將veth1.1網卡 移至網絡名稱空間r2
[root@localhost ~]# ip link set dev veth1.1 netns r2
6.激活veth1.1
[root@localhost ~]# ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up
7.在r2中ping r1 中的eth0網卡
最后成功模擬了不同網絡名稱之間的通信,docker正式采用這種了網絡名稱隔離的方式進行網絡隔離