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