一、四种网络模式
二、docker网络模型
三、容器网络访问原理
四、容器网络实现的核心技术:iptables
五、跨主机网络:实现docker 主机容器通信
一、四种网络模式bridge:当我们创建一个容器时,默认会创建一个桥接网络。启动docker之后会有一个docker0网桥。会将docker内的所有网络桥接到docker0上,走docker到宿主机上将数据包给转发出去。(网桥就相当于一个二层交换机,把容器加入进来,想当于在交换机上查了一根网线)
* docker run -d nginx
* docker ps -l
* docker network --help //网络管理相关指令
* docker network ls //查看当前docker网络模式
* docker network inspect 网路id //查看网络模式的详细信息。以json格式输出
subnet:表示ip池,意思是创建的容器会从这个ip段中分配ip地址,分配ip是从.2开始, .1不分配,默认做网关使用。
* yum install -y bridge-utile
* brctl show docker0 //查看已经加入网桥的网络,圈红字符想当于网线名称
也可以创建自定义网络:(不指定模式默认网桥)
* docker network create test
* docker network ls //查看
* docker run -d --network test nginx //这么做的目的也是为了不同的项目间实现网络隔离性
* docker ps
* docker network ls
* docker inspect 网络id
新建一个网桥,就会新建一个子网。在默认网络中,主机名是不提供任何解析机制的,想当于,在一个网络中,创建两个容器,可以使用ip进行通心,–name指定的名字或者hostname来通信。因为docker内部其实是有dns,做了容器与ip之间的绑定关系。
host网络模式:创建这个容器,不再创建单独的网络命名空间,而是和宿主机公用一个,也就是说,除了网络之外,其他都是隔离的。
* docker run -it --net=host busybox sh
* ipconfig
这样的一个好处就是,你在容器中启用的服务,占用的是宿主机上的端口。
none:就是不为这个容器网络做任何的网络配置,获取独立的命名空间,需要手动配置。想当于手动获取ip。主要应用场景就是比如公司有自己的ip池,需要从公司的ip地址池里获取ip。
container:实际上当前创建的容器,与另外一个容器使用同一个网络命名空间。
* docker run -itd --net=container:bs2 --name=bs1 busybox //bs2 容器id
* docker exec -it bs1 bash
像container网络模式,在k8s中有应用到,是k8s的默认网络机制。k8s的最小调度单元是pod,也是容器的一个抽象一般会运用在lnmp环境,nginx与php网络环境互通
二、docker网络模型上图下方部分是宿主机的网络命名空间,上方是容器中的网络命名空间,里面配置了一个eth0的网络的ip。引入veth,也是为了解决网络命名空间之间的隔离。容器默认是可以与外部访问的,那么数据包是怎么从容器中出去的呢?答:是容器中的默认路由
* ip route //查看路由
默认路由除了本机的ip之外,都会走这个默认路由,进入到eth0网卡,eth0就是veth的另外一段,docker0是这一端。veth和eth0一样也在宿主机上:
* ip route //查看默认网络
* brctl show docker0 //查看网桥的另一端veth接口名称
这个veth就相当于一个二层交换机,网桥的作用,只用于数据的转发。容器网络中访问的工作原理:
* docker run -d -p 88:80 nginx //在宿主机上暴露一个端口88映射到容器的80端口
* 测试访问:ip:88
从外部访问容器,数据包是如何传输的?
答:首先client发送一个请求,数据包先到达宿主机上的网络协议栈内,进来之后–>经过DNAT(iptables层实现,做了网络地址转换)–>将数据包转换给docker0,到网桥上走二层,(基于arp协议来获取对方的mac地址来通信,做一个ip地址广播,然后记录ip地址与mac地址的关系,下次如果再有相同的请求包,直接根据自己的mac地址表转换)–>然后veth来决定是与哪个容器网络通信,然后再走veth的另一端–>转发到容器中–>流入容器之后,会对这个数据包解封装,确定是自己的,再去处理。
容器访问外部,数据包怎么传输?
答:数据包首先会从eth0出去–>出去之后到达宿主机(veth)–>连接到网桥里面docker0,docker0将数据包转发,然后通过SNAT(iptables)源地址网络转换–>将数据包做了一个源数据的修改,然后访问出去。
因为容器本身是不具备上网能力的,都是借助宿主机的网络来实现的,宿主机可以访问的地方容器都可以访问。
下节:
四、容器网络实现的核心技术:iptables
五、跨主机网络:实现docker 主机容器通信