Docker网络基础
docker不启动时,在虚拟机中输入ifconfig
- ens33:Linux虚拟机的地址
- lo:本地回环接口(local)
- virbr0:centos安装过程中如果选择虚拟化相关的服务,安装系统后会有virbr0网卡(固定默认ip地址:192.168.122.1),是做虚拟机网桥使用的,作用是为连接其上的虚拟网卡提供NAT访问外网的功能。
在Windows主机输入ipconfig
,通过VMnet8实现Windows与Linux虚拟机的网络共享。
docker启动后,Linux虚拟机输入ifconfig
,会多出来docker0
Docker 网络基础命令
查看docker网络模式命令
docker network ls
docker网络的作用:
- 容器间的互联和通信,以及端口映射
- 容器IP变动时可以通过服务名直接网络通信而不受影响
Docker的网络模式
网络模式 | 简介 |
---|---|
bridge | 为每个容器分配设置一个IP,并将容器连接到一个docker0虚拟网桥(默认为该模式) |
host | 容器将不会虚拟出自己的网卡、配置自己的IP,而是使用宿主机的IP和端口 |
none | 容器有独立的network namespace,但并没有对其进行任何网络设置,比如分配网桥、IP等 |
container | 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等 |
docker容器内部的IP是有可能发送变化的。在容器实例关闭,再重启后,它的IP可能会发送变化。
Docker的网桥网络模式(bridge)
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0
),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP。
同时Docker网桥是每个容器的默认网关,因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
docker run时,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig
,就可以看到docker0,自己create的network:eth0、eth1…代表网卡1、网卡2…,lo:127.0.0.1即localhost,ip addr
查看网卡的IP地址。
网桥docker0创建一对一对的虚拟设备接口,一个为veth,另一个为eth0,成对匹配。
整个宿主机的网桥模式都是docker0,类似于一个有一堆接口的交换机,每个接口叫veth。在每个容器内部也有一块网卡,每个接口叫eth0。
将宿主机上的所有容器都连接到docker0的内部网络上,每个容器在同一个网络下,会在这个网关下各自拿到分配的IP,此时各个容器的网络是互通的。
Docker的主机网络模式(host)
直接使用宿主机的IP地址与外界通信,不再需要额外的NAT转换。
容器将不会获得一个独立的network namespace,而是和宿主机共用一个network namespace。
容器将不会虚拟出自己的网卡,而是使用宿主机的IP和端口。
由于容器与宿主机共用网络,所以不需要端口映射。端口号会以主机端口号为主,重复时递增。
Docker的none网络模式
禁用网络功能,只有lo标识(127.0.0.1本地回环接口)
Docker的容器网络模式(container)
新建的容器和已经存在的一个容器共享一个网络IP配置,而不是和宿主机共享。
新建的容器不会创建自己的网卡、配置自己的IP,而是和一个指定的容器共享IP、端口范围等。
两个容器除了网络方面,其他的比如文件系统、进程列表等还是隔离的。
Docker自定义网络模式
使用默认的bridge模式,两个容器之间可以通过IP ping通。但是IP可能会发生变化,最好是可以通过服务名称ping通。默认的bridge模式不能实现通过服务名称ping通。所以需要自定义网络模式,因为自定义网络本身就维护好了主机名和IP的对应关系。
创建网络模式
新建容器加入新建的自定义网络中。
互相 ping 测试,可以通过tomcat81、tomcat82 ping通。