Docker的网络模式
docker主要有四种网络模式
- host模式
- container模式
- brige模式
- none模式
在介绍四种网络模式之前,先介绍一下docker的隔离技术,docker是通过namespace来做隔离的,Docker容器是借助系统内核来进行安全性的隔离。即是通过namespace进行隔离、cgroup进行资源限制、capability进行权限限制。
docker基于linux内核当中这六个namespace来进行隔离
- uts命名空间 负责主机名和域名的隔离
- ipc命名空间 负责信号量,消息队列,共享内存等的隔离
- pid命名空间 负责进程pid编号的隔离 隔离进程
- network命名空间 负责网络资源的隔离 隔离网络
- mount命名空间 负责挂载点之间的隔离 隔离文件系统
- user命名空间 负责用户组 用户所属 密钥 特殊权限等的隔离
host模式
上面已经讲了docker的namespaces隔离机制,而对于host模式来说,那么这个容器将不会获得一个独立的network的namespace空间,但是文件系统和进程,ipc等还是隔离开来的,host模式运行的容器没办法虚拟出自己的网卡,配置自己的ip,而是使用宿主机的ip和端口。
例如我们再10.4.4.16这个宿主机上面用host模式起一个mysql的docker容器,占用3306端口,那么我们想要访问mysql直接用宿主机的ip和端口10.4.4.16:3306就可以访问到容器中的这个mysql了,不需要做任何的NAT转换
container模式
container模式和host模式有类似之处,这个模式是指这个docker和指定的某一个已经存在的容器共用一个network的命名空间,先创建的这个docker不会自己创建网卡,配置自己的ip,而是共用之前的容器的ip和端口。
brige模式
这个模式和前面的模式区别比较大,brige模式的docker容器拥有自己的network空间,但是,这个docker容器没有网卡,ip,路由等信息,需要我们自己为docker容器添加网卡,配置ip等。
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。 bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
例如我在docker里面起一个ngnix,使用容器里面的端口80,可以映射到我宿主机的33端口。那么我用宿主机的ip+33端口就可以访问到这个ngnix服务。
none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。