网络模式

  • None
    • 把容器放入独立网络空间不做任何网络配置
    • 可以用docker network命令来完成网络配置
  • Host
    • 复用宿主机的网络空间
  • Container
    • 复用其他容器的网络
  • Bridge
    • 使用linux网桥和iptables提供容器互联。

      主机内通信

      None 模式

      docker在配置网络时做了什么?
      通过--network=none模式启动容器,并通过命令为容器配置网络 ```bash

创建容器(未创建网络)

root@aliyun:~# docker run —network=none -d nginx Unable to find image ‘nginx:latest’ locally latest: Pulling from library/nginx Digest: sha256:859ab6768a6f26a79bc42b231664111317d095a4f04e4b6fe79ce37b3d199097 Status: Downloaded newer image for nginx:latest b2069a801ebc277e3b0cefdea9c5196d3fd0df7cad3f1fafbf70abea7f63305a

查找进程PID

root@aliyun:~# docker inspect b2069a801eb | grep -wi pid “Pid”: 893295,

查看容器网络

root@aliyun:~# nsenter -t 893295 -n ip a 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever

root@aliyun:~# export PID=893295

?

root@aliyun:~# mkdir /var/run/netns

?

root@aliyun:~# ln -sv /proc/$PID/ns/net /var/run/netns/$PID ‘/var/run/netns/893295’ -> ‘/proc/893295/ns/net’

宿主机创建

ip link show 110: B@A: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 46:fd:ca:9b:4e:b7 brd ff:ff:ff:ff:ff:ff 111: A@B: mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether d2:b5:4c:fa:65:0a brd ff:ff:ff:ff:ff:ff

创建虚拟网络

root@aliyun:~# ip link add AAA type veth peer name BBB

将虚拟网络连接到docker0

root@aliyun:~# brctl addif docker0 AAA root@aliyun:~# ip link set AAA up

查看网桥连接

root@aliyun:~# brctl show bridge name bridge id STP enabled interfaces docker0 8000.0242879b1a30 no AAA

先检测地址有没有被占用

root@aliyun:~# IP=172.17.0.110 root@aliyun:~# MASK=16

docker0的地址

root@aliyun:~# GATEWAY=172.17.0.1

将BBB端放入容器的网络空间中

root@aliyun:~# ip link set BBB netns $PID

root@aliyun:~# ip netns exec $PID ip link set dev BBB name eth2 root@aliyun:~# ip netns exec $PID ip link set eth2 up root@aliyun:~# ip netns exec $PID ip addr add $IP/$MASK dev eth2 root@aliyun:~# ip netns exec $PID ip route add default via $GATEWAY

查看网络配置

ip netns exec $PID ip a ip netns exec $PID ip r

请求测试,返回nginx默认页面即正常

curl 172.17.0.110

  1. <a name="cyDrv"></a>
  2. ## bridge 默认模式
  3. 在主机启动容器会默认配置bridge模式网络
  4. ```bash
  5. docker run -d -p 8080:80 nginx

docker以标准模式配置网络

  • 创建veth pair
  • 将veth pair一端连接到docker0网桥
  • 将eth0 pair另一端设置为命名空间的eth0
  • 为eth0分配ip
  • 宿主机创建iptables规则 POSTROUTING -A DOCKER ! -i docker0 -p tcp -m tcp —dport 2233 -j DNAT —to-destnation 172.17.0.110:22

image.png

同台主机上的默认方式启动的容器都连接到docker0网桥上,所以同台主机上的docker是互通的

跨主机通信

underlay

image.png

  • 采用linux网桥设备,通过物理网络连接容器
  • 创建新的网桥设备mydr0
  • 将主机网卡加入网桥mydr0
  • 将主机网卡地址配置到网桥,并把默认路由规则转移到网桥
  • 创建veth,把一端添加到网桥mydr0,另一端连接到容器网卡

优缺点

  • 方案简单
  • 需要规划网络IP,否则会浪费IP

Overlay

libnetwork是内置的基于vxlan的网络驱动
通过VTEP设备封包解包完成跨主机网络通信,看起来就像是直接通信
image.png

Overlay网络插件—flannel

  • 同一主机的POD可以使用网桥进行通信
  • 不同主机流量通过flanneld封装在DUP数据包中进行通信

image.png