docker再启动后会生成一个docker0虚拟网桥(172.17.0.1)
作用:
查看docker network COMMAND 有那些
docker network ls :查看网络
docker network create :创建网络
docker network rm 网络名称 :删除网络
docker network inspect 网络名称 :查看网络数据源
docker network prune :删除无用网络(同删除虚玄镜像)
Docker服务默认会创建docker0网桥,它在内核层
连通了其它物理网卡或虚拟网卡,这就使得所有容器和本地主机都放在同一个物理网络,Docker默认指定了docker0接口的物理地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
项目 | Value |
---|---|
bridge | 为每一个容器分配、设置ip等,并将容器连接到docker0 ,虚拟网桥,默认为该模式 |
host | 容器将不会虚拟出自己的网卡,不会配置自己的ip,而是使用宿主机的ip后端口 |
none | 容器有自己独立的 Network Namespace ,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,ip等。 |
container | 新创建的容器不会创建自己的网卡和配置自己的ip,而是指定一个容器共享ip、端口范围等。 |
通过 docker network inspect bridge 查看网络数据源
[
{
`"Name": "bridge",`
"Id": "8efcf11d822355fcbb9d7660e7078b015005c7b433f3cfa4e2cf467f1fb2350a",
"Created": "2023-04-01T15:12:08.63260771+08:00",
`"Scope": "local",`
`"Driver": "bridge",`
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"060b497506e3f1a2f8ced8fc69ca9b58da0e1a8d6dbea6a27411869422c0f4e8": {
"Name": "linux",
"EndpointID": "7a3fee4ccc9bedea90a4775e0ed5d6cede5e351f544d0639ea95208835aa8d1e",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"243e68780a6ebc59f6aaeeee641f4ab0053085fd8ab392ceb53929f0bb5950b7": {
"Name": "confident_lumiere",
"EndpointID": "3dfdbcbcc8d61e1257d72fb5fa95e30d421478ad7b16cdad378faa97d6bbc552",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
`"com.docker.network.bridge.name": "docker0",`
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge。
网桥docker0创建一对对等虚拟设备接口,一个叫veth,一个叫eth0,成对匹配。
eth0与veth相当于一个数据线的两个接口,一段连接容器,一段连接网桥(网桥与宿主机网络ens33连接),
容器就通过这根数据线实现网络连接,这根数据线得两个接口是成对匹配的。
直接使用宿主机的ip地址与外界通信,不再使用网桥进行网络地址转换。
冗余使用(警告):下面命令是因为已经使用了宿主机的ip地址,不需要做端口映射
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
通过docker ps查看启动的tomcat确实也没有端口映射
正确使用:
docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
在none模式下,不会为容器配置任何网络设置,如ip,网卡、路由等,只有一个lo,需要我们自己手动配置。
禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
新建的容器与指定容器共享一套网络ip配置,新建的容器不会创建自己的网卡,配置ip。
注:
部门容器ip、端口是不能共享的,如tomcat,这样不能共享的容器在启动时就会报错。
docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
当被指定共享的容器停止时,新建容器内的共享的网络配置也会消失。
实行容器间的互联互通,我们发现在同一个网络(bridge)使用ip能ping同对方,但使用实例名却无法ping通。
但是这容器中很难保证ip不被改动,也不可能一直去更改配置。使用自定义网络通过实例名互联就能解决这一问题。
新建一个网络
docker network create linxi_network
将启动的容器使用自定义的网络(–network 指定网络名)
docker run -d -p 8081:8080 --network linxi_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network linxi_network --name tomcat82 billygoo/tomcat8-jdk8