$ alias composer="docker run i t v \$PWD:/srv ubermuda/composer"
现在你可以初始化Symfony工程了:
$ composer createproject symfony/framworkstandardedition SomeProject
帅呆了!下面来点实在的工作。(省略了博主自娱自乐的一堆balabla....原文:Awesome. Give yourself a highfive, get a cup of coffee or whatever is your liquid drug of choice, and get ready for the real work.)
RUN aptget update y
RUN aptget install y nginx php5fpm php5mysqlnd php5cli mysqlserver supervisor
RUN sed e 's/;daemonize = yes/daemonize = no/' i /etc/php5/fpm/phpfpm.conf
RUN sed e 's/;listen\.owner/listen.owner/' i /etc/php5/fpm/pool.d/www.conf
RUN sed e 's/;listen\.group/listen.group/' i /etc/php5/fpm/pool.d/www.conf
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN sed e 's/;daemonize = yes/daemonize = no/' i /etc/php5/fpm/phpfpm.conf
RUN sed e 's/;listen\.owner/listen.owner/' i /etc/php5/fpm/pool.d/www.conf
RUN sed e 's/;listen\.group/listen.group/' i /etc/php5/fpm/pool.d/www.conf
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
这里我们要做两件事。 首先配置PHP5FPM和Nginx让他们在前台运行以便supervisord可以追踪到他们。
然后,配置PHP5FPM以指定的用户运行WebServer,并处理好文件权限。
$ cd dockersymfony
$ docker build t symfony .
现在,可以使用它来运行你的Symfony工程了:
$ cd SomeProject
$ docker run i t P v $PWD:/srv symfony
我们来看看这一连串的选项分别是干嘛的:
i 启动交互(interactive)模式, 也就是说,STDIO(标准输入输出)连接到了你当前的终端上。当你要接收日志或者给进程发送信号时,它很有用。
t 为容器创建一个虚拟TTY, 它跟i是好基友,通常一起使用。
P 告诉Docker守护进程发布所有指定的端口, 本例中为80端口。
v $PWD:/srv 把当前目录挂载到容器的/srv目录。挂载一个目录使得目录内容对目标挂载点可用。
现在你还记得之前提到的DB_NAME和INIT环境变量了吧,干嘛用的呢:用于自定义你的环境。 基本上你可以通过 docker run的e选项在容器中设置环境变量,启动脚本会拿到环境变量,因此,如果你的DB名为some_project_dev, 你就可以这么运行容器:
$ docker run i t P v $PWD:/srv e DB_NAME=some_project_dev symfony
INIT 环境变量就更强大了,它允许你启动时运行指定的脚本。比如, 你有一个bin/setup脚本运行composer install命令并且设置数据库schema:
#!/bin/bash
composer install
app/console doctrine:schema:update force
用e来运行它:
$ docker run i t P \
v $PWD:/srv \
e DB_NAME=some_project_dev \
e INIT=bin/setup
注意,e选项可以在docer run中多次使用,看起来相当酷。另外,你的启动脚本需要可执行权限(chmod +x)。
$ curl http://localhost:49153
You are not allowed to access this file. Check app_dev.php for more information.
当我们不从localhost(译者注:容器的localhost)访问dev controller时,得到了Symfony的默认错误消息,这再正常不过了, 因为我们不是从容器内部发送 curl 请求的, 所以,可以安全的从前端控制器web/app_dev.php中移除这些行。
// This check prevents access to debug front controllers that are deployed by accident to production servers.
// Feel free to remove this, extend it, or make something more sophisticated.
if (isset($_SERVER['HTTP_CLIENT_IP'])
|| isset($_SERVER['HTTP_X_FORWARDED_FOR'])
|| !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1')) || php_sapi_name() === 'cliserver')
) {
header('HTTP/1.0 403 Forbidden');
exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}
这些行阻止了任何从localhost以外的地方访问dev controller。
现在再curl的时候就可以正常工作了,或者用浏览器访问 http://localhost:49153/: