1、常用的网络模式
Docker 容器的网络默认与宿主机、与其他容器都是相互隔离。
1.1、host
使用主机的网络命名空间,这意味着容器与主机共享同一个IP地址和端口号。使用host网络可以提高容器的网络性能,但是会降低容器的隔离性(容器直接使用宿主机网络栈的方式)。
实际上是被隔离在它自己的 Network Namespace 当中的。网卡(Network Interface)、回环设备(Loopback Device)、路由表(Routing Table)和 iptables 规则。对于一个进程来说,这些要素,构成了它发起和响应网络请求的基本环境。需要指出的是,作为一个容器,它可以声明直接使用宿主机的网络栈(–net=host),不开启 Network Namespace。
这个容器启动后,直接监听的就是宿主机的 80 端口。 docker run -it -d --net=host --name nginx-host nginx:latest docker run -it -d --net=host --name nginx-host01 nginx:latest
1.2、none
none 网络就是什么都没有的网络,一些对安全性有求高并且不需要联网的应用可以使用 none 网络。
比如:某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。
docker network list docker run -it -d --net=none --name nginx-none01 busybox:latest docker exec -it nginx-none01 sh ip a exit;
1.3、bridge
是Docker默认的网络类型,使用Docker守护进程创建一个虚拟的网桥,它将容器连接在同一个网络上。通过bridge网络,Docker将为容器分配一个IP地址,并为它们提供DNS解析服务。容器之间可以使用容器名称或IP地址进行通信。
是一个工作在数据链路层(Data Link)的设备,主要功能是根据 MAC 地址学习来将数据包转发到网桥的不同端口(Port)上。
理解容器链接到Docker0网桥上
Veth Pair,以两张虚拟网卡(Veth Peer)的形式成对出现的。并且,从其中一个“网卡”发出的数据包,可以直接出现在与它对应的另一张“网卡”上,哪怕这两个“网卡”在不同的 Network Namespace 里。被用作连接不同 Network Namespace 的“网线
1.3.1、查看Veth Pair
cat /sys/class/net/eth0/iflink
1.3.2、ip link
1.3.3、路由
ping 192.168.101.200,它发出的请求数据包,首先经过 docker0 网桥出现在宿主机上。然后根据宿主机的路由表里的直连路由规则(192.168.101.0/24 via ens33)),对 192.168.101.200 的访问请求就会交给宿主机的 ens33 处理。
2、同宿主机的容器通信
2.1、通过容器名称互联
在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,由于容器在启动的时候其内部ip地址是DHCP随机分配的,而给容器起一个固定的名称,比较固定。
docker run -it -d --name web01 -P nginx-ping:latest docker run -it -d --name web02 -P -v /root/nginx/:/usr/share/nginx/html/ -v /root/nginx:/nginx01 nginx:latest docker run -it -d --name web03 -P -v /root/nginx/:/usr/share/nginx/html/ -v /root/nginx:/nginx01 --link web01 nginx:latest docker run -it -d --name web03 -P -v /root/nginx/:/usr/share/nginx/html/ -v /root/nginx:/nginx01 --link web01 web01-link nginx:latest
2.2、创建桥接网络
如果要指定子网和 IP 范围,可以使用 --subnet 和 --ip-range 选项。 例如,以下命令创建了一个名为 mybridge 的 Docker 网桥,其子网为 192.168.0.0/16, IP 范围为 172.100.0.0/24: docker network create --subnet=172.100.0.1/16 --ip-range=172.100.0.0/24 docker1 #查看网络 docker network list #删除网桥网络 docker network rm bridge02
#创建容器指定网络 docker run -it -d --name web05 --network bridge02 -P -v /root/nginx/:/usr/share/nginx/html/ -v /root/nginx:/nginx01 nginx:latest
cp /etc/apt/sources.list /etc/apt/sources.list.bak cat <<EOF>/etc/apt/sources.list deb http://mirrors.aliyun.com/debian/ buster main non-free contrib deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib deb http://mirrors.aliyun.com/debian-security buster/updates main deb-src http://mirrors.aliyun.com/debian-security buster/updates main deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib EOF apt-get clean -y apt-get update -y apt-get install -y iproute2 inetutils-ping
桥接网络之间通信
iptables -vnL #将docker0网桥和br-c21cee0640a5网桥连接起来,以便两个网桥中的容器可以相互通信。 sudo iptables -I FORWARD -i docker0 -o br-8a4879e3f035 -j ACCEPT #允许来自docker0网桥的数据包转发到br-c21cee0640a5网桥,并且允许来自br-c21cee0640a5网桥的数据包转发到docker0网桥 sudo iptables -I FORWARD -i br-c21cee0640a5 -o docker0 -j ACCEPT
#添加网卡 docker network connect docker0 web01 删除网卡 docker network disconnect docker1 web01
3、跨主机容器通信
3.1、环境备注
宿主机 | 宿主机02 | 容器网络 |
01 | 192.168.101.200 | 172.15.0.0/16 |
02 | 192.168.101.201 | 172.200.0.0/16 |
3.2、添加路由和防火墙规则
# 添加一个到201宿主机的路由,并将其设置为永久路由 sudo ip route add 10.200.0.0/16 via 192.168.101.201 dev ens33 sudo ip route add 10.100.0.0/16 via 192.168.101.201 dev ens33 persist #添加防火墙 iptables -nvL #将容器的源 IP 地址转换为宿主机的 IP 地址,以便第二台宿主机上的容器能够正确地回复数据包: sudo iptables -A FORWARD -s 172.100.0.0/16 -d 10.200.0.0/16 -j ACCEPT #删除路由 ip route del 10.200.0.0/16 via 192.168.101.201 dev ens33
#添加一个到200宿主机的路由,并将其设置为永久路由 sudo ip route add 172.15.0.0/16 via 192.168.101.200 dev ens33 sudo ip route add 172.15.0.0/16 via 192.168.101.200 dev ens33 persist #添加防火墙,将容器的源 IP 地址转换为宿主机的 IP 地址,以便第一台宿主机上的容器能够正确地回复数据包: sudo iptables -A FORWARD -s 10.200.0.0/16 -d 172.15.0.0/16 -j ACCEPT #删除路由 ip route del 172.15.0.0/16 via 192.168.101.200 dev ens33
3.4、Docker提供了两种方式:端口映射和使用外部网络。
- 端口映射:将容器内部的端口映射到主机的端口上,使得可以从外部网络访问容器内部的服务。使用端口映射,可以将容器的端口与主机的端口进行映射,从而实现容器与外界网络的通信。
- 使用外部网络:可以使用Docker提供的外部网络,或者使用主机的网络接口。通过使用外部网络,可以让容器与外界网络进行通信,从而让容器内部的服务可以被外部网络访问。
3.5、overlay覆盖网络(了解)
用于跨主机容器之间的通信,它可以将多个Docker守护进程连接在一起,形成一个虚拟的网络。使用overlay网络,容器可以在多个主机之间进行通信,这对于构建分布式应用程序非常有用。
在已有的宿主机网络上,再通过软件构建一个覆盖在已有宿主机网络之上的、可以把所有容器连通在一起的虚拟网络。所以,这种技术就被称为:Overlay Network(覆盖网络)。