参考 https://www.w3cschool.cn/docker/docker-install-php.html

访问PHP镜像库地址: https://hub.docker.com/_/php?tab=tags

下PHP官方的镜像

常用版本
php:5.6-fpm
php:7.2-fpm
php:fpm

docker pull php:fpm
docker images
docker inspect php:fpm
PHP版本为 7.4.6

此镜像主要是提供PHP-FPM服务,当然它也包含了PHP程序,我们需要挂载项目目录到容器里面,可能需要修改里面的PHP配
置文件和PHP-FPM配置文件,但是改动的频率极低,所以没必要挂载配置文件。需要修改配置的话,可以在容器中安装vim来
编辑。

mkdir -p /data/www/quwan

使用bridge网络启动
docker run --name php-fpm -p 9000:9000 -v /data/www/quwan:/www  -d php:fpm

使用host网络启动
docker run --name php-fpm --network host -v /data/www/quwan:/www -d php:fpm

docker ps

进入容器
docker exec -it php-fpm bash

whereis php-fpm
php-fpm: /usr/local/sbin/php-fpm /usr/local/etc/php-fpm.d /usr/local/etc/php-fpm.conf

whereis php
php: /usr/local/bin/php /usr/local/etc/php /usr/local/lib/php /usr/local/php

cat /usr/local/etc/php-fpm.conf
错误日志 /usr/local/var/log/php-fpm.log

有时候我们需要查看php-fpm的错误日志,实际上容器已将error_log重定向到标准输出了,也就是通过docker logs php-fpm来查看即可。

对于PHP-FPM,我们需要挂载项目目录,此目录要和nginx转发过来的脚本地址相呼应,否则将无法找到要执行的文件。

php-fpm配置文件在容器的 /usr/local/etc/ 中,主要看监听方式
php-fpm.d 目录下的 www.conf, zz-docker.conf
listen = /run/php/php7.2-fpm.sock
或者
listen = 127.0.0.1:9000

另外调大 www.conf 中的 pm.max_children = 50,默认是5,几乎不够用的。

如果改完重启还没生效,可能还有其他配置文件联动影响了,一并改掉。

php配置文件在容器的/usr/local/etc/php,如果没有php.ini,就复制php.ini-productio为php.ini
ls /usr/local/etc/php
conf.d  php.ini  php.ini-development  php.ini-productio

PHP镜像中安装的扩展很少,主要是为了减少镜像的大小。
php -m

一般需要自己安装 pdo_mysql, redis,如果你下载的是官方版本,那么每个版本的情况是一样的,操作也是一样的。

进入工具目录
cd /usr/local/bin

通常在Linux系统中编译php以及扩展的四步骤:phpize, ./configure, make, make install。我们知道核心扩展是包含在php源码的ext目录下的,你只需要解压缩之后进入要安装的扩展目录使用这四步骤即可快速安装。

而在镜像中php源码是压缩包,这是为了使镜像更小,那么就意味着要安装核心扩展,需要先解压源码包,在 /usr/local/bin 目录下有个工具 docker-php-source ,它可以解压和删除解压后的文件夹,一般的操作为:

	docker-php-source extract 
	# 此处开始执行你需要的操作,完后别忘了删除 
	docker-php-source delete

这种操作有些麻烦,还好官方提供了更便捷的安装扩展的工具。

1、安装自带的扩展: 

a、不需要配置参数的
./docker-php-ext-install pdo_mysql mysqli sockets gettext opcache

b、需要配置参数的话,以gd扩展为例
如果不配置参数直接安装
./docker-php-ext-install gd

查看扩展信息
php --ri gd

	gd
	
	GD Support => enabled
	GD Version => bundled (2.1.0 compatible)
	GIF Read Support => enabled
	GIF Create Support => enabled
	PNG Support => enabled
	libPNG Version => 1.6.36
	WBMP Support => enabled
	XBM Support => enabled
	
	Directive => Local Value => Master Value
	gd.jpeg_ignore_warning => 1 => 1

发现只有gif与png,没有freetype和jpeg,需要安装依赖并重新安装。

apt-get update

安装依赖
apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev

配置参数
./docker-php-ext-configure gd --with-jpeg-dir=/usr/include/ --with-freetype-dir=/usr/include/
发现在php72-fpm镜像是可以的,php74-fpm镜像就报错:
configure: error: unrecognized options: --with-jpeg-dir, --with-freetype-dir

查看帮助
./docker-php-ext-configure gd --help
原来它的写法变了,修改后
./docker-php-ext-configure gd --with-jpeg=/usr/include/ --with-freetype=/usr/include/

重新编译安装就可以了
./docker-php-ext-install gd

php --ri gd

	gd
	
	GD Support => enabled
	GD Version => bundled (2.1.0 compatible)
	FreeType Support => enabled
	FreeType Linkage => with freetype
	FreeType Version => 2.9.1
	GIF Read Support => enabled
	GIF Create Support => enabled
	JPEG Support => enabled
	libJPEG Version => 6b
	PNG Support => enabled
	libPNG Version => 1.6.36
	WBMP Support => enabled
	XBM Support => enabled
	
	Directive => Local Value => Master Value
	gd.jpeg_ignore_warning => 1 => 1

可以大致理解为:
docker-php-ext-configure 对于的就是 configure 操作,用来配置编译参数。
docker-php-ext-install 对应的就是 make, make install 编译安装。

注意:这里的 docker-php-ext-configure 和 docker-php-ext-install 工具已经包含了 docker-php-source 的操作,显然使用者不要去关心这个。

2、安装第三方扩展库
pecl install redis
docker-php-ext-enable redis // 修改php.ini文件

pecl install swoole
docker-php-ext-enable swoole

3、当然也可以自己下载安装包,采用和Linux一样的方式编译安装
在 /usr/local/bin 目录下有 phpize 
然后使用 docker-php-ext-enable 工具修改php.ini

最后的最后,基本上每个扩展都有其对应的配置项,但是你会发现在php.ini中找不到它们,因为它们都内置了默认配置,使用 php --ri xxx
可以查看扩展的配置,如果要修改的话,可以改 php.ini 也可以改 /usr/local/etc/php/conf.d 下面对应的文件,比如我刚安装了 yac 
扩展,并 enabled 了它,现在来修改配置:
cd /usr/local/etc/php/conf.d
vi docker-php-ext-yac.ini
增加 yac.enable_cli = 1
php --ri yac


安装vim程序,修改php.ini中的时区
vi /usr/local/etc/php/php.ini
date.timezone = Asia/Shanghai

操作完这一波之后有必要备份一下容器,已被后续使用。
docker commit -p php-fpm php-fpm-bak
docker tag php-fpm-bak:latest php-fpm-bak:v1
docker images

exit 退出容器

重启容器
docker restart php-fpm

当php去连接在本机同样使用host网络创建的mysql容器时,php代码中应该使用127.0.0.1连接mysql而不是localhost,否
则会报错 Connection failed: SQLSTATE[HY000] [2002] No such file or directory

关于目录的挂载
最近发现一个小问题,我设置的php72-fpm容器开机自动重启,并挂载了虚拟机的一个目录,而虚拟机挂载的是本机的一个目录;昨天难得重启一次电脑,然后就是开启虚拟机,php72-fpm已经自动启动了,但是开发的时候报 404 ,我就纳闷了,于是开始排查。
docker logs php72-fpm
发现是php72-fpm报404,而不是nginx

于是进入容器查看 /www 发现是空的。于是 docker restart php72-fpm 就好了。
可能的原因,我是用的vagrant启动的虚拟机,也是在vagrant配置的共享文件夹,所以,php72-fpm在虚拟机启动时就启动了,而此时虚拟机还没挂载好共享文件夹,因为虚拟机的挂载是由vagrant来完成的,所以设置容器开机自启动还是要看你的场景。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐