Docker 网络

docker安装并启动服务后,会在宿主机中添加一个虚拟网卡。

在Docker服务启动前,使用 ifconfig 或 ip addr 查看网卡信息:

●ens33或eth0:本机网卡
●lo:本机回环网络网卡
●可能有virbr0(CentOS安装时如果选择的有相关虚拟化服务,就会多一个以网桥连接的私网地址的virbr0网卡,作用是为连接虚拟网卡提供NAT访问外网的功能。如果要移除该服务,可以使用 yum remove libvirt-libs.x86_64)

使用 systemctl start docker启动Docker服务后,会多出一个 docker0 网卡。
image.png
作用:

● 容器间的互联和通信以及端口映射
● 容器IP变动时候可以通过服务名直接网络通信而不受到影响

Docker容器的网络隔离,是通过Linux内核特性 namespace和 cgroup 实现的。

docker网络命令


查看Docker网络模式:

  1. docker network ls

如果没有修改过docker network,则默认有3个网络模式:

●bridge
●host
●none

添加Docker网络:

docker network add xxx


删除Docker网络:’

docker network rm xxx


查看网络元数据:

docker network inspect xxx


删除所有无效的网络:

docker network prune

Docker 网络模式


Docker 的网络模式:
image.png
查看某个容器的网络模式:

# 通过inspect获取容器信息,最后20行即为容器的网络模式信息
docker inspect 容器ID | tail -n 20

docker0


Docker 服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为 docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥互相通信。

查看bridge网络的详细信息,并通过grep获取名称:
docker network inspect bridge | grep name


bridge模式


Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一个宿主机内的容器接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

docker run的时候,没有指定—network的话,默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig就可以看到docker0和自己create的network。

网桥docker0创建一对对等虚拟设备接口,一个叫veth,另一个叫eth0,成对匹配:

整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫 veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫做 veth pair)。

每个容器实例内部也有一块网卡,容器内的网卡接口叫做eth0。

docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
image.png

例如:

启动tomcat容器,进入tomcat容器后,执行** ip addr**,可以看到其网卡信息:

容器内的网卡为 eth0
@符号后面就是宿主机上对应的veth网卡的编号28
27: eth0@if28 ...............................


在宿主机执行 ip addr 查看宿主机网卡信息:

每个veth都有个编号:vethXXXXXX
@符号后面对应就是容器内的eth0网卡编号27

28: vethXXXXXX@if27  ................

host模式


直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行 NAT 转换。

容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network space。

容器将不会虚拟出自己的网卡,而是直接使用宿主机的 IP 和端口。
13、Docker网络 - 图4

如果在 docker run 命令中同时使用了 —network host 和 -p端口映射,例如:

docker run -p 8082:8080 --network host tomcat


那么会出现一个警告:

WARNING: Published ports are discarded when using host network mode


因为此时已经使用了host模式,本身就是直接使用的宿主机的IP和端口,此时的-p端口映射就没有了意义,也不会生效,端口号还是会以主机端口号为主。

正确做法是:不再进行-p端口映射,或者改用bridge模式

none模式


禁用网络功能。

在none模式下,并不为docker容器进行任何网络配置。进入容器内,使用 ip addr查看网卡信息,只能看到 lo(本地回环网络127.0.0.1网卡)。