一、详解Docker容器的通信
默认情况下,启动docker时会采用bridge的网络链接方式,且网桥为docker0,docker0是启动docker服务时会自动创建的一个虚拟网卡,查看方式:
sudo docker inspect CONTAINER
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正是采用这种了网络名称隔离的方式进行网络隔离