Docker“主机”和“无”网络有啥用?

Posted

技术标签:

【中文标题】Docker“主机”和“无”网络有啥用?【英文标题】:What is the use of Docker 'host' and 'none' Networks?Docker“主机”和“无”网络有什么用? 【发布时间】:2017-04-26 06:49:41 【问题描述】:

试图了解 Docker 网络。 Docker 会自动创建以下网络:

# docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE
67b4afa88032        bridge              bridge              local               
c88f997a2fa7        host                host                local               
1df2947aad7b        none                null                local               

我了解到 bridge 网络代表所有 Docker 安装中存在的 docker0 网络,来自link.

有人可以帮助我了解其他网络,hostnone,如果可能的话,提供示例?

【问题讨论】:

阅读this 我也引用了相同的链接,但我正在寻找一些示例以便更好地理解。 【参考方案1】:

Docker 默认支持 3 个网络

1) 无

此模式不会为容器配置任何 IP,并且无法访问外部网络以及其他容器。它确实有环回地址,可用于运行批处理作业。

# docker run -it --network=none ubuntu:14.04 /bin/bash
root@66308c6686be:/# ifconfig
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:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

# 
# docker inspect 66308c6686be | grep -i ipaddr
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "",

2) 主持人

在这种模式下容器将共享主机的网络堆栈,并且主机的所有接口都将可供容器使用。容器的主机名将与主机系统上的主机名匹配

# docker run -it --net=host ubuntu:14.04 /bin/bash
root@labadmin-VirtualBox:/# hostname
labadmin-VirtualBox

即使 IP 配置与主机系统的 IP 相同 配置

root@labadmin-VirtualBox:/# ip addr | grep -A 2 eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:b5:82:2f brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
3: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default 
root@labadmin-VirtualBox:/# exit
exit

HOST SYSTEM IP CONFIGURATION

# ip addr | grep -A 2 eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:b5:82:2f brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
3: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default 

在主机和无模式下不直接配置,但可以配置默认桥接网络以及创建您自己的用户定义的桥接网络。

3) 桥接模式

这是 Docker 默认的网络模式,它将启用与主机的其他接口以及容器之间的连接

# docker run -it --network=bridge ubuntu:14.04 /bin/bash
root@58b0b1f18b2e:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:0c  
          inet addr:172.17.0.12  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16 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:2668 (2.6 KB)  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:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

在桥接模式下可以访问其他容器。

root@58b0b1f18b2e:/# ping 172.17.0.11
PING 172.17.0.11 (172.17.0.11) 56(84) bytes of data.
64 bytes from 172.17.0.11: icmp_seq=1 ttl=64 time=0.143 ms
64 bytes from 172.17.0.11: icmp_seq=2 ttl=64 time=0.050 ms

与外部网络的连接。

root@58b0b1f18b2e:/# ping google.com 
PING google.com (216.58.197.46) 56(84) bytes of data.
64 bytes from maa03s20-in-f46.1e100.net (216.58.197.46): icmp_seq=1 ttl=51 time=16.9 ms

与主机的连接

root@labadmin-VirtualBox:~# ip a | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0

root@58b0b1f18b2e:/# ping 10.0.2.15
PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data.
64 bytes from 10.0.2.15: icmp_seq=1 ttl=64 time=0.113 ms

随着这些 docker 提供MACVLAN 网络,它允许在单个物理接口上配置多个第 2 层(MAC)地址。

【讨论】:

不错的答案。我要补充一点,MACVLAN 和其他 VLAN 驱动程序(IPVLAN 正在开发中)需要路由器上的 VLAN 支持和配置。如果您想要其他容器的 DNS 服务发现,您需要创建一个新的桥接网络并将容器附加到该网络,而不是使用不启用内置 DNS 发现的默认桥接网络。【参考方案2】:

Bridge 网络: Bridge 是 docker 中的默认网络,也称为 docker0。它是通过 NAT 防火墙桥接到您的主机所连接的物理设备的默认网络。但是,我们并不关心它,因为所有容器都会连接到这个网络并正常工作。

如果你有任何容器正在运行,你可以检查桥接网络,

$ docker network inspect bridge

....
"Containers": 
        "145a2716d018c6fe8e9f93a81d88afd5a7437f0084ddb170c40761818e6d2f67": 
            "Name": "nginx",
            "EndpointID": "ea6cfa433f41e21e572f17473c8e5f5e5d82e9f19646e66fe23abda20a3836b8",
            "MacAddress": "02:42:ac:11:00:02",
            "IPv4Address": "172.17.0.2/16",
            "IPv6Address": ""
        
    ,

...

注意:您可以看到自动分配给容器的 IP 地址来自 IPAM 配置子网。

主机网络:是一个特殊的网络,它跳过了docker的虚拟网络,直接将容器附加到主机接口。确实不建议这样做,但在某些情况下,它可以提高高吞吐量网络的性能,而在其他情况下,您将失去容器化的一些好处。

$ docker container run -it --net=host nginx:alpine /bin/bash

无网络: 相当于在您的机器上有一个不连接任何东西的接口,但我们可以创建自己的。 none 网络将容器添加到特定于容器的网络堆栈中。该容器缺少网络接口。

$ docker container run -it --network=none nginx:alpine /bin/bash

root@8cb783cd4509:/# ip -4 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever

【讨论】:

【参考方案3】:

假设你的docker镜像支持ifconfig,镜像名称为“ubuntu/net”

然后,为 host & none 运行 docker:

sudo docker run -it --network=host ubuntu/net
root@localhost:/# ifconfig
     docker0   Link encap:Ethernet  HWaddr xxxxxxxxxxxxx
               inet addr:x.x.x.x  Bcast:0.0.0.0  Mask:255.255.0.0
     eth0      Link encap:Ethernet  HWaddr xxxxxxxxxxxx
               inet addr:y.y.y.y  Bcast:  Mask:255.255.254.0


sudo docker run -it --network=none ubuntu/net
root@localhost:/# ifconfig
     lo        Link encap:Local Loopback
               inet addr:127.0.0.1  Mask:255.0.0.0

【讨论】:

以上是关于Docker“主机”和“无”网络有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

ping 命令有啥用?能干些啥?

Docker 网络

Docker网络与Iptables浅析

npcappacketdriver有啥用

pipework原理解析

token存在redis里有啥用