Docker:容器之间无法通信

3
我有一个 Docker 设置,其中包括一个 php-fpm 容器、一个 node 容器和一个作为代理的 nginx 容器。现在在浏览器中(http://project.dev),php 容器响应了像我预期的那样的 json。一切都很好。然而,当我从 node 容器向此 php 容器发出请求(view code)时,我会在请求上收到一个错误:ECONNRESET。因此,显然,node 容器无法与 php 容器通信。nginx 错误似乎没有添加任何条目。
Error: read ECONNRESET at _errnoException(util.js: 1031: 13) at TCP.onread(net.js: 619: 25)
errno: 'ECONNRESET',
code: 'ECONNRESET',
syscall: 'read'

有什么想法吗?

我已经创建了一个 Github 仓库:https://github.com/thomastilkema/docker-nginx-php-fpm-node

docker-compose.yml(查看文件) 的精简版本

nginx:
  depends_on:
    - php-fpm
    - node
  networks:
    - app
  ports:
    - 80:80

php-fpm:
  networks:
    - app

node:
  networks:
    - app

networks:
  app:
    driver: overlay

削减版的nginx.conf (查看文件)

http {
  upstream php-fpm {
    server php-fpm:9000;
  }

  upstream node {
    server node:4000;
  }

  server {
    listen 80 reuseport;
    server_name api.project.dev;

    location ~ \.php$ {
      fastcgi_pass php-fpm;
      ...
    }
  }

  server {
    listen 80;
    server_name project.dev;

    location / {
      proxy_pass  http://node;
    }
  }
}

php-fpm/Dockerfile(查看文件)

FROM php:7.1-fpm-alpine

WORKDIR /var/www

EXPOSE 9000

CMD ["php-fpm"]

出现错误的请求

const response = await axios.get('http://php-fpm:9000');

如何复现

  • 创建一个Swarm管理节点(和一个工作节点)
  • 查找您的Swarm管理节点的IP地址(通常为192.168.99.100):docker-machine ip managerdocker-machine ls。通过添加192.168.99.100 project.dev192.168.99.100 api.project.dev编辑您的主机文件(在Mac上,sudo vi /private/etc/hosts
  • git clone https://github.com/thomastilkema/docker-nginx-php-fpm-node project
  • cd project ./scripts/up.sh
  • 查看容器的日志:docker logs <container-id> -f
1个回答

1

ECONNRESET 是指连接的另一端关闭,通常可以归因于协议错误。

FastCGI进程管理器(FPM)使用 FastCGI协议传输数据。

通过nginx容器进行转发,将HTTP请求转换为FastCGI。

axios.get('http://nginx/whatever.php')

谢谢Matt,这确实解决了我的问题。现在我得到了我期望的响应。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接