簡體   English   中英

Nginx 和 PHP 容器之間的 Docker 連接被拒絕

[英]Docker Connection Refused Between Nginx And PHP Containers

我正在使用從源圖像和 nginx 官方圖像編譯的 php-fpm 創建一個集群,但是當我嘗試運行 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 netstat -an | grep :9000命令和端口是活動的:

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

有關更多詳細信息,請參閱此 github 存儲庫中的文件(帶有該圖像的 Dockerfile):

https://github.com/mayconfsbrito/docker

每個容器都有自己的本地主機

Nginx 和 PHP 運行在兩個不同的容器中,因此 PHP 不在本地主機上運行(從 Nginx 的角度來看)。

由於您的 PHP 容器名為“php”,您不想連接到這個:

fastcgi://127.0.0.1:9000

你會希望 Nginx 連接到這個:

fastcgi://php:9000

查看您在 Github 上的 repo,我相信您需要將 data/nginx/vhost.conf 中的fastcgi_pass更改為:

fastcgi_pass phpserver;

並添加一個上游來匹配。 Nginx 中的上游是一種定義您指向的另一個服務器的方法。 你可以把它放在server {}塊之外,而不是里面。

upstream phpserver {
    server php:9000
}

這樣做是在 Nginx 中定義一個上游服務器,名為phpserver 它指向端口 9000 上的主機名php 。因為你的 PHP 容器在 Docker 中被命名為php ,這是你可以用來與之對話的主機名(在 Docker 橋接網絡中)。

然后我們告訴fastcgi_pass它應該使用名為phpserver的上游服務器。

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

除非您需要從 Docker外部獨立連接到 fastcgi/PHP,否則您不需要 php 容器上的ports配置。 您只需要expose即可讓 nginx 能夠在內部與 php 對話。

您可能需要定義一個 Docker 網絡

最近我注意到有時人們需要專門創建一個 Docker 網絡來使這種場景工作。 我不確定為什么會這樣,但這里是你將如何做到這一點。

首先,創建一個網絡。 選擇您喜歡的任何名稱,我將在下面的示例中使用myapp

docker network create 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

執行此操作后,您將需要停止容器並重新啟動,以便它們接收更改。 您無需重建即可更改網絡配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM