🧨个人主页:明明跟你说过
🚩欢迎🎗️点赞😸关注❤️分享
😸希望本文能够对您有所帮助,如果本文有不足之处,或您有更好的建议、见解,欢迎在评论区留下您的看法,我们一起学习、交流、进步!
目录
一、引言
Docker网络是在Docker容器中实现网络通信和连接的重要组成部分。它提供了多种网络模式和配置选项,使得容器可以与其他容器、主机以及外部网络进行通信,在实际应用中,通过选择合适的网络类型和配置参数,可以构建高效、安全、可扩展的Docker网络解决方案。
二、Docker网络模式(Network Modes)
1、桥接模式(Bridge Network)
Docker的bridge网络模式是Docker的默认网络模式。当Docker进程启动时,它会在主机上创建一个名为docker0的虚拟网桥。此主机上启动的Docker容器会连接到这个虚拟网桥上。这个虚拟网桥的工作方式类似于物理交换机,使得主机上的所有容器都通过交换机连接在一个二层网络中。
在这种模式下,Docker会为每个新创建的容器分配独立的Network Namespace和IP段等,同时文件系统、进程等也是隔离的。容器内部会有一个虚拟网卡,名为eth0,容器之间可以通过这个虚拟网卡和内部的IP地址进行通信。另外,从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
然而,处于桥接模式的容器和宿主机网络不在同一个网段,容器一般使用172.16.0.xx/24这种网段。因此,容器不能直接和宿主机以外的网络进行通信,而必须要经过NAT转换。同时,容器需要在宿主机上竞争端口,完成端口映射的配置后,从外部到容器内的网络访问tcp流量将会通过DNAT从宿主机端口转发到容器内对应的端口上。此外,容器对于宿主机以外是不可见的,从容器发出的网络请求会通过SNAT从已对接的虚拟网桥(如宿主机的docker0)上统一发出。
如服务器未安装docker,可以参考在CentOS系统中轻松安装和配置Docker指南这篇文章
2、Host 网络
Docker的host网络模式是另一种网络模式,与bridge模式不同,它将容器直接融入到主机的网络栈中,使得容器直接使用主机的网络接口和IP地址。在这种模式下,容器不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。因此,容器内部的服务可以使用宿主机的网络地址和端口,无需进行NAT转换,网络性能较好。
使用host网络模式的一个典型场景是需要容器与宿主机共享网络资源或者容器需要快速访问宿主机网络服务的场景。例如,如果需要在容器内部运行一些网络相关的应用,如网络监控、日志收集等,这些应用需要直接访问宿主机的网络接口和IP地址,此时就可以使用host网络模式。
需要注意的是,由于容器与宿主机共用一个网络栈,因此容器的网络隔离性较差,可能存在安全隐患。如果需要在不同主机上运行容器并实现跨主机通信,则不能使用host网络模式。
总的来说,Docker的host网络模式提供了一种将容器与宿主机网络栈直接融合的方式,使得容器可以直接使用宿主机的网络接口和IP地址,适用于一些需要快速访问宿主机网络服务的场景。但是需要注意的是,该模式下容器的网络隔离性较差,需要谨慎使用
3、None 网络
- Docker的none网络模式是Docker提供的一种特殊网络模式,它将容器与宿主机隔离开来,不提供任何网络能力。在这种模式下,容器内部没有网卡、IP地址、路由等信息,只有一个回环网络(loopback)接口。这意味着容器不能访问外部网络,也不能被外部网络访问。
- none网络模式通常用于一些特殊场景,比如需要在容器内部运行一些独立的、与网络无关的应用程序,或者需要进行一些网络调试。由于容器与外部网络完全隔离,这种模式可以增加容器的安全性。
4、container 模式
Docker的container网络模式是指新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。这意味着新创建的容器不会创建自己的网卡、配置自己的IP地址,而是和一个已存在的容器共享IP地址、端口范围等网络资源。同时,这两个容器的进程可以通过lo网卡设备通信。然而,这两个容器在其他方面,如文件系统、进程列表等,仍然是隔离的。
使用container网络模式的一个典型场景是,当需要多个容器之间共享网络配置时,可以使用该模式。例如,可以使用该模式创建一个nginx容器,并指定其网络模型为container模式,和另一个已经存在的容器共享网络命名空间。这样,nginx容器就可以直接使用另一个容器的IP地址和端口,无需进行额外的网络配置。
三、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网络驱动程序不提供任何网络功能,容器将处于完全隔离的状态。它通常用于一些特殊场景,如运行与网络无关的应用程序或进行网络调试。
四、Docker网络配置
创建网络:docker network create
docker network create 命令用于在 Docker 中创建一个新的网络。这个命令允许指定网络的名称、驱动程序以及其他选项,以满足不同的网络需求。
语法:
docker network create [OPTIONS] NETWORK
- OPTIONS:这是可选参数,可以用来指定网络的属性,如网络驱动程序、子网、网关等。
- NETWORK:这是你要创建的网络的名称,可以根据实际需求进行命名。
创建一个默认的 bridge 网络
docker network create my-network
指定网络驱动程序
docker network create --driver overlay my-overlay-network
指定其他网络选项
docker network create \
--driver bridge \
--subnet=172.25.0.0/16 \
--gateway=172.25.0.1 \
--ip-range=172.25.50.0/24 \
--aux-address="my-router=172.25.50.10" \
my-custom-network
这将创建一个名为 my-custom-network 的自定义 bridge 网络,具有指定的子网、网关、IP 地址范围和辅助地址。
- --driver 或 -d:指定网络驱动程序,如 bridge 或 overlay。
- --subnet:指定网络的子网地址。
- --gateway:指定网络的网关地址。
- --ip-range:指定网络的 IP 地址范围。
- --aux-address:指定网络的辅助地址。
连接容器到网络:--network
在Docker中,可以使用--network选项来将容器连接到指定的网络。这个选项允许指定容器应该使用的网络,并且可以与docker run命令一起使用来创建并启动容器
语法:
docker run --network <网络名称> <其他选项> <镜像名称>
其中,<网络名称>是想要容器连接的网络的名称,<其他选项>是创建和启动容器时可能需要的其他参数(如容器名称、端口映射等),<镜像名称>是要运行的Docker镜像的名称。
例如,要将名为running-container的容器连接到my-network网络,可以运行
docker network connect my-network running-container
五、Docker网络服务发现与负载均衡
1、Docker Swarm
Docker的网络服务发现与负载均衡功能在Docker Swarm模式下特别有用。Swarm是Docker的一个集群管理工具,它允许将多个Docker主机组合成一个单一的、可伸缩的、高可用的集群。在这个集群中,可以部署和管理服务,而Docker Swarm会负责在集群节点之间分配和调度容器。
服务发现
服务发现是Swarm的一个核心功能,它允许服务自动找到彼此,而不需要硬编码主机名或IP地址。Swarm使用DNS和VIP(虚拟IP地址)来实现服务发现。每个服务在Swarm中都会被分配一个唯一的名称和VIP,其他服务可以通过这个名称或VIP来访问该服务,而不需要知道底层容器的实际IP地址。
负载均衡
当服务有多个副本(即多个容器实例)在Swarm集群中运行时,Docker Swarm会自动处理负载均衡。它使用内置的负载均衡器来将流量分发到不同的容器实例上,从而实现高可用性和扩展性。这个负载均衡器是基于Docker的网络驱动和iptables(Linux内核的包过滤技术)实现的。
总结来说,Docker等容器平台提供了多种网络模式和网络配置选项,以满足不同场景下的需求。用户可以根据实际应用场景选择合适的网络模式和网络配置,以实现容器间的有效通信和服务的对外访问。