docker 安装 php-fpm 服务 / 扩展 / 配置的示例教程详解

 更新时间:2020年05月07日 15:48:13   作者:big_cat  
这篇文章主要介绍了docker 安装 php-fpm 服务 / 扩展 / 配置,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

mac 上用 brewphp56 时,因为 openssl1.1 版本而导致各种 google 都搞不定的错误,太折腾了,现在用 docker 创建一个 php56-fpm 服务容器,nginx 直装在宿主机上。

PHP DockerHub 主页

创建容器

# 创建容器
docker run -d \
--name php56-fpm \
-p 9056:9000 \
-v /home/wwwroot:/var/www/html
--privileged=true
php:5.6-fpm

注意:

/var/www/htmlphp docker 镜像的工作目录。

-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 容器中的有效站点路径,如果 nginxroot 并不能直接映射至 fpm 容器的站点 root,我们需要在 php location 中重新定义为 fpm 容器的站点 root。这样 fpm 才能正确的读取到脚本。

即宿主机上的 /home/wwwroot/siteA/public/index.php 要转为 /var/www/html/siteA/public/index.php 发送给 fpm 容器,否则会报 File not found 的错误。

所以 nginx 配置 server 时要注意如下的卷路径转换:

server {
 listen 8056;
 ....
 # 宿主机的站点根目录
 root /home/wwwroot/siteA/public;
 
 location ~* (^[/]*.php)[/|$] {
 # 容器中的站点根目录
 root /var/www/html/siteA/public;
 pass_proxy: 127.0.0.1:9056;
 include fastcgi.conf;
 }
}

不过一般情况下大家都是 docker nginx + docker php-fpm,两个容器都统一映射了站点目录,就不会有这个问题了。这里的 nginx 是直接装在宿主机上才导致 nginx 转发 php 请求时需要重新定义下站点的根目录。

登陆容器

# 查看容器是否运行
docker ps

# 登陆容器
docker exec -it php56-fpm /bin/bash

php 的 docker 镜像是基于 ubuntu 我们可以使用 apt-get 安装需要的工具,比如 vim/vi lrzsz net-tools 之类的。

# 在使用 apt-get 安装一些工具前,需要 update 更新一下源
# 否则会 apt-get E: Unable to locate package
apt-get update
apt-get install vim

安装 php/pecl 扩展

安装 php 扩展

即 php 官方扩展,比如 shomp 这种自带但默认不开启的扩展。

# 查看自带了那些扩展
cd /usr/local/php/ext && ls -l
# 安装扩展
dcoker-php-ext-install shmop

安装 pecl 扩展

容器中是有安装 pecl的,所以直接使用 pecl 安装即可,注意扩展对 php 版本的支持即可。

docker-php-ext-enable的主要用途是生成扩展相应的配置文件到 /usr/local/etc/php/conf.d/docker-php-ext-{extName}.ini 方便 php 加载扩展。

# igbinary php5.6 最高版本是 2.0.8
pecl install igbinary-2.0.8
docker-php-ext-enable igbinary

# phpredis php5.6 最高版本是 4.3.0
pecl install redis-4.3.0
docker-php-ext-enable redis

# swoole php5.6 最高版本是 2.0.11
pcel install swoole-2.0.11
docker-php-ext-enable swoole

php/php-fpm 配置

/usr/local/etc 是 php 容器的配置目录,里面自带了 php 及 php-fpm 的配置文件,配置目录结构如下:

root@aa739592b579:/usr/local# tree etc/ 
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/min children 啊都在这里
 |-- 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、File not found
nginx 指定的 站点根目录 无法直接映射给 fpm 容器,在 location 中重新指定 fpm 容器的 站点根目录。
2、apt-get E: Unable to locate package
执行 apt-get update 刷新一下源即可。
3、容器的相关约定
工作目录:/var/www/html 建议将宿主机的站点目录映射至此目录
配置目录:/usr/local/etc 注意配置目录结构
php 扩展目录:/usr/local/php/ext 可以查看 php 自带的扩展包 使用 docker-php-ext-install 安装更方便

到此这篇关于docker 安装 php-fpm 服务 / 扩展 / 配置的文章就介绍到这了,更多相关docker 安装 php-fpm内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Docker部署SpringBoot项目的实现方法

    使用Docker部署SpringBoot项目的实现方法

    这篇文章主要介绍了使用Docker部署SpringBoot项目的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Docker部署MySQL并实现客户端连接

    Docker部署MySQL并实现客户端连接

    这篇文章介绍了Docker部署MySQL并实现客户端连接的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • Docker中镜像构建文件Dockerfile与相关命令的详细介绍

    Docker中镜像构建文件Dockerfile与相关命令的详细介绍

    这篇文章主要介绍了Docker中镜像构建文件Dockerfile与相关命令的相关资料,文中介绍的很详细,相信对大家具有一定的参考价值,有需要的朋友们下面来一起看看吧。
    2017-02-02
  • Docker启动RabbitMQ实现生产者与消费者的详细过程

    Docker启动RabbitMQ实现生产者与消费者的详细过程

    这篇文章主要介绍了Docker启动RabbitMQ,实现生产者与消费者,通过Docker拉取镜像并启动RabbitMQ,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • docker如何运行redis

    docker如何运行redis

    文章详细介绍了如何使用Docker下载、配置和启动Redis镜像,包括指定版本、创建挂载目录、修改配置文件(如启用持久化、设置密码等)以及启动容器的步骤
    2024-11-11
  • 使用Docker搭建Django,Nginx,R,Python部署环境的方法

    使用Docker搭建Django,Nginx,R,Python部署环境的方法

    本篇文章主要介绍了使用Docker搭建Django,Nginx,R,Python部署环境的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 使用docker-compose实现不停机部署/灰度发布的四种方法

    使用docker-compose实现不停机部署/灰度发布的四种方法

    灰度发布是一种软件部署策略,它允许将新版本的部分功能或服务逐步推送给用户,而不是一次性对所有用户进行大规模更新,本文主要给大家介绍了使用docker-compose实现不停机部署/灰度发布的四种方法,需要的朋友可以参考下
    2024-11-11
  • docker镜像封装方便打包上传一键部署

    docker镜像封装方便打包上传一键部署

    这篇文章主要为大家介绍了docker镜像封装方便打包上传一键部署,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • skywalking容器化部署docker镜像构建k8s从测试到可用

    skywalking容器化部署docker镜像构建k8s从测试到可用

    这篇文章主要为大家介绍了skywalking容器化部署docker镜像构建k8s从测试到可用的构建部署过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Docker Machine远程部署Docker的方法

    Docker Machine远程部署Docker的方法

    本篇文章主要介绍了Docker Machine远程部署Docker的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论