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/

你可能感兴趣的:(docker)