本文章讲解Docker的网路部分,如有想学习Docker概念、安装、基本使用、Harbor仓库等相关知识,请看另一篇文章:
目录
Docker网络
1.Docker网络介绍
容器网络实质上是由 Dokcer 为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等等与网络相关的模块。
1.1. CNM
Docker 网络架构采用的设计规范是 CNM(Container Network Model):CNM 中规定了 Docker 网络的基础组成要素:Sandbox、Endpoint、Network。
Sandbox,提供了容器的虚拟网络栈,也即端口套接字、IP 路由表、防火墙、DNS 配置等内容。主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。
Network,Docker 内部的虚拟子网,网络内的参与者相互可见并能够进行通讯。Docker 的虚拟网路和宿主机网络是存在隔离关系的,其目的主要是形成容器间的安全通讯环境。
Endpoint,就是虚拟网络的接口,就像普通网络接口一样,Endpoint 的主要职责是负责创建连接。在 CNM 中,终端负责将沙盒连接到网络。
1.2. Libnetwork
Libnetwork 是 CNM 的标准实现。Libnetwork 是开源库,采用 Go 语言编写(跨平台的),也是 Docker 所使用的库,Docker 网络架构的核心代码都在这个库中。Libnetwork 实现了 CNM 中定义的全部三个组件,此外它还实现了本地服务发现、基于 Ingress 的容器负载均衡,以及网络控制层和管理层功能。
1.3. 驱动
如果说 Libnetwork 实现了控制层和管理层功能,那么驱动就负责实现数据层。比如网络的连通性和隔离性是由驱动来处理的。驱动通过实现特定网络类型的方式扩展了 Docker 网络栈,例如桥接网络和覆盖网络。
Docker 内置了若干驱动,通常被称作原生驱动或者本地驱动。比如 Bridge Driver、Host Driver、Overlay Driver、MacLan Driver、None Driver 等等。第三方也可以编写 Docker 网络驱动,这些驱动被叫做远程驱动,例如 Calico、Contiv、Kuryr 以及 Weave 等。每个驱动负责创建其上所有网络资源的创建和管理。
其中 Bridge 和 Overlay 在开发过程中使用频率较高。
Bridge,Docker 容器的默认网络驱动,通过网桥来实现网络通讯。
Overlay,借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。通过它可以搭建跨物理网络主机的虚拟网络,进而让不同物理机中运行的容器感知不到多个物理机的存在。
在 Docker 安装时,会自动安装一块 Docker 网卡称为 docker0,用于 Docker 各容器及宿主机的网络通信。
2.Docker网络模式
2.1 桥接模式
Docker的bridge网络模式是Docker的默认网络模式。当Docker进程启动时,它会在主机上创建一个名为docker0的虚拟网桥。此主机上启动的Docker容器会连接到这个虚拟网桥上。这个虚拟网桥的工作方式类似于物理交换机,使得主机上的所有容器都通过交换机连接在一个二层网络中。
在这种模式下,Docker会为每个新创建的容器分配独立的Network Namespace和IP段等,同时文件系统、进程等也是隔离的。容器内部会有一个虚拟网卡,名为eth0,容器之间可以通过这个虚拟网卡和内部的IP地址进行通信。另外,从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
然而,处于桥接模式的容器和宿主机网络不在同一个网段,容器一般使用172.0.0.xx/24这种网段。因此,容器不能直接和宿主机以外的网络进行通信,而必须要经过NAT转换。同时,容器需要在宿主机上竞争端口,完成端口映射的配置后,从外部到容器内的网络访问tcp流量将会通过DNAT从宿主机端口转发到容器内对应的端口上。此外,容器对于宿主机以外是不可见的,从容器发出的网络请求会通过SNAT从已对接的虚拟网桥(如宿主机的docker0)上统一发出。
2.2 Host网络
Docker的host网络模式是另一种网络模式,与bridge模式不同,它将容器直接融入到主机的网络栈中,使得容器直接使用主机的网络接口和IP地址。在这种模式下,容器不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。因此,容器内部的服务可以使用宿主机的网络地址和端口,无需进行NAT转换,网络性能较好。
使用host网络模式的一个典型场景是需要容器与宿主机共享网络资源或者容器需要快速访问宿主机网络服务的场景。例如,如果需要在容器内部运行一些网络相关的应用,如网络监控、日志收集等,这些应用需要直接访问宿主机的网络接口和IP地址,此时就可以使用host网络模式。
需要注意的是,由于容器与宿主机共用一个网络栈,因此容器的网络隔离性较差,可能存在安全隐患。如果需要在不同主机上运行容器并实现跨主机通信,则不能使用host网络模式。
总的来说,Docker的host网络模式提供了一种将容器与宿主机网络栈直接融合的方式,使得容器可以直接使用宿主机的网络接口和IP地址,适用于一些需要快速访问宿主机网络服务的场景。但是需要注意的是,该模式下容器的网络隔离性较差,需要谨慎使用
2.3 None 网络
Docker的none网络模式是Docker提供的一种特殊网络模式,它将容器与宿主机隔离开来,不提供任何网络能力。在这种模式下,容器内部没有网卡、IP地址、路由等信息,只有一个回环网络(loopback)接口。这意味着容器不能访问外部网络,也不能被外部网络访问。
none网络模式通常用于一些特殊场景,比如需要在容器内部运行一些独立的、与网络无关的应用程序,或者需要进行一些网络调试。由于容器与外部网络完全隔离,这种模式可以增加容器的安全性。
2.4 container 模式
Docker的container网络模式是指新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。这意味着新创建的容器不会创建自己的网卡、配置自己的IP地址,而是和一个已存在的容器共享IP地址、端口范围等网络资源。同时,这两个容器的进程可以通过lo网卡设备通信。然而,这两个容器在其他方面,如文件系统、进程列表等,仍然是隔离的。
使用container网络模式的一个典型场景是,当需要多个容器之间共享网络配置时,可以使用该模式。例如,可以使用该模式创建一个nginx容器,并指定其网络模型为container模式,和另一个已经存在的容器共享网络命名空间。这样,nginx容器就可以直接使用另一个容器的IP地址和端口,无需进行额外的网络配置。
3.Docker网络驱动程序
Docker使用Linux内核的一些特性来实现其网络功能,而这些功能是通过不同的网络驱动程序来实现的。Docker支持多种网络驱动程序,每种驱动程序都有其特定的用途和场景。
bridge(桥接):这是Docker的默认网络驱动程序。它会在宿主机上创建一个虚拟网桥(通常是docker0),并将容器连接到这个网桥上。容器之间以及容器与宿主机之间可以通过这个网桥进行通信。bridge模式适用于单个宿主机上的容器互联场景。
host:host网络驱动程序将容器直接融入主机的网络栈中,容器将共享主机的网络接口和IP地址。这意味着容器内部的服务可以直接使用主机的网络地址和端口,无需进行NAT转换。host模式适用于需要容器与宿主机共享网络资源的场景,但需要注意安全性和隔离性问题。
overlay:overlay网络驱动程序用于创建跨多个Docker守护进程的分布式网络。它通过内置的DNS服务实现容器之间的跨主机通信。overlay模式适用于需要构建分布式应用程序的场景,可以让容器在不同宿主机之间进行通信。
macvlan:macvlan网络驱动程序允许容器使用宿主机的物理网络接口,并为其分配一个MAC地址。这样,容器可以像虚拟机一样直接连接到物理网络上,并与其他设备通信。macvlan模式适用于需要容器直接访问物理网络的场景。
ipvlan:ipvlan是另一种类似于macvlan的网络驱动程序,但它基于IP地址而不是MAC地址来分配网络。ipvlan模式提供了更好的扩展性和灵活性,适用于不同的网络场景。
none:none网络驱动程序不提供任何网络功能,容器将处于完全隔离的状态。它通常用于一些特殊场景,如运行与网络无关的应用程序或进行网络调试。
4.常用基本命令
4.1 查看网络
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
25248b62bc0d bridge bridge local
10b219855a7e host host local
a6d51c23763b none null local
4.2 查看网络数据源
[root@docker ~]# docker network inspect host
[
{
"Name": "host",
"Id": "10b219855a7e0cb5b869d663be816f7d5f3027f2a38c40077a6decc0428789b0",
"Created": "2025-03-18T07:28:18.307803556Z",
"Scope": "local",
"Driver": "host",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": null
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
4.3 创建网络
#创建默认网络
[root@docker ~]# docker network create example
f7c40c3b0aa2408bb99e0e95ba738bdf3b387700ea4320564b87594381d91f23
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
25248b62bc0d bridge bridge local
f7c40c3b0aa2 example bridge local
10b219855a7e host host local
a6d51c23763b none null local
#指定网络驱动程序
[root@docker ~]# docker network create --driver overlay my-overlay-network
25joaxzj3gbmedthc18roe2ci
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
25248b62bc0d bridge bridge local
3be4c06b99da docker_gwbridge bridge local
f7c40c3b0aa2 example bridge local
10b219855a7e host host local
n2u7t48q9pdd ingress overlay swarm
25joaxzj3gbm my-overlay-network overlay swarm
a6d51c23763b none null local
4.4 删除网络
[root@docker ~]# docker network rm example
example
[root@docker ~]# docker network rm my-overlay-network
my-overlay-network
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
25248b62bc0d bridge bridge local
3be4c06b99da docker_gwbridge bridge local
10b219855a7e host host local
n2u7t48q9pdd ingress overlay swarm
a6d51c23763b none null local