繁体   English   中英

当容器连接到 multiple.networks 时,如何仅将 Docker 容器端口暴露给一个特定的 Docker.network?

[英]How to expose a Docker container port to one specific Docker network only, when a container is connected to multiple networks?

来自 Docker 文档:

  • --publish or -p flag. Publish a container's port(s) to the host.
  • --expose. Expose a port or a range of ports.
  • --link. Add link to another container. Is a legacy feature of Docker. It may eventually be removed.

我将 docker-compose 与 several.networks 一起使用。 我不想向主机发布任何端口,但是当我使用 expose 时,该端口会暴露给容器连接到的所有.networks。 似乎经过大量测试和阅读后,我无法弄清楚如何将其限制为特定的网络。

例如,在这个docker-compose文件中, container1加入了以下三个网络: inte.netemaildatabase

services:
    container1:
       networks:
           - internet
           - email
           - database

现在,如果我有一个特定端口只想公开给database .network,而不是主机,也不要公开给本示例中的emailinte.net .networks,该怎么办? 如果我要使用ports:container1上它会暴露给主机,或者我可以将它绑定到主机的特定 IP 地址。 *我还尝试制作自定义 overlay.network,为容器提供 static IPv4 地址,并尝试在ports: like - '10.8.0.3:80:80'中设置该格式的端口,但这也没有用,因为我认为绑定只能发生在 HOST IP 地址上。 如果我在container1上使用expose:端口将暴露给所有三个网络: inte.netemaildatabase

我知道我可以制定自定义防火墙规则,但令我恼火的是我无法在我的 docker-compose 文件中编写如此简单的配置。 另外,也许像80:10.8.0.3:80 (HOST_IP:HOST_PORT:CONTAINER_IP:CONTAINER_PORT) 这样的东西在这里很有意义(没有测试)。*

我是不是遗漏了什么,或者这在 Docker 和 Docker-compose 中真的不可能吗?

也张贴在这里: https://github.com/docker/compose/issues/8795

不,容器到 docker 中的 container.networking 是一刀切。 当两个容器在同一个网络上,并且 ICC 没有被禁用时,容器到容器的通信是不受限制的。 考虑到 Docker 对开发人员工作流程的推动,我预计不会有太多的开发工作来改变这一点。

这是由 Kube.netes 等其他项目通过将网络卸载到各种供应商支持网络策略的 CNI 来处理的。 这可能是 iptables 规则、eBPF 代码、某种 sidecar 代理等来实现它。 但它必须在 container.networking 设置时完成,而 docker 没有钩子让你在那里实现任何东西。

也许您可以挂钩docker events并在创建容器后为容器运行各种 iptables 命令。 该应用程序还可以配置为监听它信任的 .network 的特定 IP 地址,但这需要注入你信任的 su.net,然后在你的入口点查找你的容器 IP,编写脚本非常重要,我我什至不确定它会起作用。 否则,这可以通过重组应用程序来解决,以便通过加固敏感端口来最小化需要在不太安全的网络上的组件,或者将运行时切换到具有网络策略的 Kube.netes 之类的东西。


无济于事的事情:

  • 删除暴露的端口:这无济于事,因为暴露只是文档。 更改公开的端口不会改变容器之间或容器与主机之间的网络。
  • 链接:链接是一项遗留功能,可在创建容器时将条目添加到主机文件。 这被 creating.networks 替换为其他容器的 DNS 分辨率。
  • 删除主机上的已发布端口:这不会影响容器到容器的通信。 带有-p的已发布端口创建了一个从主机转发到容器的端口,您确实希望限制该端口,但容器仍然可以在没有该已发布端口的情况下通过 shared.network 进行通信。

对我来说,答案是删除 -p 命令,因为它将容器绑定到主机并使其在主机外部可用。

如果不指定 -p 选项。 该容器在它所连接的所有网络上都可用。 在应用程序正在侦听的任何端口上。

似乎 -P 强制容器到主机并将其绑定到指定的端口。

在您的示例中,如果您在盯着“container1”时不使用 -p。 “container1”将可用于.networks:inte.net,email,数据库及其所有端口但不能在主机外部使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM