请选择 进入手机版 | 继续访问电脑版
绿茶科技社区

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
避坑!用 Docker 搞定 PHP 开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)
因为最近换电脑的缘故需要重新部署一下本地的开发环境,之前采用的虚拟机方案,占用磁盘空间实在是太大,心疼 SSD 那么点地方,所以这次采用了 Docker 的方案来部署。
关于这次部署的原则,我的想法是尽量使用官方的镜像来实现,尽量不改动或少改动镜像。因为是本地的开发环境,所以想多尝尝鲜,尽量使用高版本的软件来实现。
从结果上来说,希望能给同样有需要搭建环境的同学起到一些帮助,少踩一些坑,如果能按照这篇文章的步骤一次搞定那是最好了。
先来说一下环境:
  1. Docker 18.09.2

  2. Nginx 1.17.1

  3. PHP 7.3.7

  4. XDebug 2.7.2

  5. PhpStorm 2019.1.3

  6. VSCode 1.36.1
复制代码
1、Docker 的安装
这里大家直接在 Docker 官网下载 Docker for Mac 就好了,直接按照提示操作即可,此处就不赘述了。
2、安装 Nginx
直接执行 docker pull nginx 拉取最新的镜像;
根据上面的地址我们可以看到官方提供的一些文档,我们按照操作即可,我个人采用的方案是先将 nginx 的整个配置目录 copy 到本地一份,然后在运行的时候将目录绑定到 nginx 容器的配置目录,这样修改配置更加方便一些。
将 nginx 配置目录 copy 到本地:
  1. $ docker run --name tmp-nginx -d nginx

  2. $ docker cp tmp-nginx:/etc/nginx /Users/yourname/Workspace/etc/nginx

  3. $ docker rm -f tmp-nginx
复制代码
说明:/Users/yourname/Workspace/etc,这个是我个人的工作目录,到时候根据情况换成自己的就行;命令的作用就是启一个后台运行的 nginx 容器,将配置目录 copy 出来之后终止运行并删除容器。
可以先运行一下看看效果:
  1. $ docker run --name run-nginx -d -p 80:80 -v /Users/yourname/Workspace/www:/usr/share/nginx/html:ro nginx
复制代码
说明:-v 参数绑定本地的一个目录到 nginx 容器中的 web 目录,这里面没有绑定配置目录,大家可以在 web 目录下建立一个 hello.html,通过浏览器访问 http://localhost/hello.html 看看效果,这之后可以大家可以先删除容器,后面我们改完配置再来启动它。
删除方法:
  1. $ docker rm -f run-nginx
复制代码
3、安装 php-fpm
因为这里我们需要安装一些开发时用到的 PHP 扩展,所以最好的办法是根据 Dockerfile 生成我们自己的镜像,如下是我的 Dockerfile,大家可以参考,可以根据情况删减不需要的扩展,否则生成的镜像会比较大。
Dockerfile 内容如下:
  1. # 从官方基础版本构建

  2. FROM php:7.3.7-fpm

  3. # 官方版本默认安装扩展:

  4. # Core, ctype, curl

  5. # date, dom

  6. # fileinfo, filter, ftp

  7. # hash

  8. # iconv

  9. # json

  10. # libxml

  11. # mbstring, mysqlnd

  12. # openssl

  13. # pcre, PDO, pdo_sqlite, Phar, posix

  14. # readline, Reflection, session, SimpleXML, sodium, SPL, sqlite3, standard

  15. # tokenizer

  16. # xml, xmlreader, xmlwriter

  17. # zlib

  18. # 更新为国内镜像

  19. RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \

  20.     && echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list \

  21.     && echo 'deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list \

  22.     && echo 'deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >> /etc/apt/sources.list \

  23.     && apt-get update

  24. # bcmath, calendar, exif, gettext, sockets, dba,

  25. # mysqli, pcntl, pdo_mysql, shmop, sysvmsg, sysvsem, sysvshm 扩展

  26. RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv

  27. # GD 扩展

  28. RUN apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev \

  29.     && rm -r /var/lib/apt/lists/* \

  30.     && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \

  31.     && docker-php-ext-install -j$(nproc) gd

  32. # imagick 扩展

  33. RUN export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" \

  34.     && apt-get install -y --no-install-recommends libmagickwand-dev \

  35.     && rm -r /var/lib/apt/lists/* \

  36.     && pecl install imagick-3.4.4 \

  37.     && docker-php-ext-enable imagick

  38. # mcrypt 扩展

  39. RUN apt-get install -y --no-install-recommends libmcrypt-dev \

  40.     && rm -r /var/lib/apt/lists/* \

  41.     && pecl install mcrypt-1.0.2 \

  42.     && docker-php-ext-enable mcrypt

  43. # Memcached 扩展

  44. RUN apt-get install -y --no-install-recommends libmemcached-dev zlib1g-dev \

  45.     && rm -r /var/lib/apt/lists/* \

  46.     && pecl install memcached-3.1.3 \

  47.     && docker-php-ext-enable memcached

  48. # redis 扩展

  49. RUN pecl install redis-5.0.0 && docker-php-ext-enable redis

  50. # opcache 扩展

  51. RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache

  52. # xdebug 扩展

  53. RUN pecl install xdebug-2.7.2 && docker-php-ext-enable xdebug

  54. # swoole 扩展

  55. RUN pecl install swoole-4.4.0 && docker-php-ext-enable swoole

  56. # 镜像信息

  57. LABEL Author="Stone"

  58. LABEL Version="2019.7"

  59. LABEL Description="PHP 7.3.7 开发环境镜像.
复制代码
说明:这个 Dockerfile 我参考了 https://www.jianshu.com/p/20fcca06e27e 作者的内容,并做了一些调整,大家可以根据自己情况增减,因为是开发环境所以最好把 xdebug 留着,咱们后面也会用到;
下面是将 RUN 串联起来的 Dockerfile,这样生成的镜像能小一些,但是依然有 636M,官方的 php:7.3.7-fpm 的镜像是 371M,如果想优化也可以从官方提供的 Alpine 镜像生成,咱们这里就先简单粗暴了。
  1. FROM php:7.3.7-fpm

  2. RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \

  3.     && echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list \

  4.     && echo 'deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list \

  5.     && echo 'deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >> /etc/apt/sources.list \

  6.     && apt-get update \

  7.     && export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" \

  8.     && apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmagickwand-dev libmcrypt-dev libmemcached-dev zlib1g-dev \

  9.     && rm -rf /var/lib/apt/lists/* \

  10.     && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \

  11.     && docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv gd \

  12.     && pecl install imagick-3.4.4 mcrypt-1.0.2 memcached-3.1.3 redis-5.0.0 xdebug-2.7.2 swoole-4.4.0\

  13.     && docker-php-ext-enable imagick mcrypt memcached redis xdebug swoole \

  14.     && docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache

  15. LABEL Author="Stone"

  16. LABEL Version="2019.7"

  17. LABEL Description="PHP 7.3.7 开发环境镜像. "
复制代码
说一下踩的坑:apt-get 的源最好换成国内的源,否则可能会在构建镜像的时候卡死;因为默认情况下官方容器是基于 Debian 的,查找源的时候很多都是过时的,如当前的 Debian 代号是 stretch,却使用了 jessie 的包那肯定是会报错的,“E: Unable to correct problems, you have held broken packages.”;大家直接按照我上面的 Dockerfile 生成镜像即可,测试通过。
在 Dockerfile 所在目录下执行:
  1. docker build -t my-php-fpm:2019.7 .
复制代码
-t 参数设置镜像名称和标签,请根据自己情况命名,镜像创建完成之后,可以像上面我们 copy 出 nginx 配置一样,将 php 的相关配置也 copy 到本地。
  1. $ docker run --name tmp-my-php-fpm -d my-php-fpm:2019.7

  2. $ docker cp tmp-my-php-fpm:/usr/local/etc /Users/yourname/Workspace/etc/php

  3. $ docker rm -f tmp-my-php-fpm
复制代码
4、修改 nginx、php-fpm、xdebug 的配置文件
修改 nginx 配置文件,打开 / Users/yourname/Workspace/etc/nginx/default.conf,加入下面的内容:
  1. location ~ \.php$ {

  2.         fastcgi_pass   php-fpm-container:9000;

  3.         fastcgi_index  index.php;

  4.         fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;

  5.         fastcgi_param  SCRIPT_NAME      $fastcgi_script_name;

  6.         include        fastcgi_params;

  7.     }
复制代码
增加的内容里面有一处需要说明,“php-fpm-container” 这个是咱们自己创建的 php-fpm 容器的别名,具体是在运行时候指定的,之后咱们会提到。
修改 php 相关配置文件,进入 / Users/yourname/Workspace/etc/php 下,将 php.ini-development 复制改名为 php.ini,配置内容根据自己情况修改即可。
修改 xdebug 的配置文件,/Users/yourname/Workspace/etc/php/conf.d/docker-php-ext-xdebug.ini,加入如下内容
  1. xdebug.remote_enable = On

  2. xdebug.remote_handler = dbgp

  3. xdebug.remote_host = host.docker.internal

  4. xdebug.remote_port = 9001

  5. xdebug.remote_log = /var/log/php/xdebug.log

  6. xdebug.idekey = PHPSTOR
复制代码
以上设置主要是开启 xdebug 的远程调试模式,因为 php-fpm 使用了 9000 端口,所以这里我们把 xdebug 的端口改为了 9001;“host.docker.internal” 是 docker 18.03 新加入的,可以解析获得宿主机的 ip 地址,这样就不用写死 ip 地址了。
5、启动 php-fpm、nginx 容器
  1. $ docker run --name run-my-php-fpm \

  2. -v /Users/yourname/Workspace/www:/var/www/html \

  3. -v /Users/yourname/Workspace/etc/php:/usr/local/etc \

  4. -v /Users/yourname/Workspace/log/php:/var/log/php \

  5. -d my-php-fpm:2019.7

  6. $ docker run --name run-nginx \

  7. -p 80:80 \

  8. --link run-my-php-fpm:php-fpm-container \

  9. -v /Users/yourname/Workspace/www:/usr/share/nginx/html \

  10. -v /Users/yourname/Workspace/etc/nginx:/etc/nginx \

  11. -v /Users/yourname/Workspace/log/nginx:/var/log/nginx \

  12. -d nginx
复制代码
说明:我将配置目录、日志目录和 web 目录都分别进行了绑定,方便在本地环境中修改。还记得上面提到的 nginx 中有个配置填写的 “php-fpm-container” 吗?实际上就是在这里指定的,连接两个容器,并给 php-fpm 容器起了个别名,配置中通过别名访问。
在 / Users/yourname/Workspace/www 中创建一个 phpinfo.php 文件,输出 php 信息,通过 http://localhost/phpinfo.php 访问来查看。
6、安装 Chrome 浏览器插件 xdebug helper
可能会被墙,请自行解决。
7、PhpStorm 调试环境配置
建立 / Users/yourname/Workspace/www/xdebug/demo.php,php 文件里面随便写点 php 代码,也可以通过 PhpStorm 新建立一个空项目,但是位置要在我们和 php-fpm 容器绑定的目录。
菜单:PhpStorm->Preferences… 进入偏好设置,按照下图进行设置。
根据上图提示进入 CLI Interpreter 设置窗口,点 “+” 添加配置。
继续配置 Debug 相关设置,如下图:
进入主界面,选择右上的 “Add Configuration...”
进入 debug 配置窗口后选择 “+”,选择 “PHP Web Page“,设置名称后进入 Servers 设置,同时设置 Start URL:“/xdebug/demo.php”
进入主窗口,在程序中打几个断点,然后点击那个绿色的甲虫就可以了。
8、VSCode 调试环境配置
首先安装 PHP Debug 插件,然后打开上面创建的 xdebug 目录。如下图所示,进入调试面板,点齿轮选择 PHP,然后会创建一个 launch.json 文件,修改这个文件加入 pathMappings 配置,这个配置参数用于设置服务器路径与本地路径的对应关系,低版本使用的是 localSourceRoot 和 serverSourceRoot,目前已经被废除。另外记得将端口改为 9001。
进入 demo.php,随意设置两个断点,然后点左侧的运行按钮,进入调试模式,接下来刷新 http://localhost/xdebug/demo.php 会返回到 VSCode 的调试窗口,左侧已经列出调试信息,可选择单步执行跟踪程序的运行。
结尾:实际上这次部署环境踩了不少坑,主要原因是网上的资料都比较陈旧,很多文章也没有后续的更新,或者方向和我不太一致,例如 hub 中直接就有 xdebug 的镜像,但是我还是想尽量用官方提供的镜像自己创建,为了避免踩坑,大家最好还是多多参考官方文档,一般都写的比较清楚了。



分享到 :
0 人收藏

3 个回复

倒序浏览
yuji4586  高级会员 | 2019-11-15 02:51:18
大人,此事必有蹊跷!
sparkdev  高级会员 | 2019-11-16 00:34:37
:lol666 学习了
haolujun  高级会员 | 2019-11-26 13:46:06
路过 帮顶 嘿嘿
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

举报|Archiver|手机版|小黑屋|Lvchakeji Inc.  

Powered by Discuz! X3.3 © 2001-2016 Comsenz Inc.

返回顶部