Docker Nework网络管理及内核优化

1. Docker网络驱动类型

  A. bridge(默认网络驱动):多用于独立容器群中内部通信,容器和宿主机的网络是隔离的(需要通过IP地址),可以与宿主机通信从而实现与互联网通信功能;

  B. host:直接使用宿主机的网络,端口也使用宿主机的,移除了宿主机和容器群间的网络隔离,不能与外界网络通信;

  C. overlay(swarm集群中覆盖网络):提供多个docker守护进程管理容器间的通信能力,包括swarm服务之间、swarm服务和独立容器群之间以及独立容器之间,用于创建跨主机网络;

  D. macvlan:允许你给容器分配一个MAC地址,让他作为一个物理网络装置;

  E. none:无网络状态。

  注意:Docker在默认情况下,分别会建立一个bridge、host和none的网络

 

2. Docker0网络与evth-path技术

  A. 装有docker的服务器,在docker启动时会在宿主机上创建一个docker0网桥(使用ip addr查看),这实际上是使用Linux桥接,如果容器在docker run时没有指定网络模式的情况下都会挂载到docker0网桥上,这样容器就可以和宿主机或者容器之间通讯;

  B. 每启动一个容器,docker就会给容器分配一个ip,同时宿主机就会多一块网卡,这就是用到evth-path技术,它是一对的虚拟设备接口,网卡总是成对出现的,一端连着协议,一端彼此相连,所以evth-path充当一个桥梁;

  C. docker0就像是路由器,各个容器就是路由器下的设备,他们处于同一个网段内,可以相互ping通,这是靠evth-path技术实现的;

  D. docker网络的核心使用的是Linux的虚拟化技术,在容器内和docker0内分别建立一个虚拟网卡,再使用evth-pair技术进行连接,容器所有的网络接口都是虚拟的,而且虚拟的转发效率高;

  E. 容器间的网络通信:docker在两个互联的容器之间创建了一个安全隧道,而且不用映射它们的端口到宿主机上,在启动WEB容器的时候并没有使用 -p 和 -P 标记,从而避免了暴露WEB服务端口到外部网络上,注意只有容器自身允许的端口被访问,其余的访问需要暴露(expose)出来;

  F. 如果一个容器想要对外提供服务的时候,需要进行端口映射,端口映射将容器某个端口映射到docker主机端口上,那么任何发送到该端口的流量,都会被转发到容器中;

 

3. 自定义网络

  A. docker容器重启后,docker分配的ip地址会发生变化,因此最好不要用ip,而是使用服务名称来进行通讯,之前是通过--link来解决的,这个实际上是在容器内部hosts文件里配置了DNS,因为docker0不支持容器名,而自定义网络是支持容器名的;

  B. 虽然docker提供的默认网络使用比较简单,但是为了保证各容器间应用的安全性,在实际更推荐使用自定义的网络管理,使用docker network命令,可参考:Docker命令集合

  C. 自定义rhxy-bridge网络:docker network create -d bridge --gateway 172.19.0.1 --subnet 172.19.0.0/16 rhxy-bridge,注意自定义网关和网段是为了避免默认分配的与用户网络冲突,导致访问问题

 

4. IP地址0.0.0.0、127.0.0.1、172.17.0.1和localhost

  A. 0.0.0.0:在服务器上是指本机上所有的IPV4地址,在路由中是指路由表中没有找到完全匹配的路由的时候所对应的路由;

  B. 127.0.0.1:是本机回环地址中一个,相当于本地地址,寻址是不能把它发送到网络接口的;

  C. 172.17.0.1:docker默认虚拟地址;

  D. localhost:是一个域名,可以用它来获取运行在本机上的网络服务。

 

5. docker与iptables

  A. 默认情况下,Docker deamon会在启动容器的时候向iptables中添加转发的规则,即会创建一个filter chain -DOCKER,同时,docker利用这个规则向外暴露容器的端口,而且这个端口是所有机器都可以访问,如果不想这样可以设置ports参数或者创建容器时使用--iptables=false,故加访问限制添加在INPUT链是不生效的

  B. docker容器的跨网络隔离和通信是借助iptables机制;

  C. Docker链:处理从宿主机到docker0的IP数据包,自动添加在FORWARD链中;

  D. DOCKER-USER链:Docker启动时会加载DOCKER链和DOCKER-ISOLATION链中的过滤规则,但禁止在这两个地方修改过滤规则,如果用户要添加Docker的过滤规则,建议追加到DOCKER-USER链中,因为DOCKER-USER链中的过滤规则,优先于Docker默认创建的规则被加载,从而能够覆盖Docker在DOCKER链和DOCKER-ISOLATION链中的默认过滤规则,例如只允许192.168.0.0/16网段中IP访问容器:iptables -A DOCKER-USER -i docker0 ! -s 192.168.0.0/16 -j DROP。

  E. DOCKER-INGRESS链:利用自定义网络结合负载均衡器进行路由转发数据包;

  F. DOCKER-ISOLATION-...链:为了隔离不同bridge网络之间的容器,Docker提供了两个DOCKER-ISOLATION阶段实现

    DOCKER-ISOLATION-STAGE-1链:过滤源地址是bridge网络的IP数据包,匹配的IP数据包再进入DOCKER-ISOLATION-STAGE-2链处理,不匹配就返回到父链FORWARD;

    DOCKER-ISOLATION-STAGE-2链:进一步处理目的地址是bridge网络的IP数据包,匹配的IP数据包表示该IP数据包是从一个bridge网络的网桥发出,到另一个bridge网络的网桥,这样的IP数据包来自其他bridge网络,将被直接DROP,不匹配的IP数据包就返回到父链FORWARD;

   G. Docker 20.10.0版本以上,如果服务器上装有firewalld,并且开启iptables,docker会自动创建一个名称为docker的firewalld zone文件,并自动创建一些无感的端口映射,firewall-cmd --zone=trusted --change-interface=docker0 --permanent && firewall-cmd --reload。

 

  报错:container cannot be disconnected from host network or connected to host network

  解决方式:不能发布端口

  使用host网络记得将防火墙关闭

   6. Docker内核参数优化

    A. Docker内容器调优和宿主机Linux调优有区别的,如果容器不是以-net="host"方式启动的,那么它将有自己独立的网络堆栈,对于Linux内核版本低于3.12的有些配置直接无法修改。

 

可参考:Docker网络详解——原理篇

    Docker与iptables及实现bridge方式网络隔离与通信操作

    Docker容器重启报错

 

posted @ 2020-06-05 19:52  如幻行云  阅读(1641)  评论(0编辑  收藏  举报