使用主机网络从另一个容器访问容器内的服务

问题描述 投票:0回答:1

我有一个 docker 容器

A
,它必须与
network_mode: "host"
一起运行,并在端口
13557
公开服务。

我还有 ufw,默认情况下会阻止所有未明确列入允许列表的端口,包括向

host.docker.internal:13557
发出的请求。

同一 compose 项目中但不使用

network_mode: "host"
的其他容器如何才能到达
A:13557
处的服务?

一些解决方案建议添加 ufw 规则以允许使用

docker0
接口的出站流量:

ufw allow out on docker0 from 172.17.0.0/16
ufw allow out on docker0 from 172.17.0.0/16 port 80 proto tcp

但是,在我的系统上,

docker0
界面似乎已关闭,而每个撰写项目似乎都有一个特定的桥接界面:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
...
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
...
14: br-29967e9cbcae: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
15: br-b835b6056915: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
16: br-c9eb279cb864: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
17: br-653e48e09916: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default 
18: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
...

每个网桥都有自己的网络掩码,因此不清楚如何创建

ufw allow
规则。

我看到

docker network
提供了有关网络地址的详细信息以及不处于主机网络模式下的容器的其他详细信息,但这些网络掩码可以从一台主机更改为另一台主机。

在另一个类似的post中提供了如下解决方案:

ufw allow from 172.22.0.0/16 to 172.17.0.1

但是

172.22.0.0/16
网络是特定于给定容器的,这可能会随着重新启动或切换到另一个主机而改变。此外,这似乎提供了从该网络中的所有容器到所有主机服务的访问。

是否可以在 docker 框架内以编程方式允许非主机网络容器访问主机网络模式下容器提供的特定服务,例如

A:13557
?主机网络容器是否可以识别非主机网络并绑定到其上的端口?

docker ufw hostnetwork
1个回答
0
投票

我通过在共享卷上使用 unix 套接字很好地解决了这个问题。

在主机网络容器上运行的服务侦听卷

A
内的unix套接字,并且相同的卷
A
安装在需要访问该服务的其他容器上。

示例:

volumes:
  ...
  service-socket:
services:
  service-A:
    network_mode: "host"
    volumes:
      - service-socket:/var/run/service-A
    environment:
        - SERVICE_SOCKET=/var/run/service-A/service.sock
  service-B:
    volumes:
      - service-socket:/var/run/service-A
    environment:
        - SERVICE_SOCKET=/var/run/service-A/service.sock
© www.soinside.com 2019 - 2024. All rights reserved.