官方文档:https://docs.docker.com/network/
素材准备:
1.Dockerfile定义
From alpine:3.18
run apk add ethtool
run apk add ipvsadm
run apk add iptables
2.构建镜像
docker build -t myalpine .
网络解决什么问题
-
容器与外界通信
-
容器间通讯,跨主机容器间通讯
-
网络隔离(容器网络命名空间、子网隔离)
-
提供网络自定义能力
-
提供容器间发现功能
-
提供负载均衡能力
docker网络命令
//连接一个容器到一个网络
docker network connect Connect a container to a network
//创建一个网络
docker network create Create a network
//将容器从一个网络中断开
docker network disconnect Disconnect a container from a network
//查看网络的详细信息
docker network inspect Display detailed information on one or more networks
//查看网络列表
docker network ls List networks
//移除所有未使用的网络
docker network prune Remove all unused networks
//移除一个或多个网络
docker network rm Remove one or more networks
网络驱动
bridge(网桥网络)
什么是桥接网络
-
bridge是docker默认的网络驱动程序。如果没有指定驱动程序,这就是正在创建的网络类型。当应用程序在需要与同一主机上的其他容器通信的容器中运行时,通常会使用桥接网络。
-
就联网而言,桥接网络是在网段之间转发流量的链路层设备,链路层设备Mac地址进行通信。桥接器可以是在主机内核运行的硬件设备或者软件设备。
-
就docker而言,网桥网络为软件网桥。允许连接到同一网桥的容器进行通讯,同时提供与未连接到该网桥的容器的隔离。不同网桥上的容器无法直接通讯。
-
启动docker是,会自动创建一个名为docker0的网桥网络,并且新启动的容器会默认连接到该网 络。
用户自定义网桥与默认网桥的区别
-
自定义网桥提供容器之间的自动DNS解析,可通过容器名称或别名互相访问,默认网桥网络上的容 器只能通过IP地址互相访问。
-
自定义网桥提供更好的网络隔离,因为所有未指定网络的容器都将连接到默认网桥,而自定义网桥 则必须显示指定容器网络后,方可加入该网络。
-
每个自定义网络都会创建一个可配置的网桥。如果使用默认网桥,对其配置将使得所有容器都使用 相同的设置,此外配置默认网桥发生在docker本身之外,需要重新启动docker。使用docker网络创建和配置自定义网桥网络,可以在创建是分别对不同的网桥做不同的配置。
查看默认网络
1.查看网络
docker network ls
安装docker后,会默认创建bridge、host、none 三个网络
2. 默认桥接网络
docker network inspect bridge
默认桥接网络子网为:172.17.0.0/16,网桥名称为docker0
3. 查看本机网卡信息
ip addr
4. linux内核路由表
route -n
所有以172.17开头并且子网掩码为255.255.0.0的IP地址的数据包都会被发送到docker0网桥
Overlay(覆盖网络)
什么是overlay网络
-
overlay网络驱动程序在多个Docker守护进程主机之间创建分布式网络。该网络位于(覆盖)特定 于主机的网络之上,允许连接到该网络的容器(包括群集服务容器)在启用加密时安全通信。 Docker透明地处理每个数据包往返于正确的Docker守护进程主机和正确的目标容器的路由
-
初始化一个swarm集群或将Docker主机加入现有swarm集群时,会在该Docker主机上创建两个新网络:
-
名为ingress的overlay网络,处理与swarm service相关的控制和数据流量。创建一个service 没有指定自定义网络时,默认将连接到ingress网络。ingress网络提供对容器化应用程序的负 载均衡和路由功能。它允许外部流量通过单一入口点访问多个容器,并根据定义的规则将请求 转发到适当的后端容器
-
名为docker-gwbridge的bridge网络,用于将覆盖网络(包括ingress网络)连接到单个 Docker守护程序的物理网络。通过这个网络,容器可以连接到宿主机
-
可以使用docker network create创建自定义的overlay网络,方法与创建自定义bridge网络相同。 服务或容器一次可以连接到多个网络。服务或容器只能通过各自连接的网络进行通信。
overlay驱动使用案例
1. 初始化swarm集群,会默认创建ingress 网络和docker_gwbridge网络
docker swarm init
2. 添加两个worker节点到集群
# 获取加入集群的命令
docker swarm join-token worker
-
创建service,将加入默认ingress网络素材准备
docker service create -p 8080:80 --replicas 3 --name nginx-svc nginx:latest
4. 查看ingress 网络明细
docker network inspect ingress
5. 查看docker_gwbridge网络详情
docker network inspect docker_gwbridge
6. 查看iptables网络转发
sudo iptables -nvL -t nat
Host(主机网络)
什么是Host网络
-
Host模式,即容器网络不会与宿主机产生网络隔离,而是使用主机的网络栈,容器不会分配自己的 IP地址。运行容器是所有端口映射的选项都将失效,并且在使用时产生警告信息。主机模式可以用 于性能优化,因为主机模式下无需网络地址转换(NAT),并且不会为每个端口创建userland-proxy(在默认情况下,Docker使用Userland Proxy作为默认的端口转发机制。Userland Proxy基 于iptables规则进行转发,将容器内部的网络流量通过宿主机上的特定端口进行转发。)
-
Host模式,仅适用于linux主机,Mac和windows主机不支持
-
docker run 或docker service create 通过指定--network host 来使用主机网络。该模式下集群节点上运行容器将受到限制(例如:容器端口为80端口,由于使用主机网络,则每个集群节点仅能运行 一个80端口的容器)
IPvlan
什么是IPvlan
-
IPvlan驱动程序为用户提供了对IPv4和IPv6寻址的完全控制。VLAN驱动程序在此基础上构建,使运 营商能够完全控制第2层VLAN标记,甚至为对底层网络集成感兴趣的用户提供IPvlan L3路由。
-
ipvlan网络驱动程序可以用于创建IPVLAN网络,它允许将容器连接到现有的物理网络接口,并通过 共享主机内核栈来实现高性能和低延迟
-
创建ipvlan驱动网络,--option选项:
-
ipvlan_mode:设置IPvlan模式默认值为 l2,可选值为:l2(容器和主机共享相同的MAC地 址,但拥有不同的IP地址)、l3、l3s。
-
ipvlan_flag:设置IPvlan模式flag,默认值为 bridge,可选值为:bridge,private,vepa (Virtual Ethernet Port Aggregator)
-
parent:指定需要使用的父级网卡
内核要求
- linux 内核版本 v4.2+ 2. unname -r 查看内核版本
Macvlan
什么是Macvlan
-
一些应用程序,特别是遗留应用程序或监控网络流量的应用程序,期望直接连接到物理网络。在这 种情况下,您可以使用macvlan网络驱动程序为每个容器的虚拟网络接口分配一个MAC地址,使其 看起来像是直接连接到物理网络的物理网络接口。在这种情况下,您需要在Docker主机上指定一个 物理接口用于Macvlan,以及网络的子网和网关。您甚至可以使用不同的物理网络接口隔离您的 Macvlan网络
-
注意一下几点:
-
由于IP地址耗尽或"VLAN扩散"(当您的网络中有大量不适当的唯一MAC地址时会出现这种情 况),您可能会无意中降低网络性能。
-
您的网络设备需要能够处理"混杂模式",即一个物理接口可以分配多个MAC地址。
-
如果您的应用程序可以使用bridge(在单个Docker主机上)或overlay(在多个Docker主机之 间进行通信)来工作,那么从长远来看,这些解决方案可能会更好。
-
创建macvlan驱动网络,--option选项:
-
macvlan_mode:默认为bridge,可选项有:bridge, vepa, passthru, private
-
parent:指定需要使用的父级网卡
None
如果要完全隔离容器的网络堆栈,可以在启动容器时使用--network-none标志。在容器中,只创建 环回设