Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信

 

一、详解Docker容器的通信

默认情况下,启动docker时会采用bridge的网络链接方式,且网桥为docker0,docker0是启动docker服务时会自动创建的一个虚拟网卡,查看方式:

sudo docker inspect CONTAINER

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第1张图片

 

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第2张图片

docker容器之间的通信 就是通过网桥链接方式进行的

具体的通信方式为:

当我们启动一个docker容器时,docker会自动生成一对网卡,一半放在docker容器内,一半放在docker0上,容器之间的通信 就是通过docker0来进行转发

docker还有其他的三种网络模式,分别为host,container(不同容器公用网络名称空间,IPC,UTS),null,默认为bridge

 sudo docker network ls 查看网络

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第3张图片

 

sudo yum install bridge-utils -y

查看网桥的具体信息

brctl show

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第4张图片

 

可以看到docker0 上链接了4个虚拟网卡

查看主机网络名称空间中的网卡设备

Ip link show

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第5张图片

 

可以看到每一个网卡都有@标志,其实就是链接到docker的另一半网卡

查看docker中的网桥设备

Docker network inspect bridge

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第6张图片

 

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

默认不会激活该对网卡

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第7张图片

 

 

 可以通过ifconfig查看网卡是否被激活

2.将该对网卡的一端移动到网络名称空间r1中

ip link set dev veth1.2 netns r1

查看网络名称空间r1中的网卡信息

[root@localhost ~]# ip netns exec r1 ifconfig -a

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第8张图片

 

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

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第9张图片

 

3.给veth1.1分配IP地址 并启动

[root@localhost ~]# ifconfig veth1.1 10.1.0.1/24 up

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第10张图片

 

4.给r1网络名称空间中的eth0 添加ip 并激活

ip netns exec r1 ifconfig eth0 10.1.0.2/24 up

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第11张图片

5.将veth1.1网卡 移至网络名称空间r2

[root@localhost ~]# ip link set dev veth1.1 netns r2

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第12张图片

 

6.激活veth1.1

[root@localhost ~]# ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第13张图片

 

7.在r2中ping r1 中的eth0网卡

Dokcer网络通信详解,及如何利用网络名称空间模拟docker通信_第14张图片

 

最后成功模拟了不同网络名称之间的通信,docker正是采用这种了网络名称隔离的方式进行网络隔离

你可能感兴趣的:(linux)