当前位置: 首页 > 知识库问答 >
问题:

为什么只配置了“expose”的服务能够与Internet通信?

海嘉赐
2023-03-14

docker网络有些让我困惑。我有一个docker-compose.yml文件,可以这样简化:

version: '3.8'
services:
    foo:
        ...
        networks:
            - main_network
        ports:
            - "3000:3000"
    bar:
        ...
        networks:
            - main_network
        expose:
          - "5000"
networks:
    main_network:

公开端口而不将其发布到主机--它们仅可被链接的服务访问。只能指定内部端口。

如果这是真的,bar应该只向foo服务公开5000端口。而且它似乎像预期的那样起作用。如果,我将bash运行到bar服务中并执行:

$ ss -lntu 

5000端口已正确打开:

Netid    State     Recv-Q  Send-Q   Local Address:Port    Peer Address:Port
...
tcp      LISTEN    0       128      0.0.0.0:5000          0.0.0.0:*
...
$ nmap -p1-65535 127.0.0.1
PORT     STATE SERVICE
3000/tcp open  ppp

所以,我不明白的是IRL,我的bar服务能够连接到Mongo Atlas online或ping Internet。如果端口没有暴露/打开以接收它,它如何得到它的答案?

共有1个答案

蒋无尘
2023-03-14

你所联系到的答案是旧的和不正确的。

>

  • expose关键字主要是一个no-op。它的信息很丰富(“此映像将在这些端口上提供服务”),但它没有任何操作影响。

    在Docker的旧版本中,expose关键字可用于链接容器的服务发现,但(a)它仍然没有任何操作影响--无论是否有匹配的expose,端口都可用--容器“链接”已被弃用一段时间。

    默认情况下,容器具有出站internet访问权限。出站访问是通过主机防火墙NAT表中的简单NAT规则(以及筛选器转发链中的相应规则)管理的。例如,在运行Docker 20.10.2的系统上,在forward链中,我有:

    -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    -A FORWARD -o docker0 -j DOCKER
    -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
    -A FORWARD -i docker0 -o docker0 -j ACCEPT
    

    第一条规则传递作为现有TCP连接一部分的数据包。这允许出站连接的返回数据包。

  •  类似资料:
    • 在static_cast、dynamic_cast、reinterpret_cast和const_cast中,只有static_cast能够返回所需类型的对象,而另一种类型只能返回表示的指针或引用。为什么会这样? 例子: 对于dynamic_cast:

    • 我有几个微服务,每个微服务都有用于CRUD操作的RESTendpoint。我必须创建一个工作流,该工作流将从一个带有一些初始输入的微服务开始,但一个微服务的稍后输出可以用作其他微服务的输入。可以对这些REST API进行一些同步和异步调用。 我已经寻找了一些工作流引擎,但我不认为我可以在不编写任何java代码的情况下创建我的工作流。

    • 我怀疑这是我需要改变的地方,但不知道如何改变。

    • 由于这里有一些很好的答案,我基本上(显然是以有限的方式)理解了Haskell的的目的,并且它的定义是 然而,我不太清楚为什么是这个定义的一部分。据我所知,这就是本身的定义所在,但相关的留档并没有对此做太多说明。 我认为在

    • 简短版本:Symfony服务配置做什么? 最近,在Symfony项目中工作时,我在文件中输入了无效的服务定义。我收到了这个非常有用的错误消息 配置键"foo"不支持"/用户/alanStorm/站点/symfony-4/my-project/config/services.yaml"中的定义"App\Services\ServiceA"。允许的配置键是"别名"、"父"、"类"、"共享"、"合成"、

    • 问题内容: 我已经获得了WSDL文件,并且需要通过Internet使用此WSDL文件使用Web服务。我需要在Java中执行此操作。 有人可以告诉我这样做的步骤吗?我还要感谢一些有用的链接。 问题答案: 第一步是生成可以与此Web服务对话的类。看一下Axis2之类的开源解决方案。这将为您生成存根,以便您以代码与Web服务进行对话……然后,由您决定使用此服务。