【问题标题】:Why docker containers can't access each other by ip within one network?为什么docker容器不能在一个网络中通过ip相互访问?
【发布时间】:2021-10-14 15:32:41
【问题描述】:

我已经设置了 service_main stream 在套接字 127.0.0.1:6000 上登录
简化的 docker-compose.yml 看起来像这样:

version: "3"

networks:
  some_network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 100.100.100.0/24
          gateway: 100.100.100.1
services:
  service_main:
    image: someimage1
    networks:
      some_network:
        ipv4_address: 100.100.100.2
  
  service_listener:
    image: someimage2
    networks:
      some_network:
        ipv4_address: 100.100.100.21
    entrypoint: some_app
    command: listen 100.100.100.2:6000

我的假设是它应该可以工作,因为两个容器都属于一个网络。
但是我收到一个错误(来自 service_listener)100.100.100.2:6000 不可​​用 (我解释为该服务试图监听一些公共套接字而不是网络。)

我尝试了不同的方法,但没有深入了解:在 service_main 上公开/发布 6000 端口,或者将日志的套接字设置为 100.100.100.21:6000 并在 service_listener 中侦听 127.0.0.1:6000(也结束发布端口)。但没有任何效果。显然我不明白为什么。

在同一个网络中使用类似的方法 - powerdns 和 postgresql 工作正常 - 我在配置中告诉 powerdns db 主机位于 100.100.100.x 上并且它工作正常。

【问题讨论】:

  • listen 命令是什么?如果某物设置了网络监听器,并且您需要配置其绑定或监听地址,则通常需要在 Docker 中为 0.0.0.0
  • (我建议删除 allnetworks: 块;Compose 将为您 create a network named default 并自动分配 IP 地址。Compose 服务名称 service_main 和 @ 987654328@ 可用作主机名。)
  • @DavidMaze,只是抽象应用程序的抽象命令。您对 0.0.0.0 的评论很有帮助

标签: docker networking docker-compose


【解决方案1】:

这一切都取决于你想做什么

如果您想像容器运行的主机一样从外部访问 service_main,那么有两种方法可以解决此问题:

  1. 发布端口。这是通过 Ports 命令完成的:
services:
  service_main:
    image: someimage1
    ports:
      - "6000:4000"

在这种情况下,端口 4000 是在 Docker 容器内运行 someimage1 的端口。

  1. 使用与 Docker 容器的 IP 地址通信的代理服务器。

但是您需要确保您在 Docker 容器 (someimage1) 中运行的东西确实在端口 6000 上运行。

代理服务器

proxyserver 方法的好处在于,您可以在另一个 docker 容器中使用 nginx,并将所有部署和网络内容放入其中。 (Shameless self-promotion for an example I created of a proxyserver in docker)

不可路由的网络

对于内部网络,我总是使用 non-routable network,而不是 100.100.100.*

【讨论】:

    【解决方案2】:

    我假设当我发布/映射端口时 - 我让它不仅可用于 docker compose 网络,还可用于外部调用。

    接下来的步骤解决了我的问题:

    1. 在 service_main 的配置中,我设置它应该将日志流式传输到套接字:100.100.100.21:6000
    2. 在 service_listener 中我告诉 app 里面监听 0.0.0.0:6000 端口
      service_listener:
        image: someimage2
      networks:
        some_network:
          ipv4_address: 100.100.100.21
      entrypoint: some_app
      command: listen 0.0.0.0:6000
    

    它有帮助。

    【讨论】:

    • expose: 几乎什么都不做,你可以删除它。
    • 是的..你是对的。 :(
    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2022-01-26
    • 2016-06-01
    • 2021-01-16
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多