一、Docker网络是什么
virbr0:
在centos7的安装过程中如果有选择相关虚拟化的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址virbr0网卡(virbr0网卡:它有一个固定的默认ip地址:192.168.122.1),是做虚拟机的网桥的使用,其作用是为了连接其上的虚机网卡提供NAT访问外网的功能。
我们安装linux时,勾选安装系统的时候附带了libvirt服务才会生成的一个东西,如果不需要可以将libvirt服务卸载。
yum remove libvirt-libs.x86_64
docker network ls
安装完docker会默认创建3大网络模式
我们来查询一下docker网络相关的一些命令
docker network --help
查询结果如下:
其中:
connect:连接网络
create:创建网络
disconnect:断开网络
inspect:查看网络数据源
ls:查看所有的网络
prune:删除所有无效不在使用的网络
rm:删除某一种网络
二、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
2、查询两个容器的网络
由于内容过多,我们需要的信息在最后20行,所以,我们只查最后20行
docker inspect c2 | tail -n 20
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
结论
docker容器内部的IP是有可能会发生改变的
4、bridge
Docker服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥互相通信。
查看bridge网络的详细信息,并通过grep获取名称项:
docker network inspect bridge | grep name
案例
一、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,此时两个容器的网络是互通的。
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
由此可见,宿主机与容器两两对应
5、host
直接使用宿主机的IP地址与外界进行通信,不需要额外进行NAT转换。
容器将不会获得一个独立的Network Namespace ,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,而是使用宿主机的IP和端口。
警告:
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
此时,出现一个如下图的警告:
原因:
docker启动时指定--network=host或者-net=host,如果还指定了-p映射端口,那这个时候就会有这个警告了,并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为准,重复时,则递增
解决:
解决办法就是使用docker的其他网络模式,例如--network=bridge,这样就可以解决问题,或者直接无视
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
执行此命令后,警告消失
我们看一下tomcat83的网络信息如下图,由于和宿主机共用ip和端口号,所以没自己的网关和地址
我们再来看下图tomcat81是bridge模式,有自己的网关和地址
我们再来进去tomcat83容器内部,看一下它的网络信息,如下图,和宿主机的网络信息显示一样
我们没有设置端口映射,那么怎么来访问tomcat83呢?
我们用宿主机的ip和端口访问一下,如下图,返回正常
标签:容器,--,宿主机,网络,网卡,Docker,docker
From: https://blog.51cto.com/u_15410237/6146024