Docker学习笔记-网络类型
Docker 网络类型
1、Docker四种网络模式
(1)docker四种网络模式如下:
- Bridge contauner 桥接式网络模式
- Host(open) container 开放式网络模式
- Container(join) container 联合挂载式网络模式,是host网络模式的延伸
- None(Close) container 封闭式网络模式
(2)可以通过docker network
命令查看
(3)docker run --net
命令可以指定使用网络模式
2、Bridge模式
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,处于七层网络模型的数据链路层,起到了交换机的作用,此主机上启动的Docker容器会连接到这个虚拟网桥上, 所以有默认地址172.17.0.0/16的地址。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
这个命令在bridge-utils中,需要提前安装 apt install bridge-utils
bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。
使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL
查看。
容器拥有独立的network namespace,且拥有独立的IP、端口、路由等,使用veth pair连接docker0网桥,并以dockero网桥为默认网关。
说明:
- –net=bridge 可省略 ,-p 指定端口映射
- 虚拟网桥默认 IP 范围是一般都是 172.17.x.x
DNAT 的概念
DNAT,全称 Destination NAT,就是在数据包进入网络层时,把 目标 IP 地址 或 目标端口号 改成另外一个地址或端口。
-
D → Destination(目的地址)
-
NAT → Network Address Translation(网络地址转换)
常见用途:
-
端口映射(Port Forwarding)
-
负载均衡(把外部请求转发到后端多台服务器)
-
Docker 容器端口转发(宿主机端口 → 容器端口)
3、host模式
如果给容器指定为host模式,那么该容器就没有独立的network namespace,而是共用宿主机的。所以,容器不会有自己的网卡信息,而是使用宿主机的IP和端口。但除了网络,其他像文件系统、进程等和宿主机依然是隔离的。
注意:容器和宿主机公用一个IP地址,但使用的端口不能被宿主机占用,也不能相同。
4、None模式
在None模式下,容器有自己的Network Namespace,但是并不为Docker 容器进行任何网络配置。也就是说,这个Docker 容器没有网卡,ip, 路由等信息。
这种类型没有办法联网,但是封闭的网络能很好的保证容器的安全性,该容器将完全独立于网络,用户可以根据需要为容器添加网卡。此模式拥有所有端口。特殊情况下才会用到,一般不用。
5、container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围等。
可以在一定程度上节省网络资源,容器内部依然不会拥有所有端口。同样,两个容器除了网络方面,其他的如文件系统,进程列表等还是隔离的。
两个容器的进程可以通过网卡设备通信。
新建的容器与指定容器共享IP地址,但不能使用相同的端口。
以上四种网络模式只考虑的是容器和宿主机、容器和容器之间的通信,只能在同一台机器里,不能跨主机通信。
6、overlay模式–》实现跨宿主机的docker之间的通信
底层原理是VXLAN.
7、自己动手新建一个网络接口sc,让新建的容器连接到这个接口上来
docker inspect sc-nginx-1
查看容器详情
使用iptables 查看
ip add
命令输出详解
ip add
输出展示了主机上的 所有网络接口(物理的 + 虚拟的),包括 Docker 创建的虚拟网络。
1. lo
-
名字:
lo
-
类型:回环接口(Loopback)
-
作用:本地环回测试使用,IP 地址
127.0.0.1
或::1
,用于进程之间本机通信,不经过物理网卡。
2. ens33
-
名字:
ens33
-
类型:物理网卡(Ethernet 接口)
-
作用:主机真实的网络接口,连接到你所在的物理网络/虚拟机 NAT/桥接环境。
-
IPv4 地址:
192.168.237.177/24
,说明主机在192.168.237.0/24
网段。
3. docker0
-
名字:
docker0
-
类型:Docker 默认创建的 Linux 桥接网卡(bridge)
-
作用:当容器使用默认网络(bridge 网络模式)时,容器的虚拟网卡都会挂到这个网桥上,实现容器与主机之间通信。
-
默认 IPv4:一般是
172.17.0.1/16
,但你这里只显示了 IPv6 地址。
4. veth3a2f510@if2
-
名字:
veth...
-
类型:veth pair(虚拟以太网设备对)的一端
-
作用:每个容器都会有一个 veth pair,一端在容器命名空间内,另一端接入主机上的
docker0
(或其他 Docker 网络桥)。 -
说明:
@if2
表示另一端连接到编号2
的接口(容器内的 veth 设备)。
5. br-2737d7fbbbe5
-
名字:
br-2737d7fbbbe5
-
类型:Docker 用户自定义 bridge 网络
-
作用:当你用
docker network create
创建自定义网络时,Docker 会在主机上创建一个 Linux bridge,并分配子网。 -
IPv4 地址:
172.18.0.1/16
,说明该网络的容器默认分配172.18.x.x
地址。
6. vethaa59346@if2
-
名字:
veth...
-
类型:veth pair 的一端
-
作用:挂在
br-2737d7fbbbe5
上,对应一个容器的网络接口。另一端在容器内部。
7. vethc5ed6bb@if2
-
名字:
veth...
-
类型:veth pair 的一端
-
作用:同上,也是
br-2737d7fbbbe5
桥接的一个容器接口。
🔹 总结
-
物理/本机接口
-
lo
:本地回环 -
ens33
:主机物理网卡(192.168.237.177)
-
-
Docker 默认网络
-
docker0
:默认 bridge -
veth3a2f510
:挂在docker0
上的容器接口
-
-
Docker 自定义网络
-
br-2737d7fbbbe5
:自定义 bridge(172.18.0.1) -
vethaa59346
/vethc5ed6bb
:挂在该自定义 bridge 上的容器接口
-
