从 Docker 桌面中的 Linux 容器中按名称引用 Windows 容器

时间:2021-05-31 14:28:58

标签: linux windows docker networking docker-compose

我有 2 个 Windows 容器和 2 个 Linux 容器,我试图在 Docker 桌面上协同工作。我有单独的撰写文件,当我“撰写”两者时(使用介于两者之间的“切换到 Windows/Linux 容器...”),它们可以使用它们的内部 IP 地址进行通信得到了。 但是,当我尝试使用撰写文件的服务名称时,它们找不到彼此。

关于撰写文件的 networking: 部分,我已经尝试了任何我能想到的方法,以尝试将它们放在同一网络中:

  • 在两个撰写文件中使用相同的网络名称
  • 在两者中使用相同的网络名称,但声明一个 external
  • 自定义名称,使用和不使用 defaultexternal

(基本上,我尝试了所有提到的in this Stackoverflow question

正如 this question 中所提到的,Windows 上下文似乎无法看到 Linux 上下文。如果一侧有网络 external,您会收到网络未知的错误。如果两者都定义了相同的网络名称(不使用 external),那么它们仍然看不到对方。

下面的两个示例撰写文件说明了这个问题。 linuxservicenodered 无法引用 winservice,但可以通过其内部 IP 地址访问该容器。从 nodered 尝试 localhost:9340 也不起作用,并导致“连接被拒绝”错误。

为我的 Linux 容器编写文件:

version: "3.7"

services:
    linuxservice:
        image: myregistry/mycontainer:development
        ports: 
            - 8080:8080
    nodered:
        image: nodered/node-red
        ports: 
            - 1880:1880
        volumes:
            - 'C:/data/Docker/nr-volume:/data'

networks:
    default:
        name: docker-net

为我的 Windows 容器编写文件:

version: '3.1'

services:
  windb:
    image: myregistry/olmysql:v2
    ports:
      - 3306:3306

  winservice:
    image: myregistry/connect:latest
    ports:
      - 9340:9340
    depends_on:
      - windb
  
networks: 
  default:
    name: docker-net

有什么方法可以让这些容器通过名称而不是 IP 地址进行通信? 假设没有办法让它们在一个网络中,是否有可能在两个网络中的任何一个网络中创建某种 DNS?或者有没有办法让他们使用localhost:9340

1 个答案:

答案 0 :(得分:0)

当然,我发现一些东西至少在我发布问题后立即起作用。

按照建议使用 host.docker.internal:9340 至少可以避免使用 IP 地址。

我暂时不回答这个问题,以防万一有人知道如何让 Linux 和 Windows 网络看到彼此的服务。