docker安装部署时的资源文件路径问题以及使用pecl工具简洁方便地安装php扩展
一、docker安装部署时的资源文件路径问题
在使用docker时,会遇上这样的情况,比如用户上传的一些图片资源等文件,直接放在代码里面肯定是不合适的,而如果使用一些软链接将资源链接至其它目录下之后你可能会遇到PHP能找到目录,但是nginx找不到目录,因为在docker容器中nginx的默认www目录是/usr/share/nginx/html/,而php的默认目录是/var/www,因此就会造成在加载文件时出现其中一个应用程序才能加载到,当然这问题可以解决,而你越早知道这个问题,就可以越早避免先进行了一些部署操作然后重新来进行修改处理。
解决方法一是统一nginx和php的默认目录名称,这里要注意必须是两个容器都存在的路径;二是可以在启动nginx和php的时候挂载一个相同名字的目录,这样这个目录即能存放上传的资源,又能让nginx访问到此目录。当然这里的前提是已经使用了软链接将资源从代码文件夹中移出。
#启动nginx的完整命令
docker run --name nginx-007-cn -d -p 80:80 \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf.d:/etc/nginx/conf.d \
-v /data/nginx/log:/var/log/nginx \
-v /opt/www-data/007.cn/now_version:/usr/share/nginx/html \
-v /opt/www-data/007.cn/04007_share_dir:/home/007_share_dir \
-v /opt/www-data/007.cn/04007_fix_code:/home/007_fix_code \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
nginx-007
#启动php的完整命令
docker run --name php-007-cn -d -p 9000:9000 \
-v /opt/www-data/007.cn/now_version:/var/www \
-v /data/php/php-fpm.conf:/usr/local/etc/php-fpm.conf \
-v /data/php/php-fpm.d:/usr/local/etc/php-fpm.d \
-v /data/php/php:/usr/local/etc/php \
-v /data/php/log:/var/log/php \
-v /opt/www-data/007.cn/007_share_dir:/home/007_share_dir \
-v /opt/www-data/007.cn/007_fix_code:/home/007_fix_code \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
php-04007
另外在使用docker的时候也遇到了一点不爽的事情,比如我们加载一个镜像搭建启动了一个容器,这时如果要更新容器的启动命令,必须要重新启一个新的容器,此时如果在容器中有安装一些比如php扩展之类的东西,对不起,就都丢了,即不能动态变更启动命令!哪怕是一些没其它影响的变更,比如我增加一个挂载目录,这挺恼火。不过也不是没有解决办法,要记得在删掉不用的但有扩展更新后面又要用的容器时对其进行保存新镜像即可。另外在docker和主机之间需要文件传输时可以使用docker的复制,但没有mv剪切命令,使用如下:
#从主机复制到容器
docker cp server_path containerID:container_path
#从容器复制到主机
docker cp containerID:container_path server_path
二、使用pecl工具简洁方便地安装php扩展
phpize是一个常用的php扩展安装方式,但通过此方式安装需要下载对应的包、phpize,configure,make,make install等,而相比于phpize方式,pecl方式安装php扩展更为简便,我们不用去寻找源码包、下载、编译、安装配置,一个命令搞定,甚至都不用手动编辑php.ini文件。PECL的全称是The PHP Extension Community Library,是一个开放的并通过PEAR(PHP Extension and Application Repository,PHP 扩展和应用仓库)打包格式来打包安装的 PHP扩展库仓库。通过 PEAR 的 Package Manager 的安装管理方式,可以对PECL模块进行下载和安装。
pecl安装及使用如下:
#ubuntu下安装pecl工具:
apt install php-dev php-pear autoconf automake libtool -y
#centos下安装pecl工具:
yum install php-dev php-pear autoconf automake libtool -y
#也可以使用php安装pecl工具
cd /usr/local/php/bin/
wget http://pear.php.net/go-pear.phar -O go-pear.php
php go-pear.php
#pecl搜索一个扩展:xdebug,
root@us12:~# pecl search xdebug
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
Retrieving data...0%
Matched packages, channel pecl.php.net:
=======================================
Package Stable/(Latest) Local
xdebug 2.8.0 (stable) Provides functions for function traces and profiling
#列出所有的channels
root@us12:~# pecl list-channels
Registered Channels:
====================
Channel Alias Summary
doc.php.net phpdocs PHP Documentation Team
pear.php.net pear PHP Extension and Application Repository
pecl.php.net pecl PHP Extension Community Library
__uri __uri Pseudo-channel for static packages
#执行提示的update操作
root@us12:~# pecl channel-update pecl.php.net
Updating channel "pecl.php.net"
Update of Channel "pecl.php.net" succeeded
#执行之后就不会再提示了
root@us12:~# pecl search xdebug
Retrieving data...0%
Matched packages, channel pecl.php.net:
=======================================
Package Stable/(Latest) Local
xdebug 2.8.0 (stable) Provides functions for function traces and profiling
#pecl安装扩展
root@us12:~# pecl install swoole
pecl有很多命令,可以通过pecl help查看,常用命令如下:
build 从C的源码中构建扩展
install 安装扩展
uninstall 卸载扩展
download 下载扩展包
list-all 列出全部扩展
run-tests 运行测试
upgrade 升级扩展
upgrade-all 升级所有扩展
安装时会提示:
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update,
显示pecl.php.net更新了协议,可使用命令进行更新channels。另外在启动phpP时偶尔遇到这种报错:
PHP Startup: Unable to load dynamic library '/usr/lib/php/20160303/phalcon.so' - /usr/lib/php/20160303/phalcon.so: undefined symbol: php_pdo_get_dbh_ce in Unknown on line
原来是在php.ini中写死的extension=phalcon.so的位置导致的。因为phalcon依赖于json扩展,在php.ini配置文件头部写上extension导致报错,解决方法可以把phalcon的加载放至最后,也可以使用目录加载。在conf.d中新建phalcon.ini文件写入extension=内容,让php根据依赖等自动加载。