Docker 网络详解


Docker 共有 4 种网络模式,分别是 none、host、bridge 和 自定义网络模式。Docker 提供了三种自定义网络驱动,分别为 bridge、overlay 和 macvlan,其中 overlay 和 macvlan 用于创建跨主机网络。

一、None

该网络模式,即没有网络的网络模式,可通过 --network=none 来指定。该网络模式的容器除了 lo 本地回环网卡外,无其他任何网卡,那该网络模式存在的意义是什么呢?

在一些安全级别要求高的场景下是需要的,如:用作密码服务器,就不需要任何的网络模式。

二、Bridge

1、容器虚拟网卡

如果在运行容器时,不指定任何网络模式,那创建的容器默认都会挂到 docker0 网卡上,如下图,这三个容器我都没通过 --network 指定网络模式。

在这里插入图片描述

【interfaces】字段下的内容就是运行的这三个容器对应的虚拟网卡。此时进入某个容器,去查看一下其网卡名,如下图所示:

在这里插入图片描述

你会发现该容器的网卡名与【interfaces】字段下的虚拟网卡名不一致,这是为什么呢?

其实这是因为容器的虚拟网卡与挂在 docker0 下的虚拟网卡是一对特殊的 veth pair 网络设备。

2、容器 IP 地址

通过上图我们可以看到,运行的容器自动分配了一个 IP 地址,那该 IP 地址是从哪获取的呢?我们可以查看一下 Bridge 的网络配置信息:

docker network inspect bridge

在这里插入图片描述

网段:172.17.0.0

网关:172.17.0.1

此时你会想,容器是如何与外界通信的(比如 yum install … 安装等),其实正是上面这个网关地址,这个网关地址就是 docker0 网卡地址,如下图:

在这里插入图片描述

通过上图你就会明白,运行的容器能连接外网安装一些基础工具,通过路由表可知其过程是:

  • 先访问目标IP(比如:221.237.105.143),发现没在自己的路由表中(既不是 10.150.16.0 也不是 172.17.0.0);
  • 于是就走 0.0.0.0,通过宿主机网关 10.150.16.1 与外界通信。

三、Host

相对 Bridge 网络模式来说,Host 网络模式更便于理解,可通过 --network=host 来指定,此时,容器的网络配置与宿主机(Host)完全一样。

docker run -it --network=host busybox

在这里插入图片描述

在这里插入图片描述

从上图可看出,容器和宿主机的网络保持一致,换句话说,容器共享宿主机网络,这有什么好处?

对于网络性能要求较高的场景可以使用 Host 网络模式。

但该网络模式也有一些缺点,就是要考虑到容器和宿主机端口冲突的问题。

四、自定义网络

除了以上三种网络模式,我们也可以自定义网络模式。

1、自定义 Bridge 类型网络模式

[root@qcloud ~]# docker network create --driver bridge net_a
8568822dd4bf8ab5e9a33635f2f5bdb6a4577652879c55e13390b43d950f99ec
[root@qcloud ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br-8568822dd4bf		8000.0242232f6190	no		
docker0		8000.02429fa58d80	no		veth4b12f0c
							veth5cfded2
							veth6e1ba81

查看具体属性:

[root@qcloud ~]# docker network inspect net_a 
[
    {
        "Name": "net_a",
        "Id": "8568822dd4bf8ab5e9a33635f2f5bdb6a4577652879c55e13390b43d950f99ec",
        "Created": "2022-05-12T19:13:11.197656976+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

可看到 Driver 驱动类型为 bridge 类型网络,同时 Docker 为其分配了 IP 段。

2、自定义 IP 段

[root@qcloud ~]# docker network create --driver bridge --subnet 192.168.4.0/24 --gateway 192.168.4.1 net_b

查看具体属性:

[root@qcloud ~]# docker network inspect net_b
[
    {
        "Name": "net_b",
        "Id": "bb8dfbced7b2b38b47dc603abc010ca30888192d035eace29268baa035ba10f4",
        "Created": "2022-05-12T19:21:57.617051707+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.4.0/24",
                    "Gateway": "192.168.4.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

3、运行容器并指定自定义网络

[root@qcloud ~]# docker run -it --network=net_b busybox
/ # ifconfig 
eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:04:02  
          inet addr:192.168.4.2  Bcast:192.168.4.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:766 (766.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

既然我可以自定义网络模式,那我可不可以运行容器时指定一个静态 IP?

答案是可以的,但前提是你这个网络必须是 --subnet 指定网段方式的自定义网络模式才行,具体如下:

  • 未使用 --subnet 指定网段的网络模式

    这种情况下是无法指定静态 IP 的,会报错。

    [root@qcloud ~]# docker run -it --network=net_a --ip 172.18.0.5 busybox
    docker: Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets.
    
  • 使用 --subnet 指定网段的网络模式

    这种情况下可以指定静态 IP。

    [root@qcloud ~]# docker run -it --network=net_b --ip 192.168.4.191 busybox
    / # ifconfig 
    eth0      Link encap:Ethernet  HWaddr 02:42:C0:A8:04:BF  
              inet addr:192.168.4.191  Bcast:192.168.4.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:7 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0 
              RX bytes:586 (586.0 B)  TX bytes:0 (0.0 B)
    
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    

<点击跳转至开头>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值