首先,简要插播一下计算机网络的内容:
- 集线器hub(物理层):连接多个PC端。不做任何处理,通过48位的MAC地址无脑将电信号广播至所有出口,浪费网络资源又不安全。
- 交换机(数据链路层):内部维护一张 MAC 地址表(起初MAC地址表的形成要依靠广播),只把数据包发给目标 MAC 地址(物理层面上,一般不可修改)指向的那台电脑,形成以太网。由于交换机端口数量有限,当PC端逐渐变多时难以支撑,此时可以考虑把交换机A(连接ABCD)与交换机B(连接EFGH)相连,但两个交换机得分别记录 A ~ H 所有机器的映射记录,日积月累,交换机也不堪重负。
- 路由器(网络层):路由器的每一个端口,都有独立的 MAC 地址,现在交换机的 MAC 地址表中,只需要多出一条 MAC 地址 ABAB 与其端口的映射关系,利用32位IP地址(软件层面上,可以修改),就可以成功把数据包转交给路由器了。
- All in all:电脑视角:首先我要知道我的 IP 以及对方的 IP;通过子网掩码判断我们是否在同一个子网;在同一个子网就通过 arp 缓存表(通过 arp 协议广播逐渐完善)获取对方 mac 地址直接扔出去;不在同一个子网就通过 arp 缓存表获取默认网关的 mac 地址直接扔出去。交换机视角:我收到的数据包必须有目标 MAC 地址;通过 MAC 地址表(通过以太网各节点广播逐渐完善)查映射关系;查到了就按照映射关系从我的指定端口发出去;查不到就所有端口都发出去。路由器视角:我收到的数据包必须有目标 IP 地址;通过路由表(各种路由算法 + 人工配置逐步完善)查映射关系;查到了就按照映射关系从我的指定端口发出去;查不到则返回一个路由不可达的数据包。
- 网络层(IP协议)本身没有传输包的功能,包的实际传输是委托给数据链路层(以太网中的交换机)来实现的。
以上总结参考自wx公众号,欲深入了解请跳转
查看docker网络模式docker network ls
,会出现bridge
、host
、none
三种网络模式,创建容器时默认为bridge,可以使用docker network inspect bridge/host/none
来查看三种网络的详细信息。
- 默认bridge:采用veth(virtual ethernet虚拟以太网)技术,以docker0做bridge默认网络模式的网关,每创建一个容器就会产生(一对)veth-pair接口&与docker0在同一网段的一个IP地址.
容器IP是私有地址,外部互联网想要访问容器,需要-p暴露端口.
假设采用默认bridge网络模式创建了两个容器aa(172.17.0.2)和bb(172.17.0.3),进入容器aa,ping 172.17.0.3
可以ping通,但在默认bridge模式下无法进行DNS域名解析,即ping bb
会ping不通。采用–link进行容器互联docker run -it --name bb --link aa 镜像name:tag
,可以实现bb ping aa的单方向DNS域名解析. - 自定义bridge:
docker network create -d bridge my_bridge_net
创建自定义bridge网络模式,可以使用docker network ls
查看新建的bridge,同样它也有一个类似docker0的桥。docker run -it --network my_bridge_net 镜像name:tag
使用自定义bridge创建容器,可以进行DNS域名解析。要想删除此网络,终端输入docker network rm my_bridge_net
(无法删除原始的3种网络). - host:该模式下容器相当于宿主机的一个应用,无需端口映射互联网也能访问容器(非要映射会遭到拒绝discard).
- none:以该模式创建的容器只有lo本地回环一种网络,不能联网,被隔离.
docker进阶:
- Docker Compose :一个在单个服务器或主机上创建多个容器的工具
- Docker Swarm :可以在多个服务器或主机上创建容器集群服务
(未完待续)