关于docker:Docker容器网络概述

凋谢容器端口

当应用docker create或者docker run创立并运行一个容器的时候,默认不会凋谢容器端口。
能够应用--publish或者-p选项来凋谢容器的端口,这时Docker就会创立一条防火墙规定,将宿主机的端口和容器的端口关联起来,宿主机的这个端口接管和收回的所有数据都会被转发到容器的端口中,这样的话外界或者宿主机上的其余容器和过程就能够通过宿主机的端口拜访容器的端口。
将容器的端口凋谢其实是一种不平安的行为,如果只是想让同一台宿主机之间的容器能够通过网络互相通信的话,不须要凋谢它们的端口,只须要借助Docker网络(Docker Network)即可。

Docker网络(Docker Network)

Docker能够创立各种类型的虚构网络,例如能够是bridge网络,也能够是overlay网络等等。
能够通过docker network创立、查看以后宿主机上的Docker Network,让一个容器退出Docker Network等等。
一个容器能够退出多个Docker Network。

容器在Docker网络中的IP地址和hostname

默认状况下,当一个容器退出了一个Docker Network之后,Docker会主动调配给这个容器一个IP地址。也能够在容器退出Docker Network的时候,指定一个ip地址给它。
容器的hostname默认是该容器的ID。也能够在容器退出Docker Network的时候指定一个hostname给它。

DNS服务

默认状况下,Docker会通过bind mount的形式把宿主机的\etc\resolv.conf挂载到每一个容器中去。因而,每一个容器的DNS配置都和宿主机的是一样的。
如果容器退出的是用户通过docker network create创立进去的自定义网络,那么容器将会应用的Docker内置的DNS服务器,内置的DNS服务器将会把内部IP地址的查找转发给宿主机上配置的DNS服务器。
也能够在docker create或者docker run的时候指定容器的DNS配置。
须要留神的是:容器并不会共享宿主机上的\etc\hosts文件,能够在运行docker run时指定要退出容器的\etc\hosts文件中的内容。

Docker Network Drivers

Docker反对以下不同类型的Docker Network:

Network Driver Descript
bridge 应用docker network create创立网络时创立进去的默认网络类型。当同一台宿主机上的多个容器之间须要互相通信的时候,通常会应用这种网络。在这种网络中的容器无奈和宿主机以及别的网络的容器进行通信
host 将宿主机和容器之间相连接的网络类型,容器能够间接应用宿主机的网络
overlay 将多个Docker daemon连贯在一起,容许Swarm服务和容器跨节点(主机)进行网络通信
ipvlan 这种网络容许用户对IPv4和IPv6的寻址有着齐全的管制
macvlan 容许将一个MAC地址调配给容器,Docker daemon会依据容器的MAC地址对数据进行路由。一般来说这种类型的网络用于部署那些古老的遗留应用程序,这些程序面向的是物理网络开发,而不是网络协议栈
none 将一个容器和宿主机以及其余容器齐全隔离开来的网络类型,这种网络在Swarm服务中不可应用

代理服务器

能够给Docker Client或者Docekr Daemon设置代理服务器(proxy server)。

包过滤

当把某一个容器的端口凋谢了之后,为了平安起见个别会须要对这个端口的数据包进行过滤。在Linux中,Docker是通过iptables规定来进行包过滤的。
Docker会在iptables中插入两条iptables chain,别离叫做DOCKER-USERDOCKER,并且会保障所有的网络包都会先通过这两个chain的查看,它们都属于FORWARD chain的一部分。
所有容器的iptables规定都会被主动退出到DOCKER chain中。
不要手动增加或批改或删除DOCKER chain中的内容,然而能够向DOCKER-USER chain中增加规定,这些规定会比DOCKER chain中的规定优先级更高。事实上,Docker总会保障在FORWARD chain中,DOCKER-USER chain的优先级是最高的,其次就是DOCKER chain,其余的iptables chain中的规定,不论是手动增加的,还是防火墙增加的,优先级都不会比它们两个高。

防火墙

如果运行Docker的零碎应用了firewalld并且开启了--iptables,Docker就会主动创立一个名为dockerfirewalld zone,并把所有由Docker创立的网络接口(例如docker0)放入到这个zone外面。
Debian和Ubuntu自带的防火墙ufw应用的是iptables外面的INPUTOUTPUT chain,而Docker会在nat表中解决容器的网络流量,因而Docker容器的流量实际上并不会通过ufw的过滤。

参考资料

https://docs.docker.com/network/