docker 网络
程序员文章站
2022-04-19 11:25:36
...
概念介绍
1、linux veth
成对出现的虚拟设备,发送到veth一端的请求,会从另一端发出。删除一端,另一端也自动删除
# 添加两个namespace
vito@caas:~$ sudo ip netns add ns1
vito@caas:~$ sudo ip netns add ns2
# 创建一个veth设备对
vito@caas:~$ sudo ip link add veth0 type veth peer name veth1
# 把veth对的一端放到namespace中
vito@caas:~$ sudo ip link set veth0 netns ns1
vito@caas:~$ sudo ip link set veth1 netns ns2
# 查看某个namespace中的网络设备信息
vito@caas:~$ sudo ip netns exec ns1 ip link
# 删除某个namespace中的某个网络设备
vito@caas:~$ sudo ip netns exec ns1 ip link delete veth0
2、linux bridge
bridge虚拟设备用来桥接的网络设备,相当于现实世界的交换机,可以链接不同的网络设备。
# 创建一个veth设备对
vito@caas:~$ sudo ip link add veth0 type veth peer name veth1
# 把veth对的一端veth1放到namespace ns1中
vito@caas:~$ sudo ip link set veth1 netns ns1
# 创建网桥
vito@caas:~$ sudo brctl addbr br0
# 挂载网络设备
vito@caas:~$ sudo brctl addif br0 veth0
vito@caas:~$ sudo brctl addif br0 eth0
3、linux 路由表
路由表是linux内核的一个模块,通过定义路由表来决定在某个网络namespace中包的流向,从而定义请求会到那个网络设备上。 linux的网络命名空间内可以有自己独立的路由表和独立的IPtables/Netfilter设置,来供包的转发,NAT及IP包过滤。
# 启动网络设备
vito@caas:~$ sudo ip link set veth0 up
vito@caas:~$ sudo ip link set br0 up
# 设置veth1 在namespace ns1 中的ip,并启动设备
vito@caas:~$ sudo ip setns exec ns1 ifconfig veth1 172.18.0.2/24 up
# 测试ping 本机,不通
vito@caas:~$ sudo ip netns exec ns1 ping -c 1 192.168.1.28
connect: Network is unreachable
# 设置ns1和宿主机的路由
vito@caas:~$ sudo ip netns exec ns1 route add default dev veth1
# 在宿主机上将172.18.0.2/24网段请求路由到br0
vito@caas:~$ sudo route add -net 172.18.0.0/24 dev br0
# 测试从namaspace ns1 ping 宿主机地址,可以ping通
vito@caas:~$ sudo ip netns exec ns1 ping -c 1 192.168.1.28
PING 192.168.1.28 (192.168.1.28) 56(84) bytes of data.
64 bytes from 192.168.1.28: icmp_seq=1 ttl=64 time=0.061 ms
--- 192.168.1.28 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.061/0.061/0.061/0.000 ms
# 测试从宿主机 ping namaspace ns1中的veth1地址,可以ping通
vito@caas:~$ ping -c 1 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.109 ms
--- 172.18.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.109/0.109/0.109/0.000 ms
# 测试从namaspace ns1 ping 百度地址,不能ping通,后面尝试在iptables中增加MASQUERADE设置以后再尝试
vito@caas:~$ sudo ip netns exec ns1 ping -c 1 www.baidu.com
ping: unknown host www.baidu.com
4、linux iptables
MASQUERADE:
将请求包中的源地址转换成一个网络设备地址。
DNAT
经常用于把内部网络地址的端口映射到外部去。
二、docker 网络
1、docker 创建网络流程
- 创建网络
- 获取IP段和gatewayIR
- 返回网络段配置
- 创建网络
- 配置网络设备
- 返回配置好的网络信息
- 创建完成
2、创建容器并链接到网络流程
- 创建容器
- 获取容器 IP (IPAM)
- 返回IP
- 创建网络端点 endpoint
- 配置链接网络端点
- 配置完成
- 配置端口映射
- 创建完成
3、容器网络地址分配
bitmap算法分配IP地址