学习k8s必须学习docker容器网络

docker容器网络详解

一、四种网络模式
二、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,也是为了解决网络命名空间之间的隔离。容器默认是可以与外部访问的,那么数据包是怎么从容器中出去的呢?答:是容器中的默认路由
学习k8s必须学习docker容器网络_第1张图片

* ip route //查看路由

默认路由除了本机的ip之外,都会走这个默认路由,进入到eth0网卡,eth0就是veth的另外一段,docker0是这一端。veth和eth0一样也在宿主机上:

* ip route //查看默认网络

标红地方是docker创建的两个默认桥接路由
在这里插入图片描述

* brctl show docker0 //查看网桥的另一端veth接口名称

这个veth就相当于一个二层交换机,网桥的作用,只用于数据的转发。容器网络中访问的工作原理:

学习k8s必须学习docker容器网络_第2张图片

* docker run -d -p 88:80 nginx //在宿主机上暴露一个端口88映射到容器的80端口
	* 测试访问:ip:88

从外部访问容器,数据包是如何传输的?
答:首先client发送一个请求,数据包先到达宿主机上的网络协议栈内,进来之后–>经过DNAT(iptables层实现,做了网络地址转换)–>将数据包转换给docker0,到网桥上走二层,(基于arp协议来获取对方的mac地址来通信,做一个ip地址广播,然后记录ip地址与mac地址的关系,下次如果再有相同的请求包,直接根据自己的mac地址表转换)–>然后veth来决定是与哪个容器网络通信,然后再走veth的另一端–>转发到容器中–>流入容器之后,会对这个数据包解封装,确定是自己的,再去处理。

学习k8s必须学习docker容器网络_第3张图片

容器访问外部,数据包怎么传输?
答:数据包首先会从eth0出去–>出去之后到达宿主机(veth)–>连接到网桥里面docker0,docker0将数据包转发,然后通过SNAT(iptables)源地址网络转换–>将数据包做了一个源数据的修改,然后访问出去。

因为容器本身是不具备上网能力的,都是借助宿主机的网络来实现的,宿主机可以访问的地方容器都可以访问。

下节:
四、容器网络实现的核心技术:iptables
五、跨主机网络:实现docker 主机容器通信

你可能感兴趣的:(k8s+docker详解,容器,centos,运维,docker)