当前位置:  开发笔记 > 编程语言 > 正文

Nginx和PHP容器之间拒绝Docker连接

如何解决《Nginx和PHP容器之间拒绝Docker连接》经验,为你挑选了1个好方法。

我正在使用从源图像和nginx官方图像编译的php-fprm创建一个集群,但是当我尝试运行一个phpinfo()文件时,nginx会返回以下错误:

*5 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1:8000"

docker-compose.yml文件:

version: '2'
services:
  php:
    restart: always
    build: data/php
    image: php:7.1
    ports:
      - "9000:9000"
    expose:
      - 9000
    volumes:
      - ./app:/usr/share/nginx/html
  web:
    restart: always
    build: data/nginx
    image: nginx:1.10.2
    ports:
      - "8000:80"
    links:
      - php
    volumes:
      - ./data/nginx/vhost.conf:/etc/nginx/conf.d/default.conf
      - ./data/nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./app:/usr/share/nginx/html
      - ./data/log/nginx:/var/log/nginx

我检查了主机中的9000端口,netstat -an | grep :9000命令和端口是活动的:

tcp6       0      0 :::9000                 :::*                    OUÇA

有关更多详细信息,请参阅此github存储库中的文件(使用该图像的Dockerfile):

https://github.com/mayconfsbrito/docker



1> Dan Lowe..:

每个容器都有自己的localhost

Nginx和PHP在两个不同的容器中运行,因此PHP不在localhost上运行(从Nginx的角度来看).

由于您的PHP容器名为"php",因此您不希望连接到此:

fastcgi://127.0.0.1:9000

您可能希望Nginx连接到此:

fastcgi://php:9000

看看你在Github上的回购,我相信你需要将fastcgi_passdata/nginx/vhost.conf更改为:

fastcgi_pass phpserver;

并添加上游匹配.Nginx中的上游是一种定义您指向的另一台服务器的方法.你会把此之外的的server {}块,而不是内部.

upstream phpserver {
    server php:9000
}

这样做是在Nginx中定义一个名为的上游服务器phpserver.这指向php端口9000上的主机名.因为您的PHP容器php在Docker中命名,这是您可以用来与它通信的主机名(在Docker桥接网络中).

然后我们告诉fastcgi_pass它应该使用上游服务器调用phpserver.

"ports"只需要暴露Docker之外的端口

除非您需要从Docker 外部独立连接到fastcgi/PHP,否则您不需要portsphp容器上的配置.你只需expose要让nginx能够在内部与php交谈.

您可能需要定义Docker网络

最近我注意到有时候人们需要专门创建一个Docker网络才能使这种场景发挥作用.我不确定为什么会这样,但是你会怎么做.

首先,创建一个网络.选择你喜欢的任何名字,我将myapp在下面的例子中使用.

docker create network myapp

您现在应该看到这个新网络docker network ls:

$ docker network ls
NETWORK ID          NAME                DRIVER       SCOPE
c39b88eb8450        bridge              bridge       local
175efb89adef        docker_default      bridge       local
b34434cc8b1c        myapp               bridge       local

接下来,告诉docker-compose使用此网络.将此块添加到docker-compose.yml文件的底部.它位于YAML的顶层,意味着它应该从左边距开始,而不是缩进.

networks:
  default:
    external:
      name: myapp

执行此操作后,您将需要停止容器并重新启动,以便他们获取更改.您无需进行重建即可更改网络配置.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有