Docker 网络
当你开始在项目中使用Docker时,你会发现需要了解很多关于网络的知识。安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host
网络模式 | 简介 |
---|---|
Host | 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 |
Bridge | 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。 |
None | 该模式关闭了容器的网络功能。 |
Container | 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。 |
我们还可以自定义网络
Docker network介绍
Docker 网络命令介绍
connect # 命令是用于将docker容器连接到某个网络中,或者与其他容器建联,容器可以使用容器名或者容器ID。
create # 不指定网络驱动时默认创建的bridge网络
disconnect # 命令用于断开容器的网络。容器必须运行才能将其与网络断开连接。
inspect # 查看网络内部信息
ls # 列出所有的网络
prune # 命令用于删除所有未使用的网络。未使用的网络是不被任何容器引用的网络。
rm # 命令用于删除一个或多个网络。按名称或标识符删除一个或多个网络。 要删除网络,必须要先断开连接到它的任何容器的网络。
列出Docker 的所有的网络信息
Bridge 模式
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥
启动Nginx服务
docker run -d -p 80:80 --name mynginx nginx
查看窗口网络服务
docker inspect mynginx
"NetworkSettings": {
"Bridge": "",
"SandboxID": "b3bd9726a5e739a3a1b904862c25d3dde91ada092e1b1518881e5e6993d62d18",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "80"
}
]
},
"SandboxKey": "/var/run/docker/netns/b3bd9726a5e7",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "d79b21bca9e89d71b3a029d3b2d699653fe4116b82467650e6ad5bf4af4ad234",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "616cfb54870fa17070f2199b1a6764936f3cc28e61d4f8cece629af9c324cf80",
"EndpointID": "d79b21bca9e89d71b3a029d3b2d699653fe4116b82467650e6ad5bf4af4ad234",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
在centos下ping容器内的ip地址
Docker完成以上网络配置的过程大致是这样的:
(1)在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
(2)Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。
(3)从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
自定义网络
自定义网络命令:docker network create
docker network create --driver bridge --subnet 172.28.0.0/16 --gateway 172.28.0.1 mynet
# 解析:
--driver bridge # 表示使用桥接模式
--subnet 172.28.0.0/16 # 表示子网ip 可以分配 172.28.0.2 到 172.28.254.254
--gateway 172.28.0.1 # 表示网关
mynet # 表示网络名
查看自定义网络信息
docker network inspect mynet
使用自定义网络创建容器
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
再次查看,发现自定义网络中已经维护好网络关系
网络测试
- 使用自定义网络 ping 容器的 ip 地址和名称都能 ping 通(不使用–link也可以ping通名字)
- 我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
- 好处:不同的集群使用不同的网络,保证集群是安全和健康的