docker网络基础
docker容器网络模型
容器网络项目libnetwork:docker网络架构基于一套称为容器网络模型(CNM)的接口
CNM高层架构
包括:
沙箱(Sandbox):又称沙盒,包含容器的网络栈配置,涉及容器的接口、路由表和DNS设置的管理,一个沙箱可以包含多个来自不同网络的端点
端点(Endpoint):又称接入点,用来将沙箱连接到网络。端点架构将与网络的实际连接从应用中抽象出来,这样有助于维护应用系统的可移植性,让服务无须关心如何连接网络就可以使用不同类型的网络驱动
网络(Network):CNM并没有定义OSI模型中的网络层,这里用的网络可以有Linux网桥、虚拟局域网(VLAN)来实现,网络是相互连接的端点的集合
CNM驱动接口
CNM提供了两个可插拔的且开放的接口供使用
网络驱动(Network Drivers):docker网络驱动提供网络运行的具体实现,多个网络驱动可同时用于指定的docker引擎和集群,但是每个docker网络只能通过一个网络驱动来实现
CNM网络驱动又分为两大类型:
1.本地网络驱动(Native Network Drivers):由docker引擎本身实现,并随docker提供,这类驱动又有多种驱动可供选择,以支持不同的功能
2.远程网络驱动(Remote Network Drivers):由社区或其他供应商提供,可用于与现有的软件或者硬件环境进行集成,用户也可以创建自己的网络驱动来满足各种需求
IPAM(IP地址管理)驱动:docker有一个内置的IP地址管理驱动,如果没有明确指定,它会为网络和端点提供默认的子网或IP地址,IP地址也可以通过网络、容器和服务创建的指令来手动指派
docker本地网络驱动
docker本地网络驱动作为docker引擎的一部分,不需要任何额外模块,就可以通过docker network命令来调用
bridge:桥接网络,这是默认的网络驱动程序,创建容器时若不指定驱动程序就会使用这种网络类型,该驱动在docker主机上创建Linux网桥,默认情况下,在同一个网桥上的容器都可以相互通信,从外部访问容器也可以通过该驱动来设置。当应用程序在需要与之通信的独立容器中运行时,通常会使用桥接网络
host:主机网络,通过该驱动容器可以使用使用主机的网络栈,由于没有名称空间隔离,主机上的所有接口都可以直接被容器使用,独立容器由于移除容器和docker主机之间的网络隔离,可以直接使用主机的网络
overlay:该驱动组合使用本地Linux桥接网络和VxLAN(virtual extensible LAN)技术,在物理网络架构之上叠加一个容器之间的连接,将多个docker守护进程连接到一起,并使Swarm集群服务之间能够相互通信,还可以使用它来实现Swarm集群服务和独立容器之间的通信,或者不同docker守护进程上的两个独立容器之间的通信
macvlan:该驱动使用桥接模式建立容器接口和主机接口之间的连接,为容器提供在物理网络中可路由的IP地址
none:表示关闭容器的所有网络连接,该驱动让容器具有属于自己的网络栈和网络名称空间,但不在容器中配置网络接口
网络作用域
网络作用域可以是local(本地)或swarm(集群)
local作用域仅在docker主机范围内提供连接和网络服务
swarm作用域则提供跨swarm集群的连接和网络服务
swarm作用域网络在整个集群中有同一个网络ID,而local作用域网络在每个docker主机上具有各自唯一的网络ID
docker网络驱动
由社区或者供应商提供的远程网络驱动,与CNM兼容,每个驱动为容器提供独特的功能和网络服务
docker网络驱动选择的原则
同一个docker主机上运行的多个容器需要通信时,最好使用用户自定义的桥接网络
当网络栈不能与docker主机隔离,而容器的其他方面需要被隔离时,最好选择主机网络
不同docker主机上运行的容器需要通信,或者多个应用通过swarm集群服务一起工作时,overlay是最佳选择
从虚拟机迁移过来,或者像网络上的物理机一样,每个容器都需要有一个独立的MAC地址时,macvlan网络是最佳选择
第三方网络插件适用于将docker与专用网络栈进行集成
Linux网络基础
docker用于实现本地CNM网络驱动的Linux网络模块,包括:
Linux网桥:Linux网桥是docker的bridge模式的底层实现
网络名称空间:Linux网络名称空间是 内核中的一个被隔离的网络栈,拥有自己的网络接口、路由和防火墙规则,用于隔离容器。网络名称空间可以确保在同一主机上的两个容器之间不能相互通信,甚至与主机本身也不能通信,除非配置为通过docker进行网络连接
veth对:要实现网络通信,至少需要一个网络接口来收发数据包,docker在本地主机和容器之间分别创建一个虚拟接口,一对接口是veth对
iptables:包过滤系统
单主机与多主机的docker网络
docker run命令的网络配置用法
设置容器的网络连接
--network设置
none:不使用任何网络连接
bridge:通过veth接口连接容器到网桥(默认)
host:在容器内使用主机的网络栈
container:使用其他容器的网络栈,需要用name或者id指定
<network-name>|<network-id>:连接用户自定义的网络
设置容器的IP地址
默认情况下,docker守护进程会为容器连接的每个docker网络分配一个IP地址(地址池),因此docker守护进程可以有效充当每个容器的DHCP服务器,每个网络也都有一个默认的子网掩码和网关
docker network connect #将现有的容器连接到另一个不同的网络
设置容器的网络接口MAC地址
--mac-address为容器指定一个MAC地址
设置容器的DSN和主机名
默认情况下,容器继承docker守护进程的DSN设置,包括/etc/hosts和/etc/resolv.conf配置文件
--dns:为容器设置DNS服务器的IP地址,可以指定多个DSN服务器,如果容器无法连接到所指定的DSN服务器的IP地址,则会自动使用Google公司提供的公共DSN服务器8.8.8.8,让容器能够解析Internet域名
--dns-search:为容器指定一个DSN搜索域,用于搜索非全称主机名
--dns-opt:为容器设置表示DNS选项及其值的键值对
--hostname:为容器指定自定义的主机名
设置容器的发布端口和连接
只能在默认的桥接模式下工作
通过docker run命令创建容器时使用-p(--publish)或-P(--publish-all)来设置对外发布的端口
--link建立容器连接(目前应尽可能使用网络驱动,而不要使用这个连接功能)
docker network命令的网络配置用法
上述的docker run启动容器时只可以连接单个网络,因为 docker run 命令的--network选项只能有一个,如果使用多个--network 选项,最后一个会覆盖之前的。不过容器运行之后,可以使用docker network connect 命令将正在运行的容器连接到多个网络。使用 docker network connect 命令连接到一个已有网络时,还可以使用--alias 选项为容器指定该网络的网络别名。docker network 是Docker 网络管理命令,其基本用法如下:
docker network COMMAND
其中,COMMAND 是子命令,用于完成具体的网络管理任务。常用的 docker network命令列举如下:
docker network conmect:将容器连接到指定的网络。
docker network create:创建一个网络
docker network disconnected:断开容器与指定网络的连接
docker network inspect:显示一个或多个网络的详细信息
docker network ls:显示网络列表
docker network prune:删除所有未使用的网络
docker network rm:删除一个或多个网络