使用Dockerfile基于7.4-fpm-buster镜像搭建php7.4微服务
1. 介绍
1.1 介绍
大家根福哥学会了使用Dockerfile创建Docker镜像的技巧了,那么我们现在搭建服务器环境就不需要再去下载软件的源代码了,也不需要编译安装了,更加不用操心软件和操作系统的各种兼容问题了。
今天福哥带着大家先安装php的环境,基于微服务思维一个Docker里面只安装最基本的软件即可,之所以要选择fpm版本的PHP环境是因为apache版本的PHP环境不能通过docker-compose发布,这个真是硬伤啊~~毕竟apache的功能远远超过nginx+fpm的组合,这下一夜回到解放前了。。。
2. 镜像
2.1 tag
php:7.4-fpm的tag有很多,福哥选择的是php:7.4-fpm-buster版本,这个版本是基于debian操作系统的。
2.2 结构
照例我们先把镜像拉取下来,然后启动一个容器,看看里面都有什么,弄明白了自己才好捣鼓啊!
2.2.1 拉取镜像
docker pull php:7.4-fpm-buster
2.2.2 启动临时容器
启动容器的时候把9000端口映射导网关IP上去,这样可以给nginx容器拿来运行php服务。
docker run -tid --name php7.4 -h php7.4 -p 10.16.1.1:9000:9000 php:7.4-fpm-buster
2.2.3 切入临时容器
docker exec -ti php7.4 /bin/bash
2.2.4 查看目录结构
php程序
root@php7:/var/www/html# ls /usr/local/bin/php*/usr/local/bin/php /usr/local/bin/php-config /usr/local/bin/phpdbg /usr/local/bin/phpize
php配置文件
root@php7:/var/www/html# ls /usr/local/etc/php/conf.d php.ini-development php.ini-production
fpm程序和配置文件
root@php7:/var/www/html# find / -iname "*fpm*"/usr/local/etc/php-fpm.conf/usr/local/etc/php-fpm.d/usr/local/etc/php-fpm.conf.default/usr/local/sbin/php-fpm/usr/local/php/man/man8/php-fpm.8/usr/local/php/php/fpm
2.2.5 停止临时容器
docker stop php7.4
2.2.6 删除临时容器
docker rm php7.4
3. PHP源代码
3.1 docker-php-source
如果需要源代码可以使用docker-php-source的extract命令将源代码导入到容器的/usr/src/php下面。
docker-php-source extract
用完了可以使用docker-php-source的delete命令删除掉源代码。
docker-php-source delete
4. PHP扩展
4.1 docker-php-ext-install
4.1.1 安装
安装扩展通过docker-php-ext-install命令,例如:福哥要安装mysql支持的话。
docker-php-ext-install pdo_mysql
4.1.2 卸载
对不起,没有!因为你不需要就不会去安装它嘛,既然安装了就得用它了!
4.2 docker-php-ext-configure
docker-php-ext-configure是用来给docker-php-ext-install安装扩展时候添加自定义参数的,正常情况下docker-php-ext-install安装扩展只会使用默认参数。
4.3 docker-php-ext-enable
4.3.1 启用
启用扩展通过docker-php-ext-enable命令,例如:福哥要启用mysql支持的话。
docker-php-ext-enable pdo_mysql
4.3.2 禁用
对不起,一样的没有,不想用就别启用咯~~
5. 手动安装
福哥先在临时容器里面手动安装一遍环境,然后再整理到Dockerfile里面,这样大家会看得比较清楚一些~~
5.1 更新apt
我们需要安装一些工具,需要用到apt命令,用之前需要先更新一下。
apt-get update
5.2 安装依赖库和工具
部分扩展需要从外面下载,所以wget还是需要的。
apt-get -y install wget libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev libc-client-dev libkrb5-dev libzip-dev
5.3 准备安装包目录
我们还是建立一个目录用来保存软件的安装包。
mkdir /packagescd /packages
5.4 安装gd扩展
先设置一些配置参数。
docker-php-ext-configure gd --with-jpeg=/usr/include --with-freetype=/usr/include/
现在就可以安装imap扩展了。
docker-php-ext-install gd
安装完毕后使用docker-php-ext-enable启用imap扩展。
docker-php-ext-enable gd
5.5 安装mysql扩展
可以直接安装pdo_mysql扩展。
docker-php-ext-install pdo_mysql
安装完毕后使用docker-php-ext-enable启用pdo_mysql扩展。
docker-php-ext-enable pdo_mysql
5.6 安装redis扩展
使用下面的命令可以安装redis扩展。
wget http://pecl.php.net/get/redis-4.1.0.tgztar -xzvf redis-4.1.0.tgzcd redis-4.1.0/usr/local/bin/phpize./configure --with-php-config=/usr/local/bin/php-configmake && make installcd ../
安装完毕后使用docker-php-ext-enable启用redis扩展。
docker-php-ext-enable redis
5.7 安装imap扩展
先设置一些配置参数。
docker-php-ext-configure imap --with-kerberos --with-imap-ssl
现在就可以安装imap扩展了。
docker-php-ext-install imap
安装完毕后使用docker-php-ext-enable启用imap扩展。
docker-php-ext-enable imap
5.8 安装zlib扩展
修改扩展包错误。
mv /usr/src/php/ext/zlib/config0.m4 /usr/src/php/ext/zlib/config.m4
可以直接安装zlib扩展。
docker-php-ext-install zlib
安装完毕后使用docker-php-ext-enable启用zlib扩展。
docker-php-ext-enable zlib
5.9 安装mongodb扩展
使用下面的命令可以安装mongodb扩展
wget http://pecl.php.net/get/mongodb-1.7.4.tgztar -xzvf mongodb-1.7.4.tgzcd mongodb-1.7.4/usr/local/bin/phpize./configure --with-php-config=/usr/local/bin/php-configmake && make installcd ../
安装完毕后使用docker-php-ext-enable启用mongodb扩展。
docker-php-ext-enable mongodb
6. 配置
6.1 配置文件
使用生产环境的配置文件模板复制出php.ini文件。
cd /usr/local/etc/php/cp php.ini-production php.ini
6.2 关闭错误提示
display_errors = Off
6.3 设置错误级别
error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
6.4 设置错误日志
error_log = /var/log/php_errors.log
6.5 设置时区
date.timezone = Asia/Shanghai
7. 测试
通过执行一段代码测试时区设置和错误设置是否正确。
php -r "echo \"Now is \". date(\"Y-m-d H:i:s\"). \"\n\";bad_fun_call();"
7.1 时间
时间没有问题。
Now is 2021-05-24 14:02:33
7.2 错误日志
错误日志也没有问题。
root@php7:/usr/local/etc/php# cat /var/log/php_errors.log [24-May-2021 14:02:33 Asia/Shanghai] PHP Fatal error: Uncaught Error: Call to undefined function bad_fun_call() in Command line code:1Stack trace:#0 {main} thrown in Command line code on line 1
7.3 扩展模块
7.3.1 通过phpinfo验证
通过phpinfo查看前面安装的模块,可以看到全部都生效了。
7.3.2 通过代码验证
验证redis扩展
php -r "var_dump(class_exists('Redis'));"
验证mongodb扩展
php -r "var_dump(class_exists('\MongoDB\Driver\Manager'));"
8. Dockerfile
最后福哥把前面的设置命令整理到一起写成Dockerfile,这样大家就可以通过Dockerfile安装环境了。
FROM php:7.4-fpm-busterMAINTAINER Andy BogateMAINTAINER tongfu@tongfu.netMAINTAINER https://tongfu.net/dockerfileMAINTAINER 2021/5/24MAINTAINER v1.0.0EXPOSE 9000WORKDIR /var/www/html# envRUN apt-get update \&& apt-get -y install wget libc-client-dev libkrb5-dev libzip-dev# source extractRUN docker-php-source extract# package buildRUN mkdir /packages# redis extensionRUN cd /packages \&& wget http://pecl.php.net/get/redis-4.1.0.tgz \&& tar -xzvf redis-4.1.0.tgz \&& cd redis-4.1.0 \&& /usr/local/bin/phpize \&& ./configure --with-php-config=/usr/local/bin/php-config \&& make && make install \&& cd ../ \&& docker-php-ext-enable redis# imap extensionRUN docker-php-ext-configure imap \--with-kerberos \--with-imap-ssl \&& docker-php-ext-install imap \&& docker-php-ext-enable imap# zlib extensionRUN mv /usr/src/php/ext/zlib/config0.m4 /usr/src/php/ext/zlib/config.m4 \&& docker-php-ext-install zlib \&& docker-php-ext-enable zlib# mongodb extensionRUN cd /packages \&& wget http://pecl.php.net/get/mongodb-1.7.4.tgz \&& tar -xzvf mongodb-1.7.4.tgz \&& cd mongodb-1.7.4 \&& /usr/local/bin/phpize \&& ./configure --with-php-config=/usr/local/bin/php-config \&& make && make install \&& cd ../ \&& docker-php-ext-enable mongodb# confiugureRUN cd /usr/local/etc/php \&& cp php.ini-production php.ini \&& sed -i 's/display_errors\s*=.*/display_errors = Off/' php.ini \&& sed -i 's/error_reporting\s*=.*/error_reporting = E_ALL \& ~E_NOTICE \& ~E_STRICT \& ~E_DEPRECATED/' php.ini \&& sed -i 's/;error_log\s*=\s*php_errors\.log/error_log = \/var\/log\/php_errors.log/' php.ini \&& sed -i 's/;date\.timezone\s*=.*/date.timezone = Asia\/Shanghai/' php.ini# package deleteRUN rm -rf /packages# source deleteRUN docker-php-source delete
9. 总结
今天福哥带着大家使用Dockerfile基于7.4-fpm-buster镜像搭建了php7.4的微服务环境了,可以发现使用Dockerfile方式搭建环境我们真的只需要关心我们需要关心的部分,繁琐的编译参数、依赖库、环境参数等等一系列的问题基础镜像都给我们解决好了。
下一课,福哥会带着大家使用前面学到的关于Dockerfile的技巧综合到一起搭建TFUMS项目的运行环境,敬请期待~~
https://m.tongfu.net/home/35/blog/513321.html