docker-容器网络类型
docker-容器网络类型
- 一、默认网络类型(3 种)
- 1. Bridge 网络(默认桥接网络)
- 2. Host 网络
- 3. None 网络
- 二、其他网络类型
- container 网络
- overlay 网络
- macvlan
- ipvlan
- 三、创建自定义网络
一、默认网络类型(3 种)
安装 Docker 后,默认会自动创建 3 种网络,可通过 docker network ls
命令查看
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3b944387ffc3 bridge bridge local
68515d24c1f3 host host local
7fe371b7ca5c none null local
1. Bridge 网络(默认桥接网络)
Docker 最常用的网络类型,是单机环境下容器间通信的默认选择。它通过 Linux 网桥(docker0
)实现容器与主机、容器与容器之间的网络隔离和通信
核心特性
- 隔离性:同一主机上的 Bridge 网络相互隔离,不同 Bridge 网络的容器无法直接通信(需手动配置互联)
- NAT 转换:容器通过主机的 IP 地址访问外网(主机作为网关,将容器私有 IP 转换为公有 IP)
- 端口映射:需通过 -p 或 --publish 命令将容器端口映射到主机,外部才能访问容器服务
工作原理
- Docker 启动时创建虚拟网桥 docker0(默认 IP 段:172.17.0.0/16)
- 每个容器启动时,会创建一对虚拟网卡(veth pair):一端在容器内(命名为 eth0,分配私有 IP),另一端连接到 docker0 网桥
- 容器间通过 docker0 网桥通信,无需端口映射;容器访问外网时,通过主机的 iptables 规则实现 NAT 转换
2. Host 网络
容器直接使用主机的网络命名空间(Network Namespace),即容器与主机共享 IP 地址和端口,容器内的端口直接暴露在主机上
核心特性
- 无隔离:容器没有独立的 IP,与主机共用网络栈,端口冲突会直接导致容器启动失败
- 高性能:无需通过网桥和 NAT 转换,网络通信效率最高(适合对网络延迟敏感的场景)
- 无端口映射:容器内启动的服务,直接通过 主机IP:容器端口 访问,无需 -p 参数
启动容器时指定 --network host
3. None 网络
容器只有 lo(回环)网络接口,没有任何外部网络连接
核心特性
- 完全隔离:无法与主机、其他容器或外网通信,仅能在容器内部通过 lo 接口进行本地通信
- 无网络栈:不分配 IP 地址,不创建虚拟网卡,仅保留回环接口用于容器内部进程通信
二、其他网络类型
container 网络
很多容器共享一个ip地址(“”合租“”)
- 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享
- 新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信
以上4种模式,只是考虑宿主机和容器之间的通信 -> 在同一台容器里
overlay 网络
基于 VXLAN 技术的跨主机网络,可将多个 Docker 主机上的容器连接到同一个虚拟网络中,实现跨主机容器间的直接通信
VXLAN是一种隧道技术。通过将虚拟网络中的数据帧封装在实际物理网络中的报文中进行传输
核心特性
- 跨主机通信:突破单机限制,不同主机的容器可在同一 Overlay 网络内直接通信(通过容器名或 IP)
- 依赖集群:需基于 Docker Swarm(Docker 内置集群工具)或 Kubernetes 等编排平台创建,依赖集群的网络控制平面。
- 内置负载均衡:Docker Swarm 环境下,Overlay 网络支持对服务(Service)的负载均衡
macvlan
将主机的物理网卡虚拟为多个 “子网卡”,每个容器直接获得与主机在同一局域网的 独立 MAC 地址和 IP 地址(相当于局域网内的一台独立物理机)
ipvlan
与 Macvlan 类似,容器直接使用主机物理网卡的网络资源,但 所有容器共享主机的 MAC 地址,仅通过不同的 IP 地址区分(Layer 3 层隔离)
三、创建自定义网络
创建网络的命名空间(默认bridge)
[root@docker ~]#
docker network create --driver
bridge sc
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f9e8391e3a48 bridge bridge local
68515d24c1f3 host host local
7fe371b7ca5c none null local
d91f5870f39b sc bridge local
使用自定义网络创建两个容器
[root@docker ~]# docker run -d -it --name lwx-nginx-1
--network
sc nginx
420961dd53dc298b0cbb776d02ab626c8e677281cfc0ce50084da5b4c497a19a
[root@docker ~]# docker run -d -it --name lwx-nginx-2 --network sc nginx
72a215979aa8d80269c71591866206790084f46a131608df7c49d09ad633257c
查看两个容器ip地址
[root@docker ~]# docker inspect lwx-nginx-1|grep IPAddress"SecondaryIPAddresses": null,"IPAddress": "","IPAddress": "172.18.0.2",
[root@docker ~]# docker inspect lwx-nginx-2|grep IPAddress"SecondaryIPAddresses": null,"IPAddress": "","IPAddress": "172.18.0.3",
进入创建容器里面,ping一下
[root@docker ~]# docker exec -it lwx-nginx-1 bash
[root@bbd034cb2a32 /]# ping www.baidu.com
PING www.a.shifen.com (183.2.172.17) 56(84) bytes of data.
64 bytes from 183.2.172.17 (183.2.172.17): icmp_seq=1 ttl=127 time=26.7 ms
64 bytes from 183.2.172.17 (183.2.172.17): icmp_seq=2 ttl=127 time=27.3 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 26.773/27.062/27.352/0.332 ms[root@bbd034cb2a32 /]# ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.155 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.121 ms
64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.123 ms
64 bytes from 172.18.0.3: icmp_seq=4 ttl=64 time=0.050 ms
64 bytes from 172.18.0.3: icmp_seq=5 ttl=64 time=0.065 ms
^C
--- 172.18.0.3 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4079ms
rtt min/avg/max/mdev = 0.050/0.102/0.155/0.041 ms