前情提要:本篇博客将详细介绍docker的原生四种网络:bridge,host,none,container(joined)的原理和示例,通过本篇博客你可以学会这些网络的原理和相关的配置
一、原生网络简介
docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分
docker安装后会自动创建3种网络:bridge、host、none
cpp
# 使用以下命令查看
[root@docker harbor]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2a93d6859680 bridge bridge local
4d81ddd9ed10 host host local
8c8c95f16b68 none null local
Docker提供了5种主要网络模式,每种模式适用于不同的场景
| 网络模式 | 隔离级别 | 端口映射 | 与宿主机关系 | 适用场景 |
|---|---|---|---|---|
| Bridge | 高 | 支持 | 通过网桥通信 | 默认模式,单机容器通信 |
| Host | 无 | 不需要 | 共享宿主机网络 | 高性能需求场景 |
| None | 最高 | 不支持 | 完全隔离 | 安全隔离场景 |
| Container | 中 | 继承 | 共享另一容器网络 | 特殊协作场景 |
| Overlay | 高 | 支持 | 跨主机通信 | 多主机/集群环境 |
二、Docker原生bridge网络
原理:
- Docker 服务默认创建 `docker0` 网桥
- 每个容器启动时会创建一对虚拟网卡(veth pair)
- 一端在容器内,另一端连接到 docker0 网桥
- 容器通过 NAT 访问外部网络
特点
- 容器间可通过 IP 直接通信
- 支持端口映射(-p 参数)
- 网络隔离性好
- 默认不支持容器名解析(需自定义网络)
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口
cpp
[root@docker mnt]# ip link show type bridge
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:5f:e2:34:6c brd ff:ff:ff:ff:ff:ff
-
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
-
容器通过宿主机的NAT规则后可以访问外网

示例
cpp
# 运行容器
[root@docker-node2 ~]# docker run -d --name web -p 80:80 nginx:1.26
[root@docker-node2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61fe1dfcd025 nginx:1.26 "/docker-entrypoint...." 2 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, [::]:80->80/tcp web
[root@docker-node2 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::6484:9eff:fe23:5fa3 prefixlen 64 scopeid 0x20<link>
ether 66:84:9e:23:5f:a3 txqueuelen 0 (Ethernet)
RX packets 44 bytes 13164 (12.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 48 bytes 11845 (11.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.254.20 netmask 255.255.255.0 broadcast 172.25.254.255
inet6 fe80::2360:d7ac:9af2:bb39 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:b7:c0:af txqueuelen 1000 (Ethernet)
RX packets 2505 bytes 232739 (227.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1953 bytes 232250 (226.8 KiB)
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 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
veth3e65a2f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 # 这个是容器使用的网卡
inet6 fe80::e490:e0ff:fe9e:13c2 prefixlen 64 scopeid 0x20<link>
ether e6:90:e0:9e:13:c2 txqueuelen 0 (Ethernet)
RX packets 3 bytes 126 (126.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9 bytes 806 (806.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
cpp
[root@docker-node2 ~]# brctl show # 需要下载bridge-utils
bridge name bridge id STP enabled interfaces
docker0 8000.66849e235fa3 no veth3e65a2f
三、Docker原生host网络
原理
-
容器直接使用宿主机的网络命名空间
-
不创建虚拟网卡,无网络隔离
特点
-
网络性能最优(无NAT开销)
-
无需端口映射
-
无网络隔离,端口可能冲突
-
Linux 专属(Mac/Windows不支持)
host网络模式需要在容器创建时指定 --network=host
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性

示例
cpp
# 运行busybox
# 如果公用一个网络,那么所有的网络资源都是公用的,比如启动了nginx容器那么真实主机的80端口被占用,在启动第二个nginx容器就会失败
[root@docker-node2 ~]# docker run -it --name test --network host busybox:latest
/ # ifconfig
docker0 Link encap:Ethernet HWaddr 66:84:9E:23:5F:A3
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::6484:9eff:fe23:5fa3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:61 errors:0 dropped:0 overruns:0 frame:0
TX packets:66 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:15041 (14.6 KiB) TX bytes:13579 (13.2 KiB)
eth0 Link encap:Ethernet HWaddr 00:0C:29:B7:C0:AF
inet addr:172.25.254.20 Bcast:172.25.254.255 Mask:255.255.255.0
inet6 addr: fe80::2360:d7ac:9af2:bb39/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2999 errors:0 dropped:0 overruns:0 frame:0
TX packets:2284 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:312084 (304.7 KiB) TX bytes:270654 (264.3 KiB)
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: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)
veth3e65a2f Link encap:Ethernet HWaddr E6:90:E0:9E:13:C2
inet6 addr: fe80::e490:e0ff:fe9e:13c2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:20 errors:0 dropped:0 overruns:0 frame:0
TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2241 (2.1 KiB) TX bytes:2960 (2.8 KiB)
四、Docker原生none网络
原理:
-
容器拥有独立的 Network Namespace
-
但不配置任何网络接口(只有lo回环)
特点
-
最高安全隔离
-
可手动配置网络
-
无法访问外部网络(需手动配置)
none模式是指禁用网络功能,只有lo接口,在容器创建时使用 --network=none指定。
示例
cpp
[root@docker ~]# docker run -it --name test --rm --network none busybox
/ # ifconfig
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: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)
五、Docker原生网络Container(Joined)模式
原理
-
新容器共享已存在容器的网络命名空间
-
两个容器使用相同的网络接口和IP
特点
-
容器间通信通过localhost
-
适合Sidecar模式(如服务网格)
-
依赖主容器生命周期
Joined容器一种较为特别的网络模式,在容器创建时使用--network=container:vm1指定。(vm1指定的是运行的容器名)
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

示例
cpp
[root@docker ~]# docker run -it --rm --network container:web1 busybox
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:12:00:02
inet addr:172.18.0.2 Bcast:172.18.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:28 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3046 (2.9 KiB) TX bytes:280 (280.0 B)
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: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)
[root@docker ~]# docker run -it --rm --network container:web1 centos:7
[root@efae66874371 /]# curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
综上,docker的四种原生网络介绍完毕