我什么时候应该使用 docker 的主机网络

When Should I use the host network with docker

我了解如果我为容器使用主机网络驱动程序,则该容器的网络堆栈不会与 Docker 主机隔离。 我也相信从概念上理解仍然这样做的一个很好的理由可能是 "Security is not an Issue or concern" 并且网络吞吐量性能很重要,但我正在努力想一个真实世界的例子来说明我什么时候可以或应该这样做。我能想到的一个天真的例子是 public 面向负载均衡器或静态文件 Web 服务器。

我意识到,除了使用 AWS 或 Google Cloud 等主机服务之外,如果托管在那里也可以减轻安全问题,但如果那不是一个选项怎么办!

您什么时候会或应该在生产环境中使用它? 无论托管环境如何,您如何减轻安全问题? 您应该如何与其他 docker 网络中的其他服务交互?

but I am struggling to think of a real world example of when I can or should do this.

这是真实世界的例子:我们使用主机网络来加速我们的 gitlab ci/cd 管道的构建阶段。

有问题的容器已启动,运行 仅在构建阶段,没有任何端口暴露,需要更快的网络下载所有必要的部分来构建和推送 docker 图像,我们在我们通过主机网络解决的构建阶段遇到(在某些间歇性情况下)吞吐量和不一致行为的问题。虽然我们使用主机网络 "expose" 这样一个容器的 ip,但我们仍然不公开任何端口,并且在构建阶段完成后容器被丢弃。

我知道这并不能回答你所有的问题,但需要真实世界的例子。

I am struggling to think of a real world example of when I can or should do this. ... When would or should an you use it in a production environment?

  • 您的应用程序不运行 TCP 或 UDP,而是另一个协议

  • 您的应用程序需要发布大范围的传入端口(默认情况下,每个发布的端口都会生成一个 docker-proxy 进程,这对于大范围来说可能过多)

  • 您的应用程序适用于多播或广播网络流量

  • 您的应用程序需要修改主机本身的网络层,例如VPN

How can you mitigate the security concerns regardless of hosting environment?

您需要信任此应用程序。您已经删除了一层 docker 命名空间,此时,容器是一种打包格式,可能适合您的其余工具,但不需要与其他容器相同的安全方法.

How should you interact with other services in other docker networks?

您将通过其他容器的已发布端口进行交互,就像您在容器外部 运行 需要连接到容器内部应用程序的应用程序一样。