Docker网络模式
1.Docker的网络结构
一个容器,使用Docker命令跑起来后,一般只有一个eth0网卡,多个网卡的情况很少有。
容器eth0网卡,与宿主机的docker0网桥是一对。
docker网桥的默认地址是 127.0.0.1,作为本机所有容器网关。
veth接口:是和某个容器在逻辑上是连接的,叫网卡对。容器产生的报文,可以通过mac地址转发给docker网桥。
1.1 Docker查看管理网络的参数
connect:建立一个网络连接
create:创建一个自定义网络
disconnect:断开一个容器的网络连接
inspect:查看一个容器网络的详细信息
ls:列出所有网络
prune:删除所有容器的网络
rm:删除一个或多个容器网络
列出所有网络
#docker network ls
Docker默认网络是圈起来部分
Bridge模式(重点)
bridge模式是docker默认的,也是开发者最常使用的网络模式
创建容器不指定任何模式就是bridge模式。该模式会分配自己的网络IP等信息,并将容器连接到一个虚拟网桥与外界通信,
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),
另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0 中。
可以通过 brctl show 命令查看。如果没有 brctl 命令可以安装 yum install bridge-utils,如图
演示:
以centos 容器为例, 创建centos 容器,命名为 centos-1:
[root@docker-31 ~]# docker run -it --name centos-1 centos /bin/bash
host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的 Network Namespace,
而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,
而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等 还是 和宿主机隔离的。
容器和宿主机具有相同的IP地址10.0.7.197。
当使用host模式网络时,容器实际上继承了宿主机的IP地址。
该模式比 bridge 模式更快(因为 没有开销),但是它因为与宿主机IP相同,所以只能通过端口来进行 服务的区分。
采用host模式的容器,可以直接使用宿主机的IP地址与外界进行通信,若宿主机具有公有IP,那么容器也拥有这个公有IP。
同时容器内服务的端口也可以使用宿主机的端口,无需额外进行NAT转换,
而且由于容器通信时,不再需要通过linuxbridge等方式转发或者数据包的拆封,性能上有很大优势。
当然,这种模式有优势,也就有劣势,主要包括以下几个方面:
• 最明显的就是容器不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈的使用,并且容器的崩溃就可能导致宿主机崩溃,
在生产环境中,这种问题可能是不被允许的,将容器直接暴露在公共网络中,是有安全隐患的。。
• 容器内部将不再拥有所有的端口资源,因为一些端口已经被宿主机服务、bridge模式的容器端口绑定等其他服务占用掉了。
演示:
启动centos-2 容器,以 --net=host 指定网络连接为 host模式
#docker run -it --net=host --name centos-2 centos /bin/bash
直接进入 容器了,查看容器IP地址,发现看到的就是宿主机的网络信息。
宿主机上查看
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25ead3e11eaf centos "/bin/bash" 36 seconds ago Up 35 seconds centos-2
dff3b564f291 centos "/bin/bash" 26 minutes ago Up 26 minutes centos-1
Container模式(也叫 其它容器模式)
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
两个容器的进程可以通过 lo 网卡设备通信。
演示:以 --net=container:指定名称或ID
#docker run -tid --net=container:docker_bri1 --name docker_con1 ubuntu-base:v3 #docker exec -ti docker_con1 /bin/bash #docker exec -ti docker_bri1 /bin/bash
None模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器 没有网卡、IP、等信息。需要我们自己为 Docker 容器添加网卡、配置IP等。
在这种模式下,容器有独立的网络栈,但不包含任何网络配置,只具有lo这个loopback网卡用于进程通信。
也就是说,none模式为容器做了最少的网络设置,在没有网络配置的情况下,
通过第三方工具或者手工的方式,开发这任意定制容器的网络,提供了最高的灵活性
演示:以--net=none指定网络模式
#docker run -tid --net=none --name docker_non1 ubuntu-base:v3 #docker exec -ti docker_non1 /bin/bash
容器跨主机通信需要打开 ipv4服务,否则容器无法跨主机进行通信