在macOS上与Docker Desktop的WebSocket连接失败(适用于Linux)

k3bvogb1  于 2023-10-20  发布在  Mac
关注(0)|答案(1)|浏览(215)

docker-compose.yml

services:
  container-php:
    environment:
      - APP_ENV=dev
      - SSH_AUTH_SOCK=/ssh-agent
    build:
      context: ./container-php
    volumes:
      - ${path}:/var/www/project
      - ./cephfs:/cephfs
    image: container-php
    container_name: container_php
    cap_add:
      - NET_ADMIN
    networks:
      net:
        ipv4_address: 192.168.129.3
    ports:
      - "8080:8080"
networks:
  net:
    ipam:
      config:
        -   subnet: 192.168.129.0/24

WebSocket服务器从container-php容器中启动,可以通过地址192.168.129.3:8080访问。
当尝试使用Postman与地址ws://www.example.com进行连接时192.168.129.3:8080/,等待大约20秒后无法建立连接。但是,如果我从同一个容器中向WebSocket地址发送一条消息,它会完美地工作,并且我会按预期接收到每条消息。
该问题似乎与从容器外部访问WebSocket有关。我需要这是通过浏览器或 Postman 从我的本地计算机访问。
此Docker Compose配置在Linux机器上正常运行。我甚至可以192.168.129.3从本地终端ping www.example.com。在macOS上,ping命令不起作用。
如何将此IP暴露给本地macOS环境?
我使用最新的Docker Desktop for macOS版本。
编辑:我将端口设置为8080:8080,现在我可以通过ws://0.0.0.0:8080连接到WS。任何想法如何使它通过www.example.com工作192.168.129.3?

lf5gs5x2

lf5gs5x21#

Docker内部的IP地址是不可用的,除了在一个非常特定的设置(一个本地Linux主机直接运行Docker引擎,没有Docker Desktop或其他基于VM的设置)。你不能连接到它们,你永远不需要查找它们,你几乎永远不需要设置它们。
从主机连接到容器的正确方法是发布ports:。第二个ports:数字需要匹配容器中的进程正在使用的内容。从容器外部但与容器位于同一系统上,连接到localhost和第一个ports:号码。在您的示例中,您已经发布了端口8080,因此您将连接到ws://localhost:8080ws://127.0.0.1:8080
容器之间的连接可以使用Docker提供的DNS系统来查找其他容器信息。在这种能力和容器私有IP地址不可访问之间,您永远不需要知道或设置它们。我还建议删除文件中的所有networks:块,包括顶层和容器定义。
Docker Desktop运行隐藏的Linux VM。如果你在原生Linux主机上成功地使用了容器私有IP地址,这只能在Docker运行的同一个系统上工作,而在Docker Desktop中,“同一个系统”约束意味着“只能从Linux VM内部”。Desktop不会设置任何IP转发或路由,使内部IP地址可以从其他任何地方访问。

相关问题