php - Docker:容器之间无法通信

标签 php node.js docker nginx proxy

我有一个 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 (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
  • 找出您的 Swarm 管理器 Node 的 IP 地址(通常是 192.168.99.100 ): docker-machine ip managerdocker-machine ls 。通过添加 sudo vi /private/etc/hosts 编辑主机文件(在 Mac 上为 192.168.99.100 project.dev )和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

最佳答案

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

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

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

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

关于php - Docker:容器之间无法通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47340196/

相关文章:

node.js - 尝试使用nodejs expressjs mongodb找出post和get方法的解决方案

node.js - 用于单独的 Vue 前端和 Express 后端的 NGINX 设置

node.js - 为什么异常堆栈中的根条目会根据上下文而有所不同?

linux - 使用不带 sudo 的 docker-compose 不起作用

php - Laravel 工作人员不尝试工作而是删除它

php - laravel 4 创建模块并将 Controller 、模块和 View 放入模块中

ruby - 无法使用 ruby​​ gem 安装 sass。无法构建 gem native 扩展

docker - 如何在docker启动时删除/禁用docker0网桥

php - PHP 中带有 $_REQUEST 的 URL 值

javascript - 单击带有 getElementById 的表单提交后显示弹出窗口