在Docker中通过Nginx的多个版本的PHP

我为PHP5.6运行两个docker容器:

docker run --name php5 \ -v /html1:/var/www/html/site1 \ -d -p 9001:9000 php:5.6-fpm 

而对于PHP7:

 docker run --name php7 \ -v /html2:/var/www/html/site2 \ -d -p 9000:9000 php:7-fpm 

我用Nginx运行Docker容器:

 docker run --name nginx-cache \ -v /nginx.conf:/etc/nginx/nginx.conf \ -v /nginx/html1:/var/www/html/site1 \ -v /nginx/html2:/var/www/html/site2 \ -v /sites-enabled:/etc/nginx/sites-enabled/ \ --link php5 --link php7 -d -p 9999:80 nginx 

nginx.conf

 user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { sendfile on; gzip on; gzip_http_version 1.0; gzip_proxied any; gzip_min_length 500; gzip_disable "MSIE [1-6]\."; gzip_types text/plain text/xml text/css text/comma-separated-values text/javascript application/x-javascript application/atom+xml; gzip_disable "msie6"; ## # Basic Settings ## server_names_hash_bucket_size 64; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; client_body_buffer_size 128k; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } 

与site1configuration:

 server { listen 80 default_server; server_name site1; root /var/www/html/site1/; index index.php index.html index.htm default.html default.htm; fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; fastcgi_read_timeout 180; location ~ \.php$ { fastcgi_pass php5:9001; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SERVER_NAME $server_name; } } 

和site2configuration:

 server { listen 80; server_name site2; root /var/www/html/site2/; index index.php index.html index.htm default.html default.htm; fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; fastcgi_read_timeout 180; location ~ \.php$ { fastcgi_pass php7:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SERVER_NAME $server_name; } } 

对site2的这个请求是200 OK,并有适当的响应:

 curl -X GET \ http://localhost:9999/index.php \ -H 'host: site2' 

而对于site1的请求:

 curl -X GET \ http://localhost:9999/index.php \ -H 'host: site1' 

在Nginx容器日志中,我总是看到:

2017/04/26 21:18:27 [错误] 7#7:* 1连接()失败(111:连接被拒绝),当连接到上游时,客户端:172.17.0.1,服务器:site1,请求:“GET /索引.php HTTP / 1.1“,上行:”fastcgi://172.17.0.3:9001“,主机:”site1“

任何想法如何解决这个将不胜感激。

好吧,我解决了这个问题,非常虚假。 出于某种原因,我认为如果我像这样公开端口9001:

 docker run --name php5 \ -v /html1:/var/www/html/site1 \ -d -p 9001:9000 php:5.6-fpm 

那么这个端口9001应该在连接到另一个php5容器的Nginx容器中使用。 这是错误的,因为暴露的networking连接不同于链接的networking连接。

所以正确的site1configuration应该是这样的(端口也是9000):

 server { listen 80 default_server; server_name site1; root /var/www/html/site1/; index index.php index.html index.htm default.html default.htm; fastcgi_buffers 8 16k; fastcgi_buffer_size 32k; fastcgi_read_timeout 180; location ~ \.php$ { fastcgi_pass php5:9000; # <-- BOOOM! fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SERVER_NAME $server_name; } }