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

来源:脚本之家  责任编辑:小易  

环境部署一直是一个很大的问题,无论是开发环境还是生产环境,但是 Docker将开发环境和生产环境以轻量级方式打包,提供了一致的环境。极大的提升了开发部署一致性。当然,实际情况并没有这么简单,因为生产环境和开发环境的配置是完全不同的,比如日志等的问题都需要单独配置,但是至少比以前更加简单方便了,这里以PHP 开发作为例子讲解 Docker 如何布置开发环境。一般来说,一个 PHP 项目会需要以下工具:Web 服务器:Nginx/TengineWeb 程序:PHP-FPM数据库:MySQL/PostgreSQL缓存服务:Redis/Memcache这是最简单的架构方式,在 Docker 发展早期,Docker 被大量的滥用,比如,一个镜像内启动多服务,日志收集依旧是按照 Syslog或者别的老方式,镜像容量非常庞大,基础镜像就能达到 80M,这和 Docker 当初提出的思想完全南辕北辙了,而 Alpine Linux发行版作为一个轻量级 Linux 环境,就非常适合作为 Docker 基础镜像,Docker 官方也推荐使用 Alpine 而不是 Debian作为基础镜像,未来大量的现有官方镜像也将会迁移到 Alpine 上。本文所有镜像都将以 Alpine 作为基础镜像。Nginx/Tengine这部分笔者已经在另一篇文章 Docker 容器的 Nginx 实践中讲解了 Tengine 的 Docker 实践,并且给出了Dockerfile,由于比较偏好 Tengine,而且官方已经给出了 Nginx 的 alpine 镜像,所以这里就用Tengine。笔者已经将镜像上传到官方 DockerHub,可以通过docker pull chasontang/tengine:2.1.2_f获取镜像,具体请看 Dockerfile。PHP-FPMDocker 官方已经提供了 PHP 的 7.0.7-fpm-alpine 镜像这样解决就可以了,简单粗暴,个人建议还是去后盾网去经常看看教学视频学习学习吧www.zgxue.com防采集请勿采集本网。

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

其实最方便的方式是下载一个php集成开发环境。然后安装即可。比如常用的php集成环境:xampp,phpstudy,wampserver等等。

PHP DockerHub 主页

最方便的方式是下载一个php集成开发环境。然后安装即可。比如常用的php集成环境:xampp,phpstudy,wampserver等等。这样解决就可以了,简单粗暴,个人建议还是去后盾网去经常看看教学视频学习

创建容器

Docker流行之前,要搭建开发环境通常有两种选择:一种是使用wamp、xampp、mamp等集成开发环境安装包,另外一种就是使用普通虚拟机来安装linux服务器,然后通过下载一键安装包(如:lnmp)或者

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

接着,用官方 PHP 镜像内置命令 docker-php-ext-install安装 PHP 的 MySQL 扩展依赖。dockerfile RUN docker-php-ext-install pdo_mysql 依赖包通过 docker-php-ext-install安装,如果依赖包需要配置参数则

注意:

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

容器间的 link 机制,用官方 PHP 镜像内置命令 docker-php-ext-install安装 PHP 的 MySQL 扩展依赖,也可以实现虚拟化。在 GitHub 上 Fork DaoCloud/mysql。安装 pdo_mysql PHP 扩展,如果依赖包需要配置

-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 packageapt-get updateapt-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.8pecl install igbinary-2.0.8docker-php-ext-enable igbinary# phpredis php5.6 最高版本是 4.3.0pecl install redis-4.3.0docker-php-ext-enable redis# swoole php5.6 最高版本是 2.0.11pcel install swoole-2.0.11docker-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都支持以上这些特点,甚至更多。你几乎可以即时销毁和重建容器,而更新环境只需要重建你当前使用的镜像即可。什么是PHP开发环境目前Web应用错综复杂,PHP开发环境需要很多的东西,为了保证环境的简单性,需要做各种各样的限制。我们这次使用Nginx、PHP5-FPM、MySQL来运行Synmfony项目。由于在容器中运行命令行会更复杂,所以这方面的内容我会放到下一篇博客中再说。Pet 与 Cattle另一个我们要讨论的重点是:我们要把开发环境部署在多容器还是单容器中。两种方式各有优点:单容器易于分发、维护。因为它们是独立的,所有的东西都运行在同一个容器中,这点就像是一个虚拟机。但这也意味着,当你要升级其中的某样东西(比如PHP新版本)的时候,需要重新构建整个容器。多容器可以在添加组件时提供更好的模块化。因为每个容器包含了堆栈的一部分:Web、PHP、MySQL等,这样可以单独扩展每个服务或者添加服务,并且不需要重建所有的东西。因为我比较懒,加上我需要在我的笔记本上放点别的内容,所以,这里我们只介绍单个容器的方法。初始化工程首先要做的是初始化一个新的Symfony工程.推荐的方法是用composer的create-project命令。本来可以在工作站上安装composer,但是那样太简单了。这次我们通过Docker来使用它。我之前发过一篇关于Docker命令的文章:make docker commands(好吧,我说谎了,我本来把它写在这篇文章中了,然后觉得把它独立出来会比较好)。不管怎么样,你可以读一下。接下来如果还没有composer命令的话,你可以创建一个属于自己的composer 别名。alias composer="docker run-i-t-v \\$PWD:/srv ubermuda/composer现在你可以初始化Symfony工程了:composer create-project symfony/framwork-standard-edition SomeProject帅呆了!下面来点实在的工作。(省略了博主自娱自乐的一堆balabla.原文:Awesome.Give yourself a high-five,get a cup of coffee or whatever is your liquid drug of choice,and get ready for the real work.)容器构建一个运行标准Symfony项目且自给自足的容器相当容易,只需要安装好常用的Nginx、PHP5-FPM和MySQL-Server即可,然后把预先准备好的Nginx的虚拟主机配置文件扔进去,再复制一些配置文件进去就完事了内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • docker nginx php-fpm单机多站点布署的方法
  • docker默认网段的正确修改步骤
  • 详解docker中安装配置oracle数据库
  • 查看docker镜像中文件的方法
  • docker在已有的tomcat镜像上打新的镜像的dockerfile编写说明介绍
  • 如何docker化python django应用程序
  • docker数据存储之volumes详解
  • docker 网络模式(四种)详细介绍
  • docker 部署scrapy的详解
  • 从零搭建docker+jenkins+node.js自动化部署环境的方法
  • docker配置容器位置与小技巧总结
  • 如何配置一个 Docker 化持续集成的 PHP 开发环境
  • 如何 在Docker窗口中部署PHP开发环境
  • 自己私下写php项目怎么用docker
  • docker 怎么添加php扩展
  • 怎么使用Docker搭建PHP开发环境
  • 怎么使用Docker搭建PHP开发环境
  • 怎么使用Docker搭建PHP开发环境
  • 如何开发一个 PHP + MySQL 的 Docker 化应用
  • 如何使用docker中的php环境来调试代码
  • 如何使用docker中的php环境来调试代码
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全dockerhyper-vvmwarevirtualboxxenserverkvmqemuopenvzxencloudstackopenstack云计算技术云其它首页服务器云和虚拟化dockerdocker nginx php-fpm单机多站点布署的方法docker默认网段的正确修改步骤详解docker中安装配置oracle数据库查看docker镜像中文件的方法docker在已有的tomcat镜像上打新的镜像的dockerfile编写说明介绍如何docker化python django应用程序docker数据存储之volumes详解docker 网络模式(四种)详细介绍docker 部署scrapy的详解从零搭建docker+jenkins+node.js自动化部署环境的方法docker配置容器位置与小技巧总结docker 给运行中的容器设置端口映docker 清理命令集锦docker获取镜像报错docker: erroubuntu14.04+docker的安装及使用docker.service启动失败:unit ndocker容器如何优雅的终止详解浅谈docker-compose网络设置之necentos7 安装docker 解决启动不了详解docker国内镜像拉取和镜像加docker如何固定ip设置的方法docker容器无法被stop or kill问题的解决docker出现cannot connect to the dockerdocker之点到点的容器网络的配置win7下docker安装与报错问题的解决方法centos 7安装docker服务详细过程详解docker-compose networks 的例子docker machine远程部署docker的方法一篇文章学会docker命令小结docker镜像存储overlayfs的使用centos7上安装docker的方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved