本文共 2013 字,大约阅读时间需要 6 分钟。
默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
容器不会获得一个独立的network namespace,而是与宿主机共用一个。
在容器中使用ifconfig查看网络发现显示的是宿主机的网络
获取独立的network namespace,但不为容器进行任何网络配置,之后用户可以自己进行配置,容器内部只能使用loopback网络设备,不会再有其他的网络资源。
与指定的容器使用同一个network namespace,网卡配置也都是相同的。
自定义网桥,默认与bridge网络一样。
Bridge桥接模式的实现步骤主要如下:
同时Docker采用NAT(Network Address Translation,网络地址转换)的方式(可自行查询实现原理),让宿主机以外的世界可以主动将网络报文发送至容器内部。
通过Bridger网桥模式实现:
父进程在创建子进程时,如果不使用```CLONE_NEWNET```这个参数标志,那么创建出的子进程会与父 进程共享同一个网络namespace。
Docker就是采用了这个简单的原理,在创建进程启动容器的过程中,没有传入CLONE_NEWNET
参数标志,实现Docker Container与宿主机共享同一个网络环境,即实现host网络模式。
优势:
缺陷:
Docker Container的container网络模式在实现过程中,不涉及网桥,同样也不需要创建虚拟网卡veth pair。
完成container网络模式的创建只需要两个步骤:
优势:
缺陷:
Docker主要通过netfilter/iptables实现网络通信。
iptables由netfilter和iptables组成,netfilter组件是Linux内核集成的信息包过滤系统,它维护一个信息包过滤表,这个表用于控制信息包过滤处理的规则集。而iptables只是一个在用户空间的工具,用于增删改查这个过滤表的规则。
容器将数据报发送给容器网关,即docker0虚拟网桥,然后虚拟网桥再转发到实际的网卡并由实际网卡转发到物理网关,然后向目标进行层层转发直到抵达目标地址。
容器通过将服务的实际端口在宿主机上进行端口映射,外部客户端通过连接宿主机的映射端口来访问容器内的服务。