这是我参与 8 月更文挑战的第 25 天,活动详情查看: 8月更文挑战
简介
Docker
中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。 Linux
通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多。
Docker
容器网络就利用了这项技术。它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做 veth pair
)。
网络模式
网络模式 | 介绍 |
---|---|
Host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 |
Bridge | 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。 |
None | 该模式关闭了容器的网络功能。 |
Container | 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。 |
创建容器的时候可以通过--net
手动指定容器的网络类型
docker run -it --name test --net [host bridge none container] ubuntu
host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace
,而是和宿主机共用一个Network Namespace
。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host
模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT
,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
Bridge模式
相当于Vmware
中的Nat
模式,容器使用独立network Namespace
,并连接到docker0
虚拟网卡(默认模式)。通过docker0
网桥以及Iptables nat
表配置与宿主机通信;bridge
模式是Docker
默认的网络设置,此模式会为每一个容器分配Network Namespace
、设置IP等,并将一个主机上的Docker
容器连接到一个虚拟网桥上。
None模式
使用none
模式,Docker
容器拥有自己的Network Namespace
,但是,并不为Docker
容器进行任何网络配置。也就是说,这个Docker
容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none
模式可以在容器创建时通过--network=none
来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
Container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace
,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
自定义网络
除了上面四种网络类型之外,docker还支持自己创建网络。
创建自定义的网卡,--subnet
指定IP地址和子网掩码
在创建容器时指定为我们创建的网络
查看自定义网卡的详细信息,可以看到使用此网卡的容器
docker network inspect test-network