什么叫做docker网络
什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器。具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容器的IP直接去通信,又能保证在这个集合外的一些容器不能够通过这个容器IP去通信,能做到网络隔离。网络这个概念是由网络的驱动去创建、管理的。网络的驱动又分为全局的和本地的,全局的意思是这个网络可以跨主机,没必要说我的两个容器非要在一个主机上才能通过这个网络去通信,我可以在不同主机上还是通过容器的IP相互通信
Docker基础网络模式
bridge网络模式
bridge网络是docker的默认网络模式,在Docker守护进程启动时,docker会创建一个叫做docker0的虚拟网桥,我们使用ifconfig即可发现该网桥
[root@hyb 00]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether 02:42:e4:f5:21:0f txqueuelen 0 (Ethernet)
RX packets 13283505 bytes 7512128044 (6.9 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9775175 bytes 4471271028 (4.1 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到该网桥的ip为172.17.0.1(linux 默认宿主机的虚拟网桥ip,mac,windows下有所不同),当你每创建一个容器后,都会连接到这个虚拟网桥中,可以理解成一种网络代理,所以你在项目中获取ip的时候,如果直接获取ip可能获取到的就是172.17.0.1,记得要绕过代理获取真实的ip
再创建一个docker容器后,docker0的ip为默认的网关,并在主机上创建一对网卡,一个叫做eth0放在容器内作为容器的默认网卡,一个叫vethXXX类似的名字放在主机中,并且加入到docker0网桥之中,然后给该容器分配一个对应的ip 一般选择172.17.0.0/16的ip分配给各个容器
那么docker的端口映射是怎么实现的呢,首先我们要了解一下iptables,iptables是防火墙的一部分,也可以做转发和拒绝的策略,有兴趣的同学可以单独去了解,docker的端口映射就是用iptables来实现,我们可以运行命令iptables -t nat -vnL查看,运行后在最下方可以找到一段
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:9797 to:172.17.0.2:873
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2222 to:172.17.0.2:22
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:50000 to:172.17.0.3:50000
16721 700K DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.3:8080
从上面的代码中可以看到 我们外网请求的tcp,dpt协议的请求,都被对应的转发到172.17.0.0/16中的对应子网中,这样就是实现了端口的转发
none 网络模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有lo 网络接口。需要我们自己为Docker容器添加网卡、配置IP等。 不参与网络通信,运行于此类容器中的进程仅能访问本地回环接口;仅适用于进程无须网络通信的场景中,例如:备份、进程诊断及各种离线任务等
host网络模式
host模式是容器与Docker主机共享同一网络命名空间(namespace),Docker主机的网络协议栈、路由表、iptables规则、网卡、IP、端口等等都是共享的。容器跟宿主机都在同一网络视图下。这个模式很好的解决了容器与外界通信地址转换的问题,可以直接使用宿主机的IP进行通信,那么这里的网络流量和压力走的都是宿主机的网卡,性能会比较高。不过这个有风险,因为容器跟宿主机是共享一套网络机制,没有隔离。那么会引起网络资源与宿主机的竞争和冲突关系。规模小的场景,可以使用这种模式。主机网络驱动程序仅适用于Linux主机,不支持Windows及Mac平台。
container 网络模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信
感谢阅读
有兴趣可以关注我的个人微信公众号,会定期推送关于Java的技术文章,而且目前不恰饭都是干货哈哈哈哈