无法连接到在docker容器内运行的套接字服务器

时间:2016-10-11 15:57:25

标签: php sockets nginx docker dockerfile

我有一个docker compose文件,它结合了nginx和php,如下所示:

nginx:
  image: nginx
  ports:
    - "80:80"
    - "2443:2443"
  links:
    - phpfpm
  volumes:
    - ./nginx/anonymous.conf:/etc/nginx/conf.d/anonymous.conf
    - ./logs/nginx-error.log:/var/log/nginx/error.log
    - ./logs/nginx-access.log:/var/log/nginx/access.log
    - ./public:/usr/share/nginx/html

phpfpm:
  image: php:fpm
  expose:
   - "2443"
  volumes:
    - ./public:/usr/share/nginx/html

我可以在我已经制作的虚拟主机的浏览器上看到我的网站index.php页面,让我们说anonymous.com

现在在我的phpfpm容器中,我启动了一个基于Ratchet的套接字服务器,它正在侦听端口2443

// bin/server.php
$webSocketServer = new WsServer(new Chat());
$server = IoServer::factory(
        new HttpServer($webSocketServer), 2443);
$server->run();

这就是我在phpfpm容器

中运行服务器的方式
php /usr/share/nginx/html/bin/server.php 

我的理解是,因为我已经公开2443并且我的ngnixphpfpm容器已关联。我可以通过转到phpfpm

连接到telnet anonymous.com 2443容器上运行的套接字服务器

但它没有联系。这是输出

$ telnet anonymous.com 2443
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

请注意,以前当我同时使用nginx和php-fpm在单个容器上时,每件事都运行正常。所以我确信PHP没有任何问题。它只是我无法弄清楚如何从外部世界访问套接字服务器。

由于

更新 如果我使用我的phpfpm容器ip并通过浏览器端口2443使用它,它的工作正常。但问题是我不能依靠容器ip作为它的全部动态。

2 个答案:

答案 0 :(得分:1)

使用基于Ratchet的套接字服务器时,我遇到了类似的问题(相同的输出)。我的只是一个PHP容器(=没有nginx / apache / ...)。 这是因为给了工厂的第三个参数:

$server = IoServer::factory(
  new HttpServer($webSocketServer), 2443, '127.0.0.1'
);

删除127.0.0.1(然后使用默认的0.0.0.0值)可以解决此问题。

答案 1 :(得分:0)

您应该使用服务名称作为主机名。因此,要从nginx连接到phpfpm,请使用phpfpm:2443