docker network 是什么?
容器网络实质上也是由Docker为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP协议栈、端口套接字、IP路由表、防火墙等等与网络相关的模块。
Docker网络中有三个核心概念:沙盒(Sandbox)、网络(Network)、端点(Endpoint)。 **沙盒:**提供了容器的虚拟网络栈,也即端口套接字、IP路由表、防火墙等内容。隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。 **网络:**可以理解为Docker内部的虚拟子网,网络内的参与者相互可见并能够进行通讯。Docker的虚拟网络和宿主机网络是存在隔离关系的,其目的主要是形成容器间的安全通讯环境。 **端点:**位于容器或网络隔离墙之上的洞,主要目的是形成一个可以控制的突破封闭的网络环境的出入口。当容器的端点与网络的端点形成配对后,就如同在这两者之间搭建了桥梁,便能够进行数据传输了。 这三者形成Docker网络核心模型,也就是容器网络模型(Container Network Model)。
docker network 能做什么?
- 容器间的互联和通讯以及端口映射
- 容器IP变动时通过服务名直接进行网络通讯
docker 网络实现
容器网络模型为容器引擎提供了一套标准的网络对接范式,Docker中,实现这套范式的是Docker所封装的libnetwork模块。
Docker官方提供了五种Docker网络驱动,分别是:Bridge Driver、Host Driver、Overlay Driver、MacLan Driver、None Driver。Bridge和 Overlay在开发中使用频率较高。
网络模式 | 简介 |
---|---|
host(主机模式) | 相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址 |
bridge(桥梁模式) | 相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。 |
overlay(覆盖模式) | Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。 |
container(容器模式) | 在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace, 而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。 同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。 |
none(无网络模式) | 该模式将容器放置在它自己的网络栈中,但是并不进行任何配置。实际上,该模式关闭了容器的网络功能, 在以下两种情况下是有用的:容器并不需要网络(例如只需要写磁盘卷的批处理任务)。 |
- 默认网络(docker0) 当你安装Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络:
Docker内置这三个网络,运行容器时,你可以使用该–network标志来指定容器应连接到哪些网络。
该bridge网络代表docker0所有Docker安装中存在的网络。除非你使用该docker run --network=选项指定,否则Docker守护程序默认将容器连接到此网络。
- host网络模式 相当于Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。
众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
- bridge网络模式(重点) 相当于Vmware中的Nat模式,容器使用独立network Namespace,并连接到docker0虚拟网卡(默认模式)。通过docker0网桥以及Iptables nat表配置与宿主机通信;bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。
Docker 默认的 bridge 网络是不支持通过 Docker DNS 服务进行域名解析的,自定义桥接网络是可以的。
Bridge模式的拓扑
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.0.186/24。
Docker完成以上网络配置的过程大致是这样的:
(1)在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。 (2)Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中 (3)从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
docker overlay模式 Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。这样不但能够充分利用成熟的IP路由协议进程数据分发;而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。
因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。
要想使用Docker原生Overlay网络,需要满足下列任意条件
Docker 运行在Swarm 使用键值存储的Docker主机集群
基本命令
-
docker network ls 查看所有docker网络
-
docker network inspect 显示某个局域网络信息
-
docker network rm 删除一个docker网络
-
docker network prune 删除所有未引用的docker局域网络
-
docker network connect 将某个容器连接到一个docker网络
-
docker network create 创建一个docker局域网络
-
docker network disconnect 将某个容器退出某个局域网络
实操练习
~ docker network create -d bridge my-bridge-network #创建一个基于bridge驱动的网络。
b193dd78b09d4e5e810c8f07515ab537dd73d3cee4cae94e909c0fb624f769cb
➜ ~ docker network ls
NETWORK ID NAME DRIVER SCOPE
c75ba35913a2 bridge bridge local
bee6297ca1bc host host local
b193dd78b09d my-bridge-network bridge local
78f740a69c55 none null loca
创建虚拟机查看网络
https://www.cnblogs.com/jiftle/p/15057849.html
本文由 huzd 创作,采用 知识共享署名4.0 国际许可协议进行许可本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名最后编辑时间
为:
2022/08/01 16:54