Docker的网络用于容器间的互联和通信,以及宿主机端口映射,容器IP变动的时候可以设置网络直接使用服务名进行网络通信而不受影响。类似于虚拟机软件分配IP地址给各个安装的虚拟机以及物理机,虚拟机之间以及虚拟机和物理机之间可以相互通信。
1.查看容器的网络
1.查看容器网络类型
docker inspect命令查看关于Networks的部分
当前容器是bridge网络,网关是172.17.0.1, IP是172.17.0.2
2.查看当前有多少个docker网络
3.查看网络的情况
网络lzjnet的网络类型是bridge,还有IP等信息
2.Docker的网络类型
几种常见的网络类型
网络模式 | 简介 |
| 默认为该模式,为每一个容器分配和设置IP,并将容器连接到默认的虚拟网桥 |
| 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 |
| 容器有独立的network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等 |
| 新创建的容器不会自动创建自己的网卡和配置IP,而是和一个指定的容器共享IP和端口范围等 |
2.1 bridge网络
1.主机和容器联网
Docker服务默认会创建一个网桥(上有一个docker0的内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
2.容器之间联网
Docker启动一个容器时会根据docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关,因为在同一宿主机内的容器都接入同一网桥,这样容器之间就可以通过容器的Container-IP直接通信。
3.bridge网络的分配机制

docker run的时候,没有指定network的话,默认使用的网桥模式就是bridge(docker0)。在宿主机ifconfig就可以看见docker0和自己创建的网络(eth0, eth1.....),lo代表127.0.0.1。
网桥docker0创建一对对等的虚拟设备接口,一个叫veth,另一个叫eth0,成对匹配。
整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair)
每个容器内部也有一块网卡,每个接口叫eth0,docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
验证veth-pair:
查看正在运行的Docker容器
宿主机执行ip addr查看宿主机的网络情况
进入容器,一般需要先更新tomcat容器的yum,再安装工具iproute2
然后,在容器内执行ip addr查看容器的网络情况
然后可见宿主机的网卡 15: vethc5f3f03@if14 和容器网卡 14: eth0@if15两两匹配,互互相同
2.2 host网络
直接使用宿主机的IP地址与外界通信,不需要额外进行NAT转换。
容器将不再获得一个独立的网络名称空间,而是和宿主机共用一个网络名称空间,容器将不会虚拟出自己的网卡,而是使用宿主机的IP和端口,容器没有自己的IP。
这种模式下,使用-p端口映射是无效的,也是没有任何意义的。

2.3 none网络
等同于禁用网络功能,不为容器进行任何网络配置,容器没有网卡,路由等信息,只有一个本地回环网卡lo
2.4 container网络
新建的容器和一个已经存在的容器共享一个网络IP配置而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围等,同样,两个容器除了网络方面,其他的例如文件系统,进程列表等还是隔离的。

需要注意的是:
1.继承和被继承的容器的容器内端口不能是相同的,否则会导致冲突,因为两个容器共享网段和IP
验证:先启动一个tomcat容器tomcat86,该容器内的程序会占用容器的8080,在启动另一个tomcat容器tomcat87和前者共享网络,因为也是基于tomcat镜像,所以同样会占用容器的8080,两个容器端口范围是共享的,导致报错Error response from daemon: conflicting options: port publishing and the container type network mode.
2.被继承的容器结束运行后,继承它的容器也会失去网络功能,只剩下一个回环网卡lo
验证:先运行一个精简版Linux容器alpine1,在运行一个同样的容器alpine2,指定和alpine1共享网络,查看容器内网络可见网卡名称和IP地址都是完全一样的
关闭容器alpine1,进入容器alpine2查看IP,发现eth网卡跟着消失了,只剩下lo
2.5 自定义网络
为什么要自定义网络?
1.容器间的互联和通信以及端口映射
2.bridge模式网络分配给容器的IP是可能随着容器的启动关闭而导致分配的地址发生变动的,但是Docker自带的bridge网络比较简单,没有内置DNS功能,自定义网络后,容器IP变动的时候可以通过服务名直连网络而不受影响,当用户创建自定义网络时,Docker自动配置了一个内置DNS服务器,这个DNS服务器会根据容器的名称自动解析对应的IP地址。
自定义网络默认也是采用桥接模式bridge,只是功能比默认的那个更强,自然就维护好了容器名和IP的映射关系(DNS)
验证:
创建一个网络lzjnet
创建容器tomcat1 tomcat2,指定我们自己创建的网络,然后互PING
可以发现可以使用容器名相互PING通
3.总结
Docker可以使用4种网络模式来实现容器之间以及和宿主机的网络通信,自己实现自定义的网络桥接模式功能更强。
3127

被折叠的 条评论
为什么被折叠?



