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)