欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

docker 网络
MASQUERADE:
将请求包中的源地址转换成一个网络设备地址。

DNAT
经常用于把内部网络地址的端口映射到外部去。

二、docker 网络

1、docker 创建网络流程

  1. 创建网络
  2. 获取IP段和gatewayIR
  3. 返回网络段配置
  4. 创建网络
  5. 配置网络设备
  6. 返回配置好的网络信息
  7. 创建完成

2、创建容器并链接到网络流程

  1. 创建容器
  2. 获取容器 IP (IPAM)
  3. 返回IP
  4. 创建网络端点 endpoint
  5. 配置链接网络端点
  6. 配置完成
  7. 配置端口映射
  8. 创建完成

3、容器网络地址分配

bitmap算法分配IP地址

4、bridge网络

相关标签: docker