8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

有没有办法将绑定到 127.0.0.1 的 docker 容器端口公开给主机?

molbdnilo 2月前

85 0

我在一个绑定到 127.0.0.1:8888 的容器内运行一个服务。我想向主机公开这个端口。docker-compose 支持这个功能吗?我在 docker-compose.yml 中尝试了以下内容,但没有成功。

我在容器内运行一个服务,该服务绑定到 127.0.0.1:8888 .
我想将这个端口公开给主机。
docker-compose 支持这个吗?

我尝试了以下操作, docker-compose.yml 但没有效果。

expose: 
  - "8888"
ports:
  - "8888:8888"

PS 在我看来,将服务绑定到容器内的 0.0.0.0 是不可能的。


更新:提供一个简单的例子:

docker-compose.yml

version: '3'
services:  
  myservice:
    expose: 
      - "8888"
    ports:
      - "8888:8888"
    build: .

Dockerfile

FROM centos:7
RUN yum install -y nmap-ncat
CMD ["nc", "-l", "-k", "localhost", "8888"]

命令:

$> docker-compose up --build
$> # Starting test1_myservice_1 ... done
$> # Attaching to test1_myservice_1

$> nc -v -v localhost 8888
$> # Connection to localhost 8888 port [tcp/*] succeeded!
TEST
$>

在控制台中 TEST 输入后, 连接已关闭 ,这意味着 尽管最初显示成功消息,但 端口并未真正暴露
但是如果我绑定到容器内的 0.0.0.0(而不是 localhost),一切都正常工作。

帖子版权声明 1、本帖标题:有没有办法将绑定到 127.0.0.1 的 docker 容器端口公开给主机?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由molbdnilo在本站《docker》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 通常答案是否定的,在几乎所有情况下,您都应该重新配置应用程序以监听 0.0.0.0。任何试图避免更改应用程序以监听容器内所有接口的行为都应被视为一种黑客行为,会给您的项目增加技术负担。


    扩展我的评论,每个容器默认都在自己的网络命名空间中运行。容器内的环回接口与主机和其他容器上的环回接口是分开的。因此,如果您在容器内监听 127.0.0.1,则该网络命名空间之外的任何东西都无法访问该端口。这与在您的虚拟机上监听环回并尝试从另一个虚拟机连接到该端口没有什么不同,Linux 不允许您连接。

    有几种解决方法:

    1. 您可以破解 iptables 来转发连接,但我个人会避免这样做。Docker 很大程度上依赖于对 iptables 规则的自动更改,因此您可能会与该自动化发生冲突或在下次重新创建容器时发生故障。
    2. 您可以在容器内设置一个代理,监听所有接口并转发到环回接口。类似 nginx 的东西就可以工作。
    3. 您可以在同一个网络命名空间中获取事物。

    最后一种有两种实现方式。在容器之间,你可以在另一个容器的网络命名空间中运行一个容器。这通常用于调试网络,也是 Pod 在 kubernetes 中的工作方式。以下是运行第二个容器的示例:

    $ docker run -it --rm --net container:$(docker ps -lq) nicolaka/netshoot /bin/sh
    / # ss -lnt
    State       Recv-Q Send-Q        Local Address:Port    Peer Address:Port
    LISTEN      0      10                127.0.0.1:8888                  *:*
    LISTEN      0      128             127.0.0.11:41469                  *:*
    / # nc -v -v localhost 8888
    Connection to localhost 8888 port [tcp/8888] succeeded!
    TEST
    / #
    

    注意 --net container:... (我过去常常 docker ps -lq 在我的实验室中获取最后启动的容器 ID)。这使得两个单独的容器在同一个命名空间中运行。

    如果你需要从 docker 外部访问它,你可以删除网络命名空间,并将容器直接连接到主机网络。对于一次性容器,可以使用

    docker run --net host ...
    

    在撰写时,这看起来像:

    version: '3'
    services:  
      myservice:
        network_mode: "host"
        build: .
    

    您可以 在此处查看有关此选项的 docker compose 文档 。此功能在 Swarm 模式下不受支持,并且您不会在此模式下发布端口,因为您将尝试在相同的网络命名空间之间发布端口。

    附注: expose 所有这些都不需要。它仅用于文档和一些自动化工具,但除此之外不会影响容器到容器的网络,也不会影响发布特定端口的能力。

返回
作者最近主题: