docker 指定网卡_深入浅出容器学习--Docker网络 - yuhaohao

一.Docker的网络概念

容器网络模型主要包含了三个概念:

  • network:网络,这里可以理解为一个Driver,是一个第三方网络栈,包含多种网络模式。

    • 单主机网络模式(none、host、bridge)
    • 多主机网络模式(overlay、macvlan、flannel)
  • sandbox:沙盒,它定义了容器内的虚拟网卡、DNS和路由表,是network namespace的一种实现,是容器的内部网络栈。

  • endpoint:端点,用于连接sandbox和network。48daa7dd8eda447e529909825de9204f.png
    这里,我们可以类比传统网络模型,将network比作交换机,sandbox比作网卡,endpoint比作接口和网线。

二.Docker的网络模式

这里网络模式包含:

  • host模式
  • none模式
  • bridge模式
  • container模式

2.1 host模式

这个相当于Vmvare中的桥接模式,与宿主机在同一个网络中,但是没有独立的IP地址。
Docker不会为容器创建独有的network namespace,使用宿主机默认的网络命名空间,共享一个网络栈。表现为容器内核宿主机的IP一致。这种模式适用于网络性能要求较高的场景,但网络隔离性不太好。e3ce6517e58622b40baa6897781b9bdd.png

2.2 bridge模式

桥接模式,这里相当于Vmvare中的Nat模式。
Docker进程启动时会创建一个docker0网桥,docker会为容器创建独有的network namespace,也会为这个命名空间配置好虚拟网卡、路由、DNS、IP地址与iptables规则(也就是sanbox内容)8444d2308d8d86819df8ad03fbddab03.png

2.2.1 Docker完成Bridge网络配置详细说明

1.在主机上创建一堆虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth45h6这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show查看。

[root@harbor ~]# brctl show 
bridge name	        bridge id		STP enabled	interfaces
br-2ba1d6a2e994		8000.02426cb4a81a	no		veth6a79ace
br-8d4b6181687f		8000.0242d8d0780d	no		
docker0		        8000.02424dbb4b07	no

3.从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

[root@harbor ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
4b59058aece1        docker-nexus3:v1    "sh -c ${SONATYPE_DI…"   2 months ago        Up 2 months         0.0.0.0:81->8081/tcp   nexus3
[root@harbor ~]# docker inspect 4b59058aece1
.......
            "Networks": {
                "nexus_default": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "4b59058aece1",
                        "docker_nexus3"
                    ],
                    "NetworkID": "2ba1d6a2e994bb68c9a9ec000867db8fb14e20c6abcaa95f9399b0d9a270b960",
                    "EndpointID": "e191fe5833aff25bbc6f71c215a717c5fa6c9f2b62690d94806768a302272129",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
# 查看nexus_default的bridge network 
[root@harbor_reg ~]# docker network inspect nexus_default
[
    {
        "Name": "nexus_default",
        "Id": "2ba1d6a2e994bb68c9a9ec000867db8fb14e20c6abcaa95f9399b0d9a270b960",
        "Created": "2020-08-24T10:20:",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "",
                    "Gateway": ""
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "4b59058aece184806ecc8d7d2c7c9dd93b24d7d120ea782d5c6909819725fe2d": {
                "Name": "nexus3",
                "EndpointID": "e191fe5833aff25bbc6f71c215a717c5fa6c9f2b62690d94806768a302272129",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "": "default",
            "": "nexus",
            "": ""
        }
    }
]

2.3 none模式

none模式可以说是桥接模式的一种特例,docker会为容器创建独有的network namespace ,但不会为这个命名空间准备虚拟网卡,IP地址,路由等,需要用户自己配置。这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。9eb41dfdbb5613b698cf55da5d41e59e.png

2.4 container模式

容器共享模式,这种模式是host模式的一种延伸,一组容器共享一个network namespace。对外表现为它们有共同的IP地址,共享一个网络栈。5eca56cbd32bc50ad2a48c23540a4d3c.png

三.Docker跨主机网络通讯

默认情况下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。这种端口映射方式对许多集群应用来说非常不方便,如果可以让Docker容器直接使用自己的IP地址进行通信可以解决很多问题。这里按照实现原理可以分为:

  • 直接路由模式
  • overlay隧道模式(如flannel、ovs+gre)
  • 桥接模式(如pipework)

直接路由

直接在两侧主机增加静态路由来实现:

ip route add 172.16.1.0/24 via 192.168.20.1
ip route add 172.16.2.0/24 via 192.168.20.2

注意:centos系统需要卡其ip转发

vim /etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

这里测试两台主机的容器跨主机通信可以参考此博文,相当详细:https://www.cnblogs.com/xiao987334176/p/10049844.html

3.2 overlay隧道模式

这里以flannel(flannel+udp或flannel+vxlan)来说明
flannel实现的容器的跨主机通信过程如下过程实现:

桥接模式

这里可以通过静态指定容器的IP为宿主机同一个网络的形式来实现。这里不做具体说明,可以参考其它博文实现:

参考文档连接:
https://www.jianshu.com/p/22a7032bb7bd
https://zhuanlan.zhihu.com/p/82735394

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值