docker 安装 php-fpm 服务 / 扩展 / 配置的示例教程详解
在mac上用brew装php56时,因为openssl是1.1版本而导致各种google都搞不定的错误,太折腾了,现在用docker创建一个php56-fpm服务容器,nginx直装在宿主机上。
PHPDockerHub主页
创建容器
#创建容器 dockerrun-d\ --namephp56-fpm\ -p9056:9000\ -v/home/wwwroot:/var/www/html --privileged=true php:5.6-fpm
注意:
/var/www/html是phpdocker镜像的工作目录。
-v/home/wwwroot:/var/www/html的作用是将宿主机的站点目录挂载到容器上。比如/home/wwwroot/siteA,在容器中的访问位置是/var/www/html/siteA。
nignx转发php请求时,会将执行的脚本名SCRIPT_NAME和脚本文件名SCRIPT_FILENAME转发给fpm,而后fpm去读取脚本执行。
在使用fpm容器时,需要注意nginx转发的SCRIPT_FILENAME是否是fpm容器中的有效站点路径,如果nginx的root并不能直接映射至fpm容器的站点root,我们需要在phplocation中重新定义为fpm容器的站点root。这样fpm才能正确的读取到脚本。
即宿主机上的/home/wwwroot/siteA/public/index.php要转为/var/www/html/siteA/public/index.php发送给fpm容器,否则会报Filenotfound的错误。
所以nginx配置server时要注意如下的卷路径转换:
server{ listen8056; .... #宿主机的站点根目录 root/home/wwwroot/siteA/public; location~*(^[/]*.php)[/|$]{ #容器中的站点根目录 root/var/www/html/siteA/public; pass_proxy:127.0.0.1:9056; includefastcgi.conf; } }
不过一般情况下大家都是dockernginx+dockerphp-fpm,两个容器都统一映射了站点目录,就不会有这个问题了。这里的nginx是直接装在宿主机上才导致nginx转发php请求时需要重新定义下站点的根目录。
登陆容器
#查看容器是否运行 dockerps #登陆容器 dockerexec-itphp56-fpm/bin/bash
php的docker镜像是基于ubuntu我们可以使用apt-get安装需要的工具,比如vim/vilrzsznet-tools之类的。
#在使用apt-get安装一些工具前,需要update更新一下源 #否则会apt-getE:Unabletolocatepackage apt-getupdate apt-getinstallvim
安装php/pecl扩展
安装php扩展
即php官方扩展,比如shomp这种自带但默认不开启的扩展。
#查看自带了那些扩展 cd/usr/local/php/ext&&ls-l #安装扩展 dcoker-php-ext-installshmop
安装pecl扩展
容器中是有安装pecl的,所以直接使用pecl安装即可,注意扩展对php版本的支持即可。
docker-php-ext-enable的主要用途是生成扩展相应的配置文件到/usr/local/etc/php/conf.d/docker-php-ext-{extName}.ini方便php加载扩展。
#igbinaryphp5.6最高版本是2.0.8 peclinstalligbinary-2.0.8 docker-php-ext-enableigbinary #phpredisphp5.6最高版本是4.3.0 peclinstallredis-4.3.0 docker-php-ext-enableredis #swoolephp5.6最高版本是2.0.11 pcelinstallswoole-2.0.11 docker-php-ext-enableswoole
php/php-fpm配置
/usr/local/etc是php容器的配置目录,里面自带了php及php-fpm的配置文件,配置目录结构如下:
root@aa739592b579:/usr/local#treeetc/ etc/ |--pear.conf |--php#php配置目录 ||--conf.d#php扩展配置 |||--docker-php-ext-shmop.ini ||--php.ini#cp的php.ini-development/production ||--php.ini-development ||--php.ini-production |--php-fpm.conf#php-fpm的配置自带的主要是引入php-fpm.d |--php-fpm.conf.default#php-fpm配置本体同php-fpm.d/www.conf一致 |--php-fpm.d#php-fpm的扩展配置 |--docker.conf |--www.conf#php-fpm配置本体模式啊max/minchildren啊都在这里 |--zz-docker.conf
你可映射宿主机的配置目录到容器的/usr/local/etc,但要注意宿主机上的配置目录与容器现有的要保持一致,或者直接在容器里编辑配置文件。按docker的理念我们应该在宿主机上维护一份配置文件映射到容器的配置目录上,这样才能发挥出docker容器的复用性。
映射宿主机的php配置文件到容器
-v/opt/docker/conf/php/php.ini:/usr/local/etc/php/php.ini -v/opt/docker/conf/php/php-fpm.ini:/usr/local/etc/php-fpm.d/www/conf
常见问题
1、Filenotfound
nginx指定的站点根目录无法直接映射给fpm容器,在location中重新指定fpm容器的站点根目录。
2、apt-getE:Unabletolocatepackage
执行apt-getupdate刷新一下源即可。
3、容器的相关约定
工作目录:/var/www/html建议将宿主机的站点目录映射至此目录
配置目录:/usr/local/etc注意配置目录结构
php扩展目录:/usr/local/php/ext可以查看php自带的扩展包使用docker-php-ext-install安装更方便
到此这篇关于docker安装php-fpm服务/扩展/配置的文章就介绍到这了,更多相关docker安装php-fpm内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!