我想做一个完全停靠的Drupal安装.我的第一步是使用基于Debian的Nginx和php5-fpm运行容器.我在CoreOS alpha频道上(使用Digital Ocean.)
我的Dockerfiles如下:
Nginx的:
FROM debian MAINTAINER fvhemert RUN apt-get update && apt-get install -y nginx && echo "\ndaemon off;" >> /etc/nginx/nginx.conf CMD ["nginx"] EXPOSE 80
这个容器构建并运行良好.我在服务器ip上看到默认的Nginx页面.
PHP5-FPM:
FROM debian MAINTAINER fvhemert RUN apt-get update && apt-get install -y \ php5-fpm \ && sed 's/;daemonize = yes/daemonize = no/' -i /etc/php5/fpm/php-fpm.conf CMD ["php5-fpm"] EXPOSE 9000
此容器也可以构建没有问题,并在启动时保持运行.
我首先启动php5-fpm容器:
docker run -d --name php5-fpm freek/php5-fpm:1
广告然后我开始Nginx ,,链接到php5-fpm:
docker run -d -p 80:80 --link php5-fpm:phpserver --name nginx freek/nginx-php:1
链接似乎工作,在/ etc/hosts中有一个名为phpserver的条目.两个码头工人都跑:
core@dockertest ~ $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fd1a9ae0f1dd freek/nginx-php:4 "nginx" 38 minutes ago Up 38 minutes 0.0.0.0:80->80/tcp nginx 3bd12b3761b9 freek/php5-fpm:2 "php5-fpm" 38 minutes ago Up 38 minutes 9000/tcp php5-fpm
我已经调整了一些配置文件.对于Nginx容器,我编辑了/ etc/nginx/sites-enabled/default并更改了:
server { #listen 80; ## listen for ipv4; this line is default and implied #listen [::]:80 default_server ipv6only=on; ## listen for ipv6 root /usr/share/nginx/www; index index.html index.htm index.php;
(我添加了index.php)
进一步说:
location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; # # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini # # # With php5-cgi alone: fastcgi_pass phpserver:9000; # # With php5-fpm: # fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
在php5-fpm docker中我更改了/etc/php5/fpm/php.ini:
cgi.fix_pathinfo=0
php5-fpm运行:
[21-Nov-2014 06:15:29] NOTICE: fpm is running, pid 1 [21-Nov-2014 06:15:29] NOTICE: ready to handle connections
我还将index.html更改为index.php,它看起来像这样(/usr/share/nginx/www/index.php):
Welcome to nginx! Welcome to nginx!
我已经从Nginx docker扫描了9000端口,它显示为已关闭.当然不是一个好兆头:
root@fd1a9ae0f1dd:/# nmap -p 9000 phpserver Starting Nmap 6.00 ( http://nmap.org ) at 2014-11-21 06:49 UTC Nmap scan report for phpserver (172.17.0.94) Host is up (0.00022s latency). PORT STATE SERVICE 9000/tcp closed cslistener MAC Address: 02:42:AC:11:00:5E (Unknown) Nmap done: 1 IP address (1 host up) scanned in 0.13 seconds
Nginx日志:
root@fd1a9ae0f1dd:/# vim /var/log/nginx/error.log 2014/11/20 14:43:46 [error] 13#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 194.171.252.110, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "128.199.60.95" 2014/11/21 06:15:51 [error] 9#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 145.15.244.119, server: localhost, request: "GET / HTTP/1.0", upstream: "fastcgi://172.17.0.94:9000", host: "128.199.60.95"
是的,那是错误的,当我浏览到我的Nginx实例时,我不断收到502错误的网关错误.
我的问题是:究竟出了什么问题?我的猜测是我错过了php配置文件中的一些设置.
编辑更多细节:这是结果(来自php5-fpm容器内部,在apt-get install net-tools之后):
root @ 3bd12b3761b9:/ #netstat -tapen
活动Internet连接
(服务器和已建立)Proto Recv-Q Send-Q本地地址
外部地址状态用户Inode PID /程序名称
从Nginx容器内部:
root @ fd1a9ae0f1dd:/ #netstat -tapen
活动Internet连接
(服务器和已建立)Proto Recv-Q Send-Q本地地址外部地址状态用户Inode PID /程序名称tcp 0 0 0.0.0.0:80 0.0.0.0:*
LISTEN 0 1875387 -
EDIT2:进步!
在php5-fpm容器中,在文件中:
/etc/php5/fpm/pool.d/www.conf
我将listen参数从某个套接字名称更改为:
listen = 9000
现在当我进入我的网页时,我收到错误:"没有指定输入文件."
可能我在某处有尾随/错误.我会仔细研究一下!
EDIT3:
所以我用上面提到的改动重建了码头工人,似乎他们正在谈论.但是,我的网页告诉我:"找不到文件." 我非常肯定它与nginx发送到php-fpm的文件有关,但我不知道它应该是什么样子.我在使用始终有效的套接字方法时使用了默认值.现在它不再起作用了.什么应该在/ etc/nginx/sites-enabled/default下位置〜.php $ {?
它不起作用的原因是,正如您自己发现的那样,nginx只将PHP文件的路径发送到PHP-FPM,而不是文件本身(这将是非常低效的).解决方案是使用第三个仅数据的VOLUME容器来托管文件,然后将其挂载到两个docker实例上.
FROM debian VOLUME /var/www CMD ['true']
构建上面的Dockerfile并创建一个实例(例如调用它:storage-www),然后使用以下选项运行nginx和PHP-FPM容器:
--volumes-from storage-www
如果您在同一物理服务器上运行两个容器,那将会有效.但是,如果将该仅数据容器放在网络文件系统(例如GlusterFS)上,您仍然可以使用不同的服务器,这非常高效且可以在大规模网络上分发.
希望有所帮助.
更新:
截至2015年,在容器之间建立持久链接的最佳方法是使用docker-compose.