Docker基础教程(4)-网络模式详解

什么叫作docker网络

什么是Docker网络呢?总的来讲,网络中的容器们能够相互通讯,网络外的又访问不了这些容器。具体来讲,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会经过容器的IP直接去通讯,又能保证在这个集合外的一些容器不可以经过这个容器IP去通讯,能作到网络隔离。网络这个概念是由网络的驱动去建立、管理的。网络的驱动又分为全局的和本地的,全局的意思是这个网络能够跨主机,不必说个人两个容器非要在一个主机上才能经过这个网络去通讯,我能够在不一样主机上仍是经过容器的IP相互通讯linux

Docker基础网络模式

bridge网络模式

bridge网络是docker的默认网络模式,在Docker守护进程启动时,docker会建立一个叫作docker0的虚拟网桥,咱们使用ifconfig便可发现该网桥docker

[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,记得要绕过代理获取真实的ipwindows

再建立一个docker容器后,docker0的ip为默认的网关,并在主机上建立一对网卡,一个叫作eth0放在容器内做为容器的默认网卡,一个叫vethXXX相似的名字放在主机中,而且加入到docker0网桥之中,而后给该容器分配一个对应的ip 通常选择172.17.0.0/16的ip分配给各个容器bash

那么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等。  不参与网络通讯,运行于此类容器中的进程仅能访问本地回环接口;仅适用于进程无须网络通讯的场景中,例如:备份、进程诊断及各类离线任务等tcp

host网络模式

host模式是容器与Docker主机共享同一网络命名空间(namespace),Docker主机的网络协议栈、路由表、iptables规则、网卡、IP、端口等等都是共享的。容器跟宿主机都在同一网络视图下。这个模式很好的解决了容器与外界通讯地址转换的问题,能够直接使用宿主机的IP进行通讯,那么这里的网络流量和压力走的都是宿主机的网卡,性能会比较高。不过这个有风险,由于容器跟宿主机是共享一套网络机制,没有隔离。那么会引发网络资源与宿主机的竞争和冲突关系。规模小的场景,能够使用这种模式。主机网络驱动程序仅适用于Linux主机,不支持Windows及Mac平台。性能

container 网络模式

这个模式指定新建立的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新建立的容器不会建立本身的网卡,配置本身的 IP,而是和一个指定的容器共享 IP、端口范围等。一样,两个容器除了网络方面,其余的如文件系统、进程列表等仍是隔离的。两个容器的进程能够经过 lo 网卡设备通讯ui

感谢阅读spa

有兴趣能够关注个人我的微信公众号,会按期推送关于Java的技术文章,并且目前不恰饭都是干货哈哈哈哈

小阿宅Java
相关文章
相关标签/搜索