有一种情况,是在Docker实际部署期间,会有让容器直接去运用主机IP地址这样一个常见然而又敏感的操作实例呈现。而这般操作常常是关联到为经由绕过容器默认的网络隔离,从而让服务能够直接显现在主机网络栈之上为目标的一种刻意设置的涵盖网络模式在里头的特殊设定。这样做法是是能够带来显著的性能方面的优势以及使得网络拓扑趋于简化的效果,不过与此同时它还会引出安全与管理层面上的复杂考量因素,并不是在任意场景下对于docker 来说都是适宜去使用这项操作的。

为什么要让Docker容器使用主机网络

在一些对网络迟延跟吞吐量有着极高要求的情景之下,像是高频交易系统或者高性能计算集群,容器借助NAT或者桥接网络与外部展开通信会产生不可被忽视的开销。运用主机网络模式,容器会直接去共享宿主机的网络命名空间,直接采用主机的IP地址以及端口。这消除了数据包在虚拟网络接口之间的转发以及地址转换过程,能够获取接近原生物理机的网络性能 。这会是一个可行的、面向那些将需要直接做底层网络协议栈的操作(像构建路由器、防火墙这样的活动算操作范畴)或者正在运行这样一些运行某些对网络拓扑有着严格要求之遗留应用要求的情况的解决方案 。

主机使用寿命_docker使用主机ip_主机使用加速盒和加速器哪个好

然而红旗linux桌面版,这样的配置致使容器丧失了最为关键的网络隔离特性 ,容器内部的进程会如同在宿主机上运行的进程那般监听端口 ,这极其容易引发与宿主机上或者其他运用主机网络模式的容器产生端口冲突 ,举例来说 ,要是宿主机上已然运行了MySQL服务并占用了3306端口 ,那么任何尝试去监听3306端口的容器都会启动失败 ,所以 ,在决定采用此模式之前 ,必须审慎地规划整个宿主机的端口使用状况 。

Docker使用主机IP有哪些具体方法

相对最为直接的办法乃是于运行容器之际指定 --network=host 这一参数,就好比 docker run --network=host myapp 这般似的去操作。像如此启动起来的容器会全然融入到主机网络之中,在那容器内部 通过 ifconfig 或者 ip addr 命令所见到的网络接口列表会跟宿主机的情形全然一模一样 。绑定于容器内应用的任意端口,像 0.0.0.0:8080 这样的,都会直接于宿主机 IP 的相应端口上予以暴露,并不需要再借助 -p 参数来开展端口映射。

主机使用寿命_docker使用主机ip_主机使用加速盒和加速器哪个好

除了主机网络模式之外,还有一种间接方法,那就是去使用 macvlan 或者 ipvlan 网络驱动。它们能够给容器分配一个跟宿主机处于相同网段的、对外能够看见的真实IP地址,进而让容器于网络层面如同是一台独立自主、不和其他相连的物理主机。尽管容器并非直接运用“主机IP”,然而从外部客户端的角度来看,容器服务是经由一个单独的IP(这个IP与主机处于相同网段)来提供的,达成了类似的目标,并且其隔离性要比单纯的主机模式更好。

在开发环境中使用主机网络是否安全

于个人开发或者测试环境里,运用主机网络模式一般来讲是安全的哟linux系统下载,鉴于其将网络调试予以简化啦。开发者能够直接于容器内运行服务呢,并且在宿主机之上借助localhost或者宿主机IP直接去访问呀,根本无需顾虑复杂的端口映射规则哟。恰似呀,调试一个Web API之时,能够直接在宿主机浏览器访问 :5000,跟调试一个本地进程的体验全然是一致呐。

即使是处于开发环境之中,那也必须要始终保持着警惕。要是容器应用出现了安全方面的漏洞,比如说存在远程代码执行这种情况,一旦攻击者成功地对容器发起入侵行为之后,鉴于网络隔离已然消失不见,那么攻击者就能够直接对宿主机局域网之内的其他设备展开扫描以及攻击,如此一来,风险的边界就被极大地拓宽了。所以说,除非确实是有必要的情况,否则建议在进行开发的时候,也要优先去使用默认的桥接网络,借助端口映射的方式来开展对服务的访问。

生产环境部署的风险与挑战

设于生产环境里,默认运用主机网络模式是极为不被推荐的。首要存在的风险是安全隔离出现故障。容器颇具特点价值在于提供资源隔离之举,然而主机网络模式却将网络命名空间隔离予以破坏,致使恶意容器能够进行嗅探,甚至还可干扰宿主机所具备的全部网络流量。除此之外,一旦容器应用以root权限来运行,并且出现逃逸状况,攻击者便会直接获取对宿主机的完全控制权力。

这会跟容器编排平台(像是 Kubernetes)的设计引发根本冲突,Kubernetes 假定每个 Pod 具备独立的 IP,且依赖 Service 和 Ingress 等抽象去管理流量,运用主机网络会破坏这些抽象,致使服务发现、负载均衡以及网络策略统统失效,让容器很难被纳入标准的运维和管理体系,增添部署和排障的复杂性。

主机使用寿命_docker使用主机ip_主机使用加速盒和加速器哪个好

如何配置容器以安全地共享主机网络

要是经过评估确定得使用主机网络,那就得依照最小权限原则来展开严格配置。要保证容器是以非root用户的身份去运行,并且借助 --cap-drop=ALL 以及 --cap-add=NET_RAW 这类参数去精细把控容器的Linux能力,仅仅给予其必要的网络权限。与此同时,联合SELinux、AppArmor等安全模块,针对容器的系统调用以及文件访问实施强制性的约束。

在编排方面,针对Kubernetes ,要是Pod势必运用主机网络(这里是hostNetwork: true),那就应当借由节点选择器把它调度至专门用在这个用途的特定节点上,以此跟其他工作负载达成物理或者逻辑上彼此隔离。而且docker使用主机ip,必须给这些Pod配备严谨的安全上下文(Security Context)以及网络策略(NetworkPolicy),虽说主机网络模式会对网络策略的效果有一定限制。

替代主机网络模式的更好方案是什么

主机使用加速盒和加速器哪个好_docker使用主机ip_主机使用寿命

于多数场景之中,运用标准的桥接网络配上端口映射(即 -p 参数)乃是更为优良的选择,它维持了颇为不错的隔离状况。其间,借由 iptables 规则或者代理把流量转送至容器内部,得以满足外部访问的需求。针对那些需要容器直接对外进行暴露的场景来说,可以给容器分配公网版 IP,又或是经过负载均衡器将公网流量朝着容器的私有 IP 引导。

采用服务网格(像Istio这样的),是更为现代的方案,它借助在每个Pod里注入Sidecar代理,来自动处理服务间通信的加密、认证以及流量管理,应用容器只需监听localhost,由Sidecar代理去负责与外界通信docker使用主机ip,这不但保证了容器网络空间的简洁跟隔离,还提供了强大的网络可观测性和控制能力,是解决复杂微服务通信问题的标准路径。

您于部署具备严格网络性能要求的服务之际,到底是更倾向将主机网络模式予以运用而为求性能兑换,还是坚定不移地运用覆盖网络且接纳一定开销,借由其他架构优化予以弥补呢?欢迎于评论区将您的实践经验以及观点予以分享,要是觉得本文对您存有帮助,请点赞给予支持并且分享给更多有需要的朋友。

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复