Dokcer四之Docker网络

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。

同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

docker的另外一种网络模式是“联盟式网络”,各个容器都是自己隔离的USER、Mount、PID。使用公共的UTS、Net、ICP

image.png

可以安装bridge-utils进行查看 

 #安装

 yum -y install bridge-utils

 #查看

 brctl show 

image.png

#查看上面的两个接口

ip link show

image.pngimage.png

网络命名空间netns

#添加虚拟网卡,veth1.1和veth1.2是成对的,添加之后默认是没有激活的,需要手动添加到某个网络命名空间中方可生效

ip link add name veth1.1 type veth peer name veth1.2

#查看添加的虚拟网卡

ip link  show

image.png

#添加网络命名空间

ip netns add r1

ip netns add r1

#查看

ip netns show

image.png

#把创建的虚拟网络移到指定的网络命名空间中去

#把veth1.2网卡移到r1网络命名空间去

ip link set dev veth1.2 netns r1

#把veth1.1网卡移动到r2网络命名空间中去

ip link set dev veth1.1 netns r2

#查看

ip netns exec r1 ifconfig -a

image.png

#把r1网络命名空间中的veth1.2虚拟网卡改名为eth0

ip netns exec r1 ip link set dev veth1.2 name eth0

#查看

ip netns exec r1 ifconfig -a

image.png

#将虚拟网卡veht1.1激活

ifconfig veth1.1 10.1.0.1/24 up

#查看

ifconfig

image.png

#把veth1.1移到r2网络命名空间中去

ip link set dev veth1.1 netns r2

#激活

ip netns exec r2 ifconfig veth1.1 10.1.0.3/24 up

 #检测是否通信

ip netns exec r2 ping 10.1.0.2

ip netns exec r1 ping 10.1.0.3

image.png

自定义docker网络docker0

image.pngimage.png

docker -H ip:port CMMOND 可以执行指定docker容器上的命令