Docker的网络配置 1 初识(桥接模式) docker0

相关文章:

《Linux 虚拟网络设备 veth-pair》 linux基础
《Linux虚拟网络设备之veth(arp incomplete)》

Docker网络(veth、网桥、host、container、none) docker上网络概述

Docker的网络配置 1 初识 docker 精讲
Docker的网络配置 2 配置 DNS和主机名
Docker的网络配置 3 user-defined网络
Docker的网络配置 4 内嵌的DNS server
Docker的网络配置 5 将容器与外部世界连接
Docker的网络配置 6 docker-proxy

【云原生】网络之桥接(网卡对) openshift下的网络桥接模式

docker网络模式

docker安装后会自动创建3种网络:bridgehostnone
查看docker的网络有哪些:

# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
eddae4cf1bad        docker0              bridge              local
34b7574b98c2        host                host                local
00f4601cd1c0        none                null                local

drive表示参数类型,然后 类型 为bridge的,对应Name是docker0的,就是我们想要的

Docker在启动时会开启一个虚拟网桥设备(Linux bridge) docker0,随机分配一个本地未占用的私有号段(记住,正式这个私有号段,导致主机外的应用都无法识别)。默认的地址为172.17.0.1/16,如果不指定--network,容器启动后都会被桥接到docker0上,并自动分配到一个ip地址,然后逐渐递增。

我们来查看docker0:

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:16:3e:03:7b:9d brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe03:7b9d/64 scope link
       valid_lft forever preferred_lft forever

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:aa:f3:94:c9 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:aaff:fef3:94c9/64 scope link
       valid_lft forever preferred_lft forever

看第三条 docker0,并且 inet 172.17.0.1/16

bridge网络

在这里插入图片描述
默认连接docker0这个网桥(brctl命令在centos中可以使用,yum install bridge-utils来安装)。

[root@EMS3 ~]# brctl show docker0
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242aaf394c9       no              

启动并且运行一个容器:

[root@EMS3 ~]# docker run --name kubia-container -p 8081:8081 -d docker.artnj.test.com.cn/cci/kubia:v3
1b722efa3e8fbf2dabb74a482788f427a1fa4a44181b502c6dce5b66306f795d
[root@EMS3 ~]# docker ps|grep kubia
1b722efa3e8f        docker.artnj.test.com.cn/cci/kubia:v3                         "node app.js"             31 seconds ago      Up 29 seconds                0.0.0.0:8081->8081/tcp                                                   kubia-container
[root@EMS3 ~]# docker exec -it 1b722efa3e8f sh
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
398: eth0@if399: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:11:00:0a brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.10/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:a/64 scope link
       valid_lft forever preferred_lft forever

在容器内查看ip addr ,我们可以看到容器已经获取了一个地址为:172.17.0.10/16的地址。它和主机的docker0的接口地址是在同一个网络,并且将主机docker0的接口地址设置成为了网关(可以使用route -n来查看)。容器内有一个网卡eth0@if399

返回物理主机上查看网桥docker0,这时候我么可以看到已经多了一个接口veth6f3287d。可以使用:brctl show docker0来查看:

[root@EMS3 ~]# brctl show docker0
bridge name     bridge id               STP enabled     interfaces
docker0         8000.0242aaf394c9       no              veth6f3287d

Bridge 桥接模式的实现步骤主要如下:

  • Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备。veth pair 是一种成对出现的特殊的网络设备,可以把他们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if399)在容器中,另一头(veth6f3287d)挂在网桥docker0上,无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。

  • Docker Daemon 将 veth6f3287d 附加到 Docker Daemon 创建的 docker0
    网桥上。保证宿主机的网络报文可以发往 veth0;

  • Docker Daemon 将 veth6f3287d 添加到 Docker Container 所属的namespace下,并被改名为
    eth0@if399。如此一来,保证宿主机的网络报文若发往 veth6f3287d,则立即会被 eth0@if399接收,实现宿主机到Docker Container网络的联通性;同时,也保证 Docker Container 单独使用 eth0@if399,实现容器网络环境的隔离性

我们看一下bridge网络的配置信息

```bash
# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "d6179376f0c4dc0af7090be5d751ce53af44122b743a975fe193f216705c2e54",
        "Created": "2024-04-07T09:11:11.431449886+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": true,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                },
                {
                    "Subnet": "2022:711::/112",
                    "Gateway": "2022:711::1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "1dff3550d16f3b633c2f1385b25d0cd835ea47753d0cfcc0de2932c4130a4723": {
                "Name": "kubia-container5",   //Containers列表 是你启动在当前网桥下的docker 
                "EndpointID": "08b3f84ac1b631babc59236e416a94d383178fbcf5d5e7e2a22a88d6a0de377d",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": "2022:711::2/112"
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

原来的bridg网络配置的·subnet·就是172.17.0.0/16,并且网关是172.17.0.1,这个网关就是docker0

Bridge桥接模式的缺陷:

1.最明显的是,该模式下 Docker Container 不具有一个公有 IP(前文讲过,是私有的号段),即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信,而必须要经过NAT的转换.

假设存在物理机A、B,在A上有容器c1,那么A可以直接和c1通信;而B无法与c1直接通信(可以通过NAT的转换后间接通信)。

2.虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。

3.另外 NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

参考

云原生之docker网络详解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值