Docker:无法在容器之间进行通信

时间:2017-11-16 22:29:25

标签: php node.js docker nginx proxy

我有一个Docker设置,包含一个php-fpm容器,一个节点容器和一个用作代理的nginx容器。现在在浏览器(http://project.dev)中,php容器响应json,就像我期望的那样。都好。但是,当我从节点容器向此php容器(view code)发出请求时,我在请求中收到错误:ECONNRESET。显然,节点容器无法与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 (view file)

的修剪版本
nginx:
  depends_on:
    - php-fpm
    - node
  networks:
    - app
  ports:
    - 80:80

php-fpm:
  networks:
    - app

node:
  networks:
    - app

networks:
  app:
    driver: overlay

nginx.conf (view file)

的修剪版本
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 (view file)

FROM php:7.1-fpm-alpine

WORKDIR /var/www

EXPOSE 9000

CMD ["php-fpm"]

提出错误的请求

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

如何重现

  • Create a swarm manager (and a worker) node
  • 找出您的群组管理器节点的IP地址(通常为192.168.99.100):docker-machine ip managerdocker-machine ls。通过添加sudo vi /private/etc/hosts192.168.99.100 project.dev
  • 来修改您的主机文件(在Mac上,192.168.99.100 api.project.dev
  • git clone https://github.com/thomastilkema/docker-nginx-php-fpm-node project
  • cd project ./scripts/up.sh
  • 查看容器的日志:docker logs <container-id> -f

1 个答案:

答案 0 :(得分:0)

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

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

通过nginx容器,将HTTP请求转换为FastCGI

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