首页 > 其他分享 >5、Docker网络

5、Docker网络

时间:2023-03-23 23:32:21浏览次数:42  
标签:容器 -- 宿主机 网络 网卡 Docker docker

一、Docker网络是什么

virbr0:
在centos7的安装过程中如果有选择相关虚拟化的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址virbr0网卡(virbr0网卡:它有一个固定的默认ip地址:192.168.122.1),是做虚拟机的网桥的使用,其作用是为了连接其上的虚机网卡提供NAT访问外网的功能。
我们安装linux时,勾选安装系统的时候附带了libvirt服务才会生成的一个东西,如果不需要可以将libvirt服务卸载。
yum remove libvirt-libs.x86_64

208.png

docker network ls
安装完docker会默认创建3大网络模式

209.png

我们来查询一下docker网络相关的一些命令
 docker network --help
查询结果如下:
其中:
connect:连接网络
create:创建网络
disconnect:断开网络
inspect:查看网络数据源
ls:查看所有的网络
prune:删除所有无效不在使用的网络
rm:删除某一种网络

210.png

二、Docker网络能干嘛

1、容器间的互联和通信以及端口映射
2、容器IP变动时候可以通过服务名直接网络通信而不受影响

三、Docker的网络模式

网络模式 简介 使用
bridge 为每个容器分配、设置IP等,并将容器连接到一个 dcoerk0 虚拟网桥,默认为该模式 使用--network bridge指定,默认使用docker0
host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 使用--network host指定
none 容器有独立的NetWork namespace ,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接 ,ip等 使用--network none指定
container 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP,端口范围等 使用--network container指定:NAME 或者容器ID指定

1、先启动两个ubuntu

docker run -it --name c2 centos bash
docker run -it --name c3 centos bash

211.png 212.png

2、查询两个容器的网络

由于内容过多,我们需要的信息在最后20行,所以,我们只查最后20行
docker inspect c2 | tail -n 20

213.png

3、关闭c3容器,新建c4容器,查看ip变化

docker rm -f 容器id
docker run -it --name c4 centos bash
上面的网络情况:
c2:172.27.0.2
c3:172.27.0.3
我们删除掉c3容器后,增加c4容器,我们发现c4的容器ip就是之前c3容器的ip:c3:172.27.0.3

214.png 215.png 217.png

结论

docker容器内部的IP是有可能会发生改变的

4、bridge

Docker服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥互相通信。
查看bridge网络的详细信息,并通过grep获取名称项:
docker network inspect bridge | grep name

218.png

案例

一、Docker使用linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个ip地址,称为:Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能通过容器的Container-IP直接通信。
二、docker run的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0.在宿主机ifconfig,就可以看到docker0和自己ctreate的network  eth0,eth1,代表网卡一,网卡二,lo代表127.0.0.1,即localhost,inet addr 用来表示网卡的ip地址。
三、网桥docker0创建一对对等虚拟设备接口,一个叫veth,另一个叫eth0,成对匹配
	1、整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此连通(这样一对接口叫veth pair)
	2、每个容器实例内部也有一块网卡,每个接口叫eth0
	3、docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配
通过上述,将宿主机上的所有容器都连到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的IP,此时两个容器的网络是互通的。

219.png 220.png

docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
宿主机中:
veth:
28->27
30->29
tomcat81:
eth0:
27->28
tomcat82:
eth0:
29->30
由此可见,宿主机与容器两两对应

221.png 222.png 223.png 224.png

5、host

直接使用宿主机的IP地址与外界进行通信,不需要额外进行NAT转换。
容器将不会获得一个独立的Network Namespace ,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,而是使用宿主机的IP和端口。

225.png

警告:
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
此时,出现一个如下图的警告:
原因:
docker启动时指定--network=host或者-net=host,如果还指定了-p映射端口,那这个时候就会有这个警告了,并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为准,重复时,则递增
解决:
解决办法就是使用docker的其他网络模式,例如--network=bridge,这样就可以解决问题,或者直接无视

226.png

docker run -d  --network host --name tomcat83 billygoo/tomcat8-jdk8
执行此命令后,警告消失
我们看一下tomcat83的网络信息如下图,由于和宿主机共用ip和端口号,所以没自己的网关和地址
我们再来看下图tomcat81是bridge模式,有自己的网关和地址

227.png 228.png 229.png

我们再来进去tomcat83容器内部,看一下它的网络信息,如下图,和宿主机的网络信息显示一样

230.png

我们没有设置端口映射,那么怎么来访问tomcat83呢?
我们用宿主机的ip和端口访问一下,如下图,返回正常

231.png

标签:容器,--,宿主机,网络,网卡,Docker,docker
From: https://blog.51cto.com/u_15410237/6146024

相关文章