同福

使用Dockerfile基于7.4-apache-buster镜像搭建php7.4微服务环境【20210512】

介绍

介绍

大家根福哥学会了使用Dockerfile创建Docker镜像的技巧了,那么我们现在搭建服务器环境就不需要再去下载软件的源代码了,也不需要编译安装了,更加不用操心软件和操作系统的各种兼容问题了。

今天福哥带着大家先安装php的环境,基于微服务思维一个Docker里面只安装最基本的软件即可,而单独的php能做的事情不多,还是需要一个web服务器搭配使用的,福哥最后选择的是就php-7.4-apache这个镜像作为基础镜像了。

镜像

tag

php:7.4-apache的tag有很多,福哥选择的是php:7.4-apache-buster版本,这个版本是基于debian操作系统的。

home/topic/2021/0508/16/7661c9aef104faf4022d5e81fd2a7307.jpg

结构

照例我们先把镜像拉取下来,然后启动一个容器,看看里面都有什么,弄明白了自己才好捣鼓啊!

拉取镜像

docker pull php:7.4-apache-buster

启动临时容器

docker run -tid --name php7.4 -h php7.4 php:7.4-apache-buster

切入临时容器

docker exec -ti php7.4 "/bin/bash"

查看目录结构

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

apache程序

root@php7:/var/www/html# ls /usr/sbin/apache*
/usr/sbin/apache2  /usr/sbin/apache2ctl  /usr/sbin/apachectl

apache配置文件

root@php7:/var/www/html# ls /etc/apache2/
apache2.conf	conf-enabled  magic	      mods-enabled  sites-available
conf-available	envvars       mods-available  ports.conf    sites-enabled

home/topic/2021/0512/11/7498aa72392a075cd360a9f977672c5b.jpg

停止临时容器

docker stop php7.4

删除临时容器

docker rm php7.4

PHP源代码

docker-php-source

如果需要源代码可以使用docker-php-source的extract命令将源代码导入到容器的/usr/src/php下面。

docker-php-source extract

用完了可以使用docker-php-source的delete命令删除掉源代码。

docker-php-source delete

PHP扩展

docker-php-ext-install

安装

安装扩展通过docker-php-ext-install命令,例如:福哥要安装mysql支持的话。

docker-php-ext-install pdo_mysql

卸载

对不起,没有!因为你不需要就不会去安装它嘛,既然安装了就得用它了!

docker-php-ext-configure

docker-php-ext-configure是用来给docker-php-ext-install安装扩展时候添加自定义参数的,正常情况下docker-php-ext-install安装扩展只会使用默认参数。

docker-php-ext-enable

启用

启用扩展通过docker-php-ext-enable命令,例如:福哥要启用mysql支持的话。

docker-php-ext-enable pdo_mysql

禁用

对不起,一样的没有,不想用就别启用咯~~

手动安装

福哥先在临时容器里面手动安装一遍环境,然后再整理到Dockerfile里面,这样大家会看得比较清楚一些~~

更新apt

我们需要安装一些工具,需要用到apt命令,用之前需要先更新一下。

apt-get update

安装依赖库和工具

部分扩展需要从外面下载,所以wget还是需要的。

apt-get -y install wget libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev libc-client-dev libkrb5-dev libzip-dev

准备安装包目录

我们还是建立一个目录用来保存软件的安装包。

mkdir /packages
cd /packages

安装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

安装mysql扩展

可以直接安装pdo_mysql扩展。

docker-php-ext-install pdo_mysql

安装完毕后使用docker-php-ext-enable启用pdo_mysql扩展。

docker-php-ext-enable pdo_mysql

安装redis扩展

使用下面的命令可以安装redis扩展。

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扩展。

docker-php-ext-enable redis

安装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

安装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

安装mongodb扩展

使用下面的命令可以安装mongodb扩展

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扩展。

docker-php-ext-enable mongodb

配置

配置文件

使用生产环境的配置文件模板复制出php.ini文件。

cd /usr/local/etc/php/
cp php.ini-production php.ini

关闭错误提示

display_errors = Off

设置错误级别

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

设置错误日志

error_log = /var/log/php_errors.log

设置时区

date.timezone = Asia/Shanghai

测试

通过执行一段代码测试时区设置和错误设置是否正确。

php -r "echo \"Now is \". date(\"Y-m-d H:i:s\"). \"\n\";bad_fun_call();"

时间

时间没有问题。

Now is 2021-05-12 12:21:50

错误日志

错误日志也没有问题。

root@php7:/usr/local/etc/php# cat /var/log/php_errors.log 
[12-May-2021 12:21:50 Asia/Shanghai] PHP Fatal error:  Uncaught Error: Call to undefined function bad_fun_call() in Command line code:1
Stack trace:
#0 {main}
  thrown in Command line code on line 1

home/topic/2021/0512/12/e7c5093b959cfc88e0c8242e52d78326.jpg

扩展模块

通过phpinfo验证

通过phpinfo查看前面安装的模块,可以看到全部都生效了。

home/topic/2021/0512/12/dfb3d097ddce434d7c6be4af49b93fb7.png

通过代码验证

验证redis扩展

php -r "var_dump(class_exists('Redis'));"

验证mongodb扩展

php -r "var_dump(class_exists('\MongoDB\Driver\Manager'));"

Dockerfile

最后福哥把前面的设置命令整理到一起写成Dockerfile,这样大家就可以通过Dockerfile安装环境了。

FROM php:7.4-apache-buster

MAINTAINER Andy Bogate
MAINTAINER tongfu@tongfu.net
MAINTAINER https://tongfu.net/dockerfile
MAINTAINER 2021/5/12
MAINTAINER v1.0.0

EXPOSE 80 443

WORKDIR /var/www/html

# env
RUN apt-get update \
&& apt-get -y install wget libc-client-dev libkrb5-dev libzip-dev

# source extract
RUN docker-php-source extract

# package build
RUN mkdir /packages

# redis extension
RUN 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 extension
RUN docker-php-ext-configure imap \
--with-kerberos \
--with-imap-ssl \
&& docker-php-ext-install imap \
&& docker-php-ext-enable imap

# zlib extension
RUN 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 extension
RUN 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

# confiugure
RUN 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 delete
RUN rm -rf /packages

# source delete
RUN docker-php-source delete

总结

今天福哥带着大家使用Dockerfile基于7.4-apache-buster镜像搭建了php7.4的微服务环境了,可以发现使用Dockerfile方式搭建环境我们真的只需要关心我们需要关心的部分,繁琐的编译参数、依赖库、环境参数等等一系列的问题基础镜像都给我们解决好了。

下一课,福哥会带着搭建学习使用Dockerfile搭建python环境,敬请期待~~