Docker 安装时会自动在 host 上创建三个网络,我们可用 docker network ls 命令查看:

root@ubuntu:/myregistry/docker/registry/v2/repositories# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
db8c44d1411e        bridge              bridge              local
d71b0f0fe06e        host                host                local
aa76b578a078        none                null                local

none 网络

none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 –network=none 指定使用 none 网络。

封闭意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。

root@ubuntu:/myregistry/docker/registry/v2/repositories# docker run -it --network=none busybox
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
90e01955edcd: Pull complete 
Digest: sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812
Status: Downloaded newer image for busybox:latest
/ # 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:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

host 网络

连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过 –network=host 指定使用 host 网络。

直接使用 Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。

root@ubuntu:/myregistry/docker/registry/v2/repositories# docker run -it --network=host busybox
/ # ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:73:72:1C:C8  
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:73ff:fe72:1cc8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4728 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4862 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:265017 (258.8 KiB)  TX bytes:49718499 (47.4 MiB)

ens33     Link encap:Ethernet  HWaddr 00:0C:29:39:C0:ED  
          inet addr:192.168.21.132  Bcast:192.168.21.255  Mask:255.255.255.0
          inet6 addr: fe80::4353:2d1:a:26e2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:698332 errors:0 dropped:0 overruns:0 frame:0
          TX packets:123099 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:933624546 (890.3 MiB)  TX bytes:8561438 (8.1 MiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:12380 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12380 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:50146407 (47.8 MiB)  TX bytes:50146407 (47.8 MiB)

veth1848a47 Link encap:Ethernet  HWaddr 02:D3:35:AE:4D:3B  
          inet6 addr: fe80::d3:35ff:feae:4d3b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4720 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4825 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:329525 (321.8 KiB)  TX bytes:49713860 (47.4 MiB)

veth3659f03 Link encap:Ethernet  HWaddr CA:48:EA:28:A5:51  
          inet6 addr: fe80::c848:eaff:fe28:a551/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:65 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:6568 (6.4 KiB)

bridge 网络

Docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定–network,创建的容器默认都会挂到 docker0 上。

root@ubuntu:/myregistry/docker/registry/v2/repositories# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.024273721cc8	no		

当前 docker0 上没有任何其他网络设备,我们创建一个容器看看有什么变化。

root@ubuntu:/myregistry/docker/registry/v2/repositories# docker run -d httpd
3fe281b052133366e2420922ae81cdf47620a2a0665af0a4e800cd4747bd2287
root@ubuntu:/myregistry/docker/registry/v2/repositories# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.024273721cc8	no		vethf8aed09

一个新的网络接口 vethf8aed09 被挂到了 docker0 上,vethf8aed09就是新创建容器的虚拟网卡。

容器有一个网卡 eth0@if34。大家可能会问了,为什么不是vethf8aed09 呢?

实际上 eth0@if34 和 vethf8aed09 是一对 veth pair。veth pair 是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if34)在容器中,另一头(vethf8aed09)挂在网桥 docker0 上,其效果就是将 eth0@if34 也挂在了 docker0 上。


版权声明:本文为qq_33394088原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_33394088/article/details/84844002