LV001-网络模式简介
容器之间虽然不是物理隔离,但是它们彼此之间默认是不互联互通的,这也有助于保持每个容器的纯粹性,相互之间互不影响。既然使用了容器,通常情况下,容器需要与宿主机通信,或者 A 容器与 B 容器通信而 B 不需要知道 A 的存在,或者 A/B 两容器相互通信。从而,就引出了本节内容,他们相互通信,就绕不开容器的网络模式!
一、概述
1. 容器的网络模式
基于对 Network Namespace 的控制,docker 可以为在容器创建隔离的网络环境,在隔离的网络环境下,容器具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络命名空间,基本可以满足开发者在各种场景下的需要。按 docker 官方的说法,docker 容器的网络有五种模式:
| 模式名称 | 简介 | 备注 |
|---|---|---|
bridge | 容器拥有独属于自己的虚拟网卡和和虚拟 IP 等网络资源,它们分别通过 docker0 虚拟网卡与宿主机的 eth0(一般是这个,也可能叫 ens33,看主机的网卡了) 网卡交互,进而和外界网络交互 | 默认模式 |
| host | 容器没有自己的任何独立的网络资源(比如:容器的 IP、网卡和端口),完全和宿主机共享网络空间 | 弊端:同一个端口只能同时被一个容器服务绑定 |
| none | 该模式关闭了容器的网络功能,仅有独自的网络空间(一个空架子),并且该模式不会给容器分配任何网络资源,包括虚拟网卡、路由、防火墙、IP、网关、端口等 | 只有一个容器,没有任何的网络资源(很少用) |
| container | 它是 bridge 和 host 模式的合体,优先以 bridge 方式启动启动第一个容器,后面的所有容器启动时,均指定网络模式为 container,它们均共享第一个容器的网络资源,除了网络资源,其他资源,容器彼此之间依然是相互隔离的 | 第一个以 bridge 方式启动的容器服务挂掉,后面依赖它的容器,都暂停服务 |
| 自定义 | 该模式也更为灵活,可以通过-d 指定自定义的网络模式的类型,可以是 bridge 或者 overlay,其中 overlay 功能更为强大,可以指定多个 subnet 子网网段。 | 该模式,在容器之间可以使用别名相互通信,这一点可以给我们带来很大的方便(重要) |
2. 三种网络
Docker 安装以后,会默认创建三种网络,可以通过下面的命令查看:
docker network ls【例】
➜ /workspace git:(main) docker network ls
NETWORK ID NAME DRIVER SCOPE
7e6753c82f11 bridge bridge local
b5230fbd18e6 host host local
2b7fefd9cd99 none null localTips:这里只有三种,为什么上面说有五种?剩余的两种需要手动定义后,再通过 docker network ls 命令查看才会展现出来。
3. docker0 虚拟网卡
我们在 CNB 的云原生开发环境中执行 ifconfig 命令:
➜ /workspace git:(main) ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:d2:70:dc:72 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.27.247.2 netmask 255.255.255.0 broadcast 172.27.247.255
ether 02:42:ac:1b:f7:02 txqueuelen 0 (Ethernet)
RX packets 3384 bytes 870989 (850.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3127 bytes 6466984 (6.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 94 bytes 7630 (7.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 94 bytes 7630 (7.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0就会看到这里有一个 docker0 的虚拟网卡,当 docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,宿主机上以 Bridge 模式启动的容器会链接到这个虚拟网桥上。docker0 默认地址 172.17.0.0/16。
虚拟网桥的工作方式和物理交换机类似,这样宿主机上的所有容器就通过 docker0 连在一个二层网络中,再通过 docker0 和物理网卡 eth0 交互(这里 CNB 的网卡名字是 eth0,像本地 VMware 中 Ubuntu 的话可能就是叫 ens33 了)。
4. 怎么指定网络模式
我们在使用 docker run 创建 Docker 容器时,可以用 –net 选项指定容器的网络模式:
docker run --net=bridge
docker run --net=host
docker run --net=container
docker run --net=none当是什么也不加的时候,默认使用的是 bridge 模式,这个模式下,内部容器都会把信息汇总给 docker0 网卡,由它再转发给 eth0,来和外界交互。
参考资料:
Docker 四种网络模式(Bridge,Host,Container,None) - wq9 - 博客园
Docker 学习:容器五种(3+2)网络模式 | bridge 模式 | host 模式 | none 模式 | container 模式 | 自定义网络模式详解-CSDN 博客