2019/08/01 docker网络(05)

本秂侑毒 提交于 2019-11-29 04:57:18

kvm时说过,在一台主机上,当需要运行多个kvm虚拟机的时候,网络构建方式有
最简单的方式就是提高桥,让两个对应的虚拟机实例只要连接到网桥,而且大家又能使用同一网络的地址,就可以通信了,这个个隔离网桥,仅用于内部通信,无法与外部主机通信
在这里插入图片描述
与宿主通信,可以在宿主机上把网桥当网卡来使用,配一个地址,意味着宿主机就能与两个实例通信了,这种仅实现了与当前主机通信,仅主机,host-only

要想与外部通信,可以在主机上创建一对网卡,一半在主机上,一半在桥上,把交换机就仅当交换机用,,交换机配了地址,将当做宿主机上的网卡,二代表宿主机的网卡与俩个虚拟机实例通信的网桥,
没有hostonly,
叫isolated 仅能够在一个桥上的主机进行通信
在这里插入图片描述
如果想要和其他主机通信不光是宿主机,两种方式,
nat,所有虚拟机实例网关都指向宿主机上的虚拟网卡,在宿主机上打开核心转发并添加snat规则,哪台桥,也依然是桥

在这里插入图片描述
**
第二种方式,是桥接,把这个桥和物理网卡直接建立关联关系,与物理网卡建立关联关系,把物理网卡当做交换机当桥,真正的桥当做网卡,对应的mac地址网卡来使用,所有的报文发给网卡,默认目标mac是到当前宿主机本身,送这网卡上
这个叫桥接,其实就是物理桥**在这里插入图片描述
使用容器的方式,功能是一样的,因为每一个容器是一个独立的虚拟机,除了没有自己的内核空间之外,其他功能与我们的虚拟机没什么不同,但是使用网络的方式也不一样
两个容器间通信可以使用隔离桥
也可以使用仅主机桥,能够 和宿主机进行通信
也可以使用nat桥,能够拥有内网地址,地址转换以后与外部主机进行通信,
也可以使用物理桥,让每一个容器直接拥有可以外部网络直接通信的地址,

事实上容器还有更多精巧的方式,因为毕竟容器只是通过网络名称空间隔离出来的,所以完全可以实现,
1.让容器使用物理机的名称空间,物理机有什么地址,容器有什么地址,共享,同一组网卡,同一组地址
在这里插入图片描述Docker is concerned with two types of networking:
ɝ single-host virtual networks 点击节点上的虚拟网络 使用方式和虚拟机上使用的方式非常相似
ɰ provide container isolation
multi-host networks
ɰ provide an overlay where any container on a participating host can have its own
routable IP address from any other container in the network

一共有四种形式的网络,不管哪种形式,默认的网络都是nat桥
默认桥docker0加了一堆规则,每一个容器启动起来后,都可以关联到docker0桥上,而且还能自动分配地址
在这里插入图片描述
docker拥有4种容器网络
第一种。closed container封闭式容器,没必要访问网络
第二种 bridge container 桥接式容器 (就是之前描述的,isolated,host-only,nat,phy bridge 这四种都是桥)
第三种 joined container 联盟式容器 (让 两个容器共享一个网络名称空间,两个容器使用同一个ip地址,第一个容器进程监听的端口第二个容器监听的端口就不能使用)为什么这么做
(一个允许tomcat一个运行mysql,由于在同一个网络名称空间,两个访问,就用不到接口的了和mysql通信了,使用unitsocket通信,更好性能)
第四种 开放式容器,直接使用宿主机的所有 网络接口,共享,使用同一个名称空间,可以直接修改宿主机的网络配置文件,太危险,不常用
在这里插入图片描述
docker既有单机的虚拟网络,又有多主机网络,如果运行两个docker主机,两个docker主机之上各自运行了虚拟机之间的互相通信在这里插入图片描述
两个docker之间容器的通信方式最简单的方式是用桥接,各自桥接以后都使用物理地址,彼此之间通信,如果使用一个nat会有 缺陷,两个主机之间仅物理网卡能通信,每一个背后的虚拟机网络都是私有网络,在物理机之间是无法被路由的,因为每一次访问都是地址转换后的结果,在这里插入图片描述
第二个主机想要访问另外内部的容器也访问不到,因为实在nat背后,nat的主要作用是隐藏,主要目的就是隐藏主机的,外部主机就不可能知道里面的私有网络的,除非配置静态路由,到达这个私有网络,必须把路由当做静态网关在这里插入图片描述
因此内部的任何主机服务想要在外部被访问,没什么可能性,除非打开核心转发,
如果不知道这层路由,要想让外部主机访问内部主机服务,DNAT
直接告诉别人,网卡有什么服务,当你访问tcp,宿主机本机不提供,而是转发给内部容器上面的进程,叫做端口暴露,相当于需要把某个端口暴露在外面,所以叫端口暴露,expose
说白了expose就是在上面做一个DNAT规则而已,暴露哪个服务,就把哪个端口做映射,不暴露别人就无法直接访问,暴露了,别人也以为你是宿主机提供的服务,意识不到背后主机的存在,
SNAT是吧别人请求拉回来的,而DNAT是别人来请求我们 的服务的,把我们的数据拉到别人那里去的,所以snat仅能让自己访问别人的服务,但是没法做到别人访问自己的服务
在这里插入图片描述
如果要两个容器直接通信,就需要构建一个二层网络,或者三层网络,到4层就不行,4层就只有端口了,要构建出一个二层网络来,做隧道,如果不桥接,就只能做隧道了,对第一个主机来讲,所有访问的非本地目标端口,也要在宿主机上把这个报文,2层的帧封装一个udp/tcp协议报文,源地址是自己目标地址是外部网络中的其他主机,比如到第二个主机上 ,第二个主机收到以后,拆分装,发现里面是一个帧,于是把帧移动到内部的虚拟网络桥,这个桥就基于目标mac地址来转发,如果恰好本地有虚拟机的mac地址,二者就能向在一个二层网络中一样来通信,这样二者就需要建立一个隧道,
这种基于四层报文来转发2层协议报文隧道,实现的网络模型,叫叠加网络,overlay network 隧道网络
不打算用nat和桥的方式来通信就只能这么构建
在这里插入图片描述
这是多主机docker彼此间通信的方式在这里插入图片描述
docker主机启动时默认就会直接创建好网络,networke list 能自动列出创建好的网络,启动docker-daemon以后,自动创建的三个网络
1.bridge 桥接口,默认docker0
在这里插入图片描述
inspect命令可以探测对应网络的详情在这里插入图片描述
显示出这个网络叫做bridge
driver驱动也是bridge
subnet 子网
ipv4地址已经分出去的
在这里插入图片描述
host表示主机的网络,宿主机的网络名称空间
在这里插入图片描述
相当于第四种,直接使用宿主机的网络
在这里插入图片描述
none表示没有网络,就是第一种容器,封闭容器在这里插入图片描述在这里插入图片描述
启动-net 为none就表示关闭了网络功能在这里插入图片描述
i在这里插入图片描述
NONE只有本机一个接口在这里插入图片描述
再启动,网络不是none,而是host,应该网络就是宿主机网络,这种就表示开放式容器在这里插入图片描述
bridge就加到docker0上了,自动获取到172.17.0.3地址,这就是net bridge的意思在这里插入图片描述
第四种,联盟式如何操作在这里插入图片描述
在这里插入图片描述可以启动一个对应的容器之后,用-net+选项,是container关键字冒号+另外一个容器名字,共享使用某个容器的网络在这里插入图片描述
先启动一个容器在这里插入图片描述
在另外终端上再启动一个容器在这里插入图片描述
甚至可以在这个容器上启动httpd在这里插入图片描述在这里插入图片描述
进程应该跑起来了在这里插入图片描述
第二个容器使用curl去访问 localhost主机在这里插入图片描述
意味着这两个容器其实是在同一网络名称空间
现在把两个容器都退出
在这里插入图片描述
默认的桥是docker0,关联到docker0就相当于关联到nat桥上,在这里插入图片描述作为用户来讲也可以创建其他桥,使用桥接接口如何去暴露端口在这里插入图片描述
可以从宿主机上给容器安装很多设定,启动容器的时候,直接设定主机名在这里插入图片描述
直接指定你的容器地址当作dns服务器
在这里插入图片描述
直接为容器内部的//etc/hosts添加解析记录在这里插入图片描述
主机名是 bbox1.XXX.COM --dns dns服务器地址 172.16.0.1 --add-host添加主机名解析,www,magedu.com对应的主机是172.16.0.1
所以这些启动容器时可以指定很多网络属性,可以理解为注入
在这里插入图片描述
第二组在这里插入图片描述在这里插入图片描述在这里插入图片描述
如果在第一个容器启动httpd,监听在80端口,但是整个80端口只能在172网络访问,想让外部其他主机访问,只能做端口映射,如果两个容器各自在网络名称空间,都想要对外面进行映射,宿主机的80端口只有一个,就只能放在其他端口了,因为网络名称空间对于宿主机来讲只有一个,为宿主机上每个容器都准备一个专门的ip,8080映射一个容器,9080再映射另外一个容器
只能使用非标准端口映射
用个简单的方法直接指明把哪个端口暴露到宿主机上,会自动帮你生产iptables规则,这就是i暴露端口时的专用选项,-p来实现
在这里插入图片描述
帮你生成规则的四种方式
-p选项的使用格式
-p 直接指定将哪个容器端口暴露出去
将指定的容器端口映射至主机所有地址的一个动态端口
-p :
将容器端口映射至指定的主机端口
ɝ -p ::
ɰ 将指定的容器端口映射至主机指定的动态端口
ɝ -p ::
ɰ 将指定的容器端口映射至主机指定的端口
ɝ “动态端口”指随机端口,具体的映射结果可使用docker port命令查看

-p80 把当前主机的80端口暴露出去在这里插入图片描述
可使用docker port命令查看bbox1暴露哪个端口,32768端口在这里插入图片描述
换一个有网页的镜像在这里插入图片描述
表示端口80已经暴露出去了,现在访问宿主机的非标准端口就可以访问网页了在这里插入图片描述‘这种暴露无非就是自己给你生成了iptables
自定义docker链target
如果访问32769端口就转发到17.0.3:80

在这里插入图片描述
但是宿主机就像暴露80,不想随机在这里插入图片描述
指定宿主机锻炼和容器端口
在这里插入图片描述
先关闭再重新创建在这里插入图片描述
从80到80在这里插入图片描述
现在就可以直接访问80了在这里插入图片描述
如果对于宿主机来讲,端口可以随机但,ip不能是0.0.0.0,之前是所有地址80在这里插入图片描述在这里插入图片描述
前面给定地址::,端口没指表示端口是随机的在这里插入图片描述在这里插入图片描述在这里插入图片描述
既要绑定地址又要绑定端口在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
来-p指定的命令来帮你生成DNAT规则,从而内部主机服务就能被暴露出去了,expose
如果想要暴露多个端口
在这里插入图片描述
就暴露了三个端口在这里插入图片描述在这里插入图片描述
要想每一个都指定在这里插入图片描述在这里插入图片描述
可以同时暴露多个端口
在这里插入图片描述
也可以这么做在这里插入图片描述
-P大写 expose暴露,指明一个端口

docker默认使用172.16.0.0网络,想使用别的网络在这里插入图片描述
**docker deamon有一些选项,-b 表示启动容器时,默认使用的桥是哪一个
-bip 默认的桥打算使用哪个地址,
fixed-cidr 指明ipv4的网络地址
**在这里插入图片描述
容器默认的网关

在这里插入图片描述
容器默认的dns服务器
在这里插入图片描述在这里插入图片描述
在docker启动时对应有一些选项
在这里插入图片描述在这里插入图片描述https://docs.docker.com/engine/reference/commandline/dockerd/在这里插入图片描述
不保存退出在这里插入图片描述https://docs.docker.com/engine/reference/commandline/network_ls/
能列出当前已有的docker网络在这里插入图片描述在这里插入图片描述
创建网络https://docs.docker.com/engine/reference/commandline/network_create/在这里插入图片描述
可分配的地址池在这里插入图片描述
基于文件来读取
在这里插入图片描述
设置一个网络的元数据属性
在这里插入图片描述
示例,创建出一个docker桥在这里插入图片描述在这里插入图片描述
iprange 获得的地址范围 桥的名字时mbr0在这里插入图片描述
使用了一个随机名称来给接口命名
gateway是什么就把桥接口地址设置成什么
在这里插入图片描述
跑一个容器在这里插入图片描述在这里插入图片描述
相当于在docker主机上,又新增了一个虚拟网桥,让docker实例加入到桥
connect可以让容器连接到另外的桥在这里插入图片描述https://docs.docker.com/engine/reference/commandline/network_connect/在这里插入图片描述在这里插入图片描述
可以换个桥在这里插入图片描述
就多加了网卡在这里插入图片描述https://docs.docker.com/engine/reference/commandline/network_disconnect/
拆除网卡在这里插入图片描述
把刚才的网卡删除在这里插入图片描述在这里插入图片描述在这里插入图片描述
**叠加网络,驱动方式还有另外一种,overlay
**https://docs.docker.com/engine/reference/commandline/network_create/在这里插入图片描述
*直接指明叠加网络
–subnet=192.168.1.0/25
–subnet=192.170.2.0/25
–gateway=192.168.1.100
–gateway=192.170.2.100
my-multihost-network 多主机网络
–aux-address=“my-router=192.168.1.5” --aux-address=“my-switch=192.168.1.6” \ 辅助地址
–aux-address=“my-printer=192.170.1.5” --aux-address=“my-nas=192.170.1.6” *

叠加网络等于更大的子网,包含了192.168.1.0/25和192.170.2.0/25
驱动除了桥接还有叠加网络SDANT
在这里插入图片描述
此处重点时端口暴露方式在这里插入图片描述
暴露以后该怎么配置在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!