![](/img/trans.png)
[英]cURL between Docker service php-fpm containers results in “Connection refused”
[英]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):
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
的上游服務器。
除非您需要從 Docker外部獨立連接到 fastcgi/PHP,否則您不需要 php 容器上的ports
配置。 您只需要expose
即可讓 nginx 能夠在內部與 php 對話。
最近我注意到有時人們需要專門創建一個 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.