繁体   English   中英

为什么docker容器不能在一个网络内通过ip互相访问?

[英]Why docker containers can't access each other by ip within one network?

我已经设置了 service_main流登录套接字 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 上并且它可以工作。

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

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

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

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

  1. 使用与 Docker 容器的 IP 地址通信的 ProxyServer。

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

代理服务器

proxyserver 方法的好处是您可以在另一个 docker 容器中使用 nginx,并将所有部署和网络内容放在那里。 以我在 docker 中创建的代理服务器为例,无耻的自我推销

不可路由网络

而且我总是将不可路由的网络用于内部网络,而不是 100.100.100.*

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

我的问题已通过以下步骤解决:

  1. 在 service_main 的配置中,我设置它应该将日志流式传输到套接字:100.100.100.21:6000
  2. 在 service_listener 我告诉里面的应用程序监听 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

它有帮助。

暂无
暂无

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

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