网络模式 | 说明 |
---|---|
bridge | 为每一个容器分配、设置IP等,并将容器连接到一个dockr0。 虚拟网桥,默认为该模式 |
host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 |
none | 容器有独立的network namespace,但并没有设置网络。 |
container | 一个容器借用另一个容器的网络,即两个容器公用一个网络 |
命令 | 说明 |
---|---|
docker network ls | 查看当前所有的网络 |
docker inspect t1|tail -n 20 | 查看name为t1的容器的网络(只需要查看前20行就可以了) |
命令操作:
docker network ls
docker network inspect bridge
对于xxx.xxx.xxx.xxx/16或者xxx.xxx.xxx.xxx/24。那么这个斜杠后面的数字代表什么意思呢?
实际上,IPv4地址是由32位二进制数组成的。以192.168.0.0/16为例,它的二进制表示是11000000.10101000.00000000.00000000。
/16表示前16位是网络地址,后16位是主机地址,即从11000000.10101000.00000000.00000000到11000000.10101000.11111111.11111111,
所表示的IP地址范围是从192.168.0.0到192.168.255.255,其中最后一个地址为广播地址,因此可用IP地址数量为65534。
如果是/24,它表示前24位是网络地址,后8位是主机地址。
例如,192.168.0.0/24表示的IP地址范围是从11000000.10101000.00000000.00000000到11000000.10101000.00000000.11111111,
所表示的IP地址为192.168.0.0到192.168.0.255,其中最后一个地址为广播地址,因此可用IP地址数量为254。
172.17.0.0/16代表的网络IP范围为172.17.0.0 - 172.17.255.255
最后一个172.17.255.255:是作为广播地址的,不能使用其作为容器IP。
docker inspect t1|tail -n 20
注意:docker容器启动时,默认是桥接(bridge)模式,此时每个容器内部都会分配一个不同的IP地址,并且这个地址随着启动的顺序不同,是会变化的。
这个给跨容器访问带来了问题。有可能之前连接的IP地址发生变化了。那么解决的方法就是可以使用name名称访问。
Host表示整个宿主机,在宿主机内部,有自己的网卡eth0。
然后docker又创建了一个桥接网络,类似于路由器。
在路由器上定义了网关,以及内部IP网段地址,类似于路由器提供了很多个网口veth。
然后每个容器内部会有一个独立的虚拟网卡eth0连接到路由器的每个网口veth上,从而在虚拟机内部的所有容器处在同一个虚拟网段中,这样彼此之间就可以互相访问。
启动两个tomcat容器实例。
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
在宿主机中查看ip addr
,可以看到网卡88:vethefec9eb@if87
和90: vethd13f1d2@if89
通过docker exec -it tomcat81 bash
进入到容器tomcat81内部,查看网络
通过docker exec -it tomcat82 bash
进入到容器tomcat82内部,查看网络
通过以上网络详情可以看到,以下匹配关系:
宿主机88: vethefec9eb@if87 ==> 容器tomcat81:87: eth0@if88:
宿主机90: vethd13f1d2@if89 ==> 容器tomcat82:89: eth0@if90:
宿主机的虚拟网卡docker0上存在veth和容器的eth0的一对一关系。
Host表示整个宿主机,在宿主机内部,有自己的网卡eth0。
然后docker容器直接使用宿主机的网卡eth0。
#带端口映射的
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
host模式在启动时,由于我们设置了端口映射,会出现警告信息,表示当使用host网络模式时,指定的端口映射规则无效。
在上面的图片也可以看到没有端口映射发生,此时端口号以主机端口号为主,如果重复时,则递增。
#不带端口映射的
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
当使用不带端口映射的host模式启动时,就不会有警告信息了。
#查看容器的网络配置信息
docker inspect tomcat83
容器内部访问网络时,发现与宿主机的网络配置一模一样,它其实就是使用的是宿主机的网络环境。
所有我们在访问tomcat时,直接使用宿主机的网络配置。
在none模式下,容器内部没有任何网络配置,只有一个lo(localhost),即禁用网络功能。
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
因此,通常情况下不使用。
错误应用:tomcat
这是一个特殊的网络模式,如果启动两个tomcat容器,会出现报错信息。即tomcat应用不能使用该模式。
docker run -d -p 8085:8080 --name tomcat85 billygoo/tomcat8-jdk8
docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8
发生错误的原因是tomcat85和tomcat86公用同一个IP同一个端口,导致端口冲突。
成功应用:Alpine Linux应用,非常轻量级的linux,只有6M大小。
docker run -it -d --name alpine1 alpine /bin/sh
docker run -it -d --name alpine2 --network container:alpine1 alpine /bin/sh
可以看到alpine2和alpine1使用相同的网络设备,并且都是桥接模式。
注意:由于alpine2使用的是alpine1的网络设备,当容器alpine1停止后,alpine2将没有网络设备可以使用了。
问题:docker重启容器,容器内部的IP地址会发生变化。
解决方案:可以通过指定容器服务名来访问。
# 创建自定义网络
docker network create netshare
# 加入自定义网络
docker run -d -p 8081:8080 --network netshare --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network netshare --name tomcat82 billygoo/tomcat8-jdk8
加入相同的自定义网络中后,在tomcat81容器内部ping tomcat82 或者tomcat82容器内部ping tomcat81 都可以相互ping通对方。
这样解决了ip地址发生变更的问题。