避坑!用Docker搞定PHP开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

本次更新主要是对环境版本进行了更新,例如php 7.3.7升级到了7.3.8,另外之前的版本有同学踩了坑,主要是官方docker镜像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian,后面会提到,请各位同学留意。

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

先来说一下环境:

  • Docker 19.03.1
  • Nginx 1.17.2
  • PHP 7.3.8
  • XDebug 2.7.2
  • PhpStorm 2019.2
  • VSCode 1.36.1

用到的PHP扩展版本

  • i magick-3.4.4
  • mcrypt-1.0.2
  • memcached-3.1.3
  • redis-5.0.2
  • xdebug-2.7.2
  • swoole-4.4.3

1、Docker的安装

这里大家直接在Docker官网下载Docker for Mac就好了,直接按照提示操作即可,此处就不赘述了。

2、安装Nginx

地址:hub.docker.com/_/nginx 直接执行 docker pull nginx 拉取最新的镜像,目前是1.17.2; 根据上面的地址我们可以看到官方提供的一些文档,我们按照操作即可,我个人采用的方案是先将nginx的整个配置目录copy到本地一份,然后在运行的时候将目录绑定到nginx容器的配置目录,这样修改配置更加方便一些。

将nginx配置目录copy到本地:

 

代码解读

复制代码

$ docker run --name tmp-nginx -d nginx $ docker cp tmp-nginx:/etc/nginx /Users/yourname/Workspace/etc/nginx $ docker rm -f tmp-nginx

说明:/Users/yourname/Workspace/etc,这个是我个人的工作目录,到时候根据情况换成自己的就行;命令的作用就是启一个后台运行的nginx容器,将配置目录copy出来之后终止运行并删除容器。

可以先运行一下看看效果:

 

代码解读

复制代码

$ 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看看效果,这之后可以大家可以先删除容器,后面我们改完配置再来启动它。 删除方法:

 

代码解读

复制代码

$ docker rm -f run-nginx

3、安装php-fpm

地址:hub.docker.com/_/php 因为这里我们需要安装一些开发时用到的PHP扩展,所以最好的办法是根据Dockerfile生成我们自己的镜像,如下是我的Dockerfile,大家可以参考,可以根据情况删减不需要的扩展,否则生成的镜像会比较大。

Dockerfile内容如下:

 

代码解读

复制代码

# 从官方基础版本构建 FROM php:7.3.7-fpm # 官方版本默认安装扩展: # Core, ctype, curl # date, dom # fileinfo, filter, ftp # hash # iconv # json # libxml # mbstring, mysqlnd # openssl # pcre, PDO, pdo_sqlite, Phar, posix # readline, Reflection, session, SimpleXML, sodium, SPL, sqlite3, standard # tokenizer # xml, xmlreader, xmlwriter # zlib # 更新为国内镜像 RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \ && echo 'deb http://mirrors.163.com/debian/ stretch main non-free contrib' > /etc/apt/sources.list \ && echo 'deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib' >> /etc/apt/sources.list \ && echo 'deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib' >> /etc/apt/sources.list \ && apt-get update # bcmath, calendar, exif, gettext, sockets, dba, # mysqli, pcntl, pdo_mysql, shmop, sysvmsg, sysvsem, sysvshm 扩展 RUN docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv # GD 扩展 RUN apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev \ && rm -r /var/lib/apt/lists/* \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd # imagick 扩展 RUN export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" \ && apt-get install -y --no-install-recommends libmagickwand-dev \ && rm -r /var/lib/apt/lists/* \ && pecl install imagick-3.4.4 \ && docker-php-ext-enable imagick # mcrypt 扩展 RUN apt-get install -y --no-install-recommends libmcrypt-dev \ && rm -r /var/lib/apt/lists/* \ && pecl install mcrypt-1.0.2 \ && docker-php-ext-enable mcrypt # Memcached 扩展 RUN apt-get install -y --no-install-recommends libmemcached-dev zlib1g-dev \ && rm -r /var/lib/apt/lists/* \ && pecl install memcached-3.1.3 \ && docker-php-ext-enable memcached # redis 扩展 RUN pecl install redis-5.0.0 && docker-php-ext-enable redis # opcache 扩展 RUN docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache # xdebug 扩展 RUN pecl install xdebug-2.7.2 && docker-php-ext-enable xdebug # swoole 扩展 RUN pecl install swoole-4.4.0 && docker-php-ext-enable swoole # 镜像信息 LABEL Author="Stone" LABEL Version="2019.7" LABEL Description="PHP 7.3.7 开发环境镜像.

说明:这个Dockerfile我参考了www.jianshu.com/p/20fcca06e…作者的内容,并做了一些调整,大家可以根据自己情况增减,因为是开发环境所以最好把xdebug留着,咱们后面也会用到;

下面是将RUN串联起来的Dockerfile,这样生成的镜像能小一些,但是依然有636M,官方的php:7.3.7-fpm的镜像是371M,如果想优化也可以从官方提供的Alpine镜像生成,咱们这里就先简单粗暴了。

上面的内容没有更新,依然是上个文章版本的内容,为的是有个对比,请使用以下最新的Dockerfile。

 

代码解读

复制代码

FROM php:7.3.8-fpm RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \ && echo 'deb http://mirrors.aliyun.com/debian/ buster main non-free contrib' > /etc/apt/sources.list \ && echo 'deb http://mirrors.aliyun.com/debian-security buster/updates main' >> /etc/apt/sources.list \ && echo 'deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib' >> /etc/apt/sources.list \ && echo 'deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib' >> /etc/apt/sources.list \ && apt-get update \ && export CFLAGS="$PHP_CFLAGS" CPPFLAGS="$PHP_CPPFLAGS" LDFLAGS="$PHP_LDFLAGS" \ && apt-get install -y --no-install-recommends libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmagickwand-dev libmcrypt-dev libmemcached-dev zlib1g-dev \ && rm -rf /var/lib/apt/lists/* \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) bcmath calendar exif gettext sockets dba mysqli pcntl pdo_mysql shmop sysvmsg sysvsem sysvshm iconv gd \ && pecl install imagick-3.4.4 mcrypt-1.0.2 memcached-3.1.3 redis-5.0.2 xdebug-2.7.2 swoole-4.4.3\ && docker-php-ext-enable imagick mcrypt memcached redis xdebug swoole \ && docker-php-ext-configure opcache --enable-opcache && docker-php-ext-install opcache LABEL Author="Stone" LABEL Version="2019.8" LABEL Description="PHP 7.3.8 开发环境镜像. "

说一下踩的坑:apt-get的源最好换成国内的源,否则可能会在构建镜像的时候卡死;因为默认情况下官方容器是基于Debian的,查找源的时候很多都是过时的,如当前的Debian代号是stretch,却使用了jessie的包那肯定是会报错的,“E: Unable to correct problems, you have held broken packages.”;大家直接按照我上面的Dockerfile生成镜像即可,测试通过。 另外需要注意默认的php:7.3.7-fpm是基于Debian 9构建的,代号是stretch;而php:7.3.8-fpm是基于Debian 10,代号是buster。使用不同版本的Debian可以用tag末尾为-stretch或者-buster进行选择。

在Dockerfile所在目录下执行:

 

代码解读

复制代码

docker build -t my-php-fpm:2019.8 .

-t参数设置镜像名称和标签,请根据自己情况命名,镜像创建完成之后,可以像上面我们copy出nginx配置一样,将php的相关配置也copy到本地。

 

代码解读

复制代码

$ docker run --name tmp-my-php-fpm -d my-php-fpm:2019.7 $ docker cp tmp-my-php-fpm:/usr/local/etc /Users/yourname/Workspace/etc/php $ docker rm -f tmp-my-php-fpm

4、修改nginx、php-fpm、xdebug的配置文件

修改nginx配置文件,打开/Users/yourname/Workspace/etc/nginx/default.conf,加入下面的内容:

 

代码解读

复制代码

location ~ \.php$ { fastcgi_pass php-fpm-container:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; include fastcgi_params; }

增加的内容里面有一处需要说明,“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,加入如下内容

 

代码解读

复制代码

xdebug.remote_enable = On xdebug.remote_handler = dbgp xdebug.remote_host = host.docker.internal xdebug.remote_port = 9001 xdebug.remote_log = /var/log/php/xdebug.log xdebug.idekey = PHPSTOR

以上设置主要是开启xdebug的远程调试模式,因为php-fpm使用了9000端口,所以这里我们把xdebug的端口改为了9001;“host.docker.internal”是docker 18.03新加入的,可以解析获得宿主机的ip地址,这样就不用写死ip地址了。

5、启动php-fpm、nginx容器

 

代码解读

复制代码

$ docker run --name run-my-php-fpm \ -v /Users/yourname/Workspace/www:/var/www/html \ -v /Users/yourname/Workspace/etc/php:/usr/local/etc \ -v /Users/yourname/Workspace/log/php:/var/log/php \ -d my-php-fpm:2019.8

 

代码解读

复制代码

$ docker run --name run-nginx \ -p 80:80 \ --link run-my-php-fpm:php-fpm-container \ -v /Users/yourname/Workspace/www:/usr/share/nginx/html \ -v /Users/yourname/Workspace/etc/nginx:/etc/nginx \ -v /Users/yourname/Workspace/log/nginx:/var/log/nginx \ -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的镜像,但是我还是想尽量用官方提供的镜像自己创建,为了避免踩坑,大家最好还是多多参考官方文档,一般都写的比较清楚了。得益于docker的便利,我会不定期的更新这篇文章,这也是我在文章开头设置了一个版本号的原因,希望对大家有所帮助。

作者:climberone
链接:https://juejin.cn/post/6844903892187906056
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980364.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【卫星语音通信】神经网络语音编解码算法:AudioDec

引言:低码率时代的语音革命 在偏远山区的蜂窝基站与卫星电话之间,在远洋货轮的应急通信频道里,清晰流畅的语音传输往往关乎生命财产安全。传统蜂窝通信(如4G VoLTE)和卫星通信系统(如海事卫星电话&#xf…

大数据学习(53)-Hive与Impala

&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦&#x1f91…

【基于Raft的KV共识算法】-序:Raft概述

本文目录 1.为什么会有Raft?CAP理论 2.Raft基本原理流程为什么要以日志作为中间载体? 3.实现思路任期领导选举日志同步 1.为什么会有Raft? 简单来说就是数据会随着业务和时间的增长,单机不能存的下,这个时候需要以某种…

Redis---LRU原理与算法实现

文章目录 LRU概念理解LRU原理基于HashMap和双向链表实现LRURedis中的LRU的实现LRU时钟淘汰策略近似LRU的实现LRU算法的优化 Redis LRU的核心代码逻辑Redis LRU的核心代码逻辑Redis LRU的配置参数Redis LRU的优缺点Redis LRU的优缺点 LRU概念理解 LRU(Least Recentl…

【Java-黑马程序员】2024IDEA下载安装[ IntelliJ IDEA]

IDEA概述 IntelliJ IDEA – 用于 Pro Java 和 Kotlin 开发的 IDEhttps://www.jetbrains.com/idea/安装:傻瓜式安装,建议修改安装路径。 选择版本 Ultimate:功能全面,适合企业开发,需付费。 Community:免费,适合个人和小型项目。 选择适合你操作系统的版本 Windows版…

centos 下dockers部署surveyking-docker开源考试系统

下载初始化脚本,并自动部署至当前文件夹 https://raw.githubusercontent.com/xianyu-one/surveyking-docker/main/setup.sh -O setup.sh chmod x setup.sh bash setup.sh 手工部署 1:先卸载这些旧版本,以及关联的依赖项sudo yum remove docker docker-…

[3/11]C#性能优化-实现 IDisposable 接口-每个细节都有示例代码

[3]C#性能优化-实现 IDisposable 接口-每个细节都有示例代码 前言 在C#开发中,性能优化是提升系统响应速度和资源利用率的关键环节。 当然,同样是所有程序的关键环节。 通过遵循下述建议,可以有效地减少不必要的对象创建,从而减…

【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装

【deepseek第二课】docker部署dify,配置私有化知识库,解决网络超时,成功安装 1. dify安装1.1 官网安装文档介绍1.2 安装报错,网络连接问题使用镜像加速器处理1.3 dify后台启动很多docker进程 2. 页面探索2.1 设置管理账号2.2 添加…

2025.3.2机器学习笔记:PINN文献阅读

2025.3.2周报 一、文献阅读题目信息摘要Abstract创新点网络架构实验结论不足以及展望 一、文献阅读 题目信息 题目: Physics-Informed Neural Networks of the Saint-Venant Equations for Downscaling a Large-Scale River Model期刊: Water Resource…

在C++中如何实现线程安全的队列

个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言如何实现一个线程安全的队列思路应用场景代码实现总结 前言 在一次和豆包的模拟面试中,豆包问我:“在C中&#xf…

【网络安全 | 漏洞挖掘】利用文件上传功能的 IDOR 和 XSS 劫持会话

未经许可,不得转载。 本文涉及漏洞均已修复。 文章目录 前言正文前言 想象这样一个场景:一个专门处理敏感文档的平台,如保险理赔或身份验证系统,却因一个设计疏漏而成为攻击者的“金矿”。在对某个保险门户的文件上传功能进行测试时,我意外发现了一个可导致大规模账户接管…

[操作系统] 文件的软链接和硬链接

文章目录 引言硬链接(Hard Link)什么是硬链接?硬链接的特性硬链接的用途 软链接(Symbolic Link)什么是软链接?软链接的特性软链接的用途 软硬链接对比文件的时间戳实际应用示例使用硬链接节省备份空间用软链…

c# winform程序 vs2022 打包生成安装包

最近,利用c# winform程序该客户开发一套进销存管理系统,项目在部署前,需要生成安装包,以便部署在客户电脑上面。总结步骤如下: 1、在打包之前 (VS中需要包括Microsoft visual studio installer projects扩展项目)&…

现今大语言模型性能(准确率)比较

现今大语言模型性能(准确率)比较 表头信息:表的标题为“大语言模型性能比较结果”(英文:Table 1: Large Language Model Performance Comparison Results),表明该表是用于对比不同大语言模型的性能。列信息: 模型:列出参与比较的不同大语言模型名称,包括LLAMA3(70B)…

Mysql-如何理解事务?

一、事务是什么东西 有些场景中,某个操作需要多个sql配合完成: 例如: 李四这个月剩下的前不够交房租了,找张三借1000元急用: (1)给张三的账户余额 减去1000元 updata 账户表 set money money -…

GitLab Pages 托管静态网站

文章目录 新建项目配置博客添加 .gitlab-ci.yml其他配置 曾经用 Github Pages 来托管博客内容,但是有一些不足: 在不科学上网的情况下,是没法访问的,或者访问速度非常慢代码仓库必须是公开的,如果设置为私有&#xff0…

智能图像处理平台:图片管理

接着我们讲图片管理,先实现图片基础的增删改查,再去考虑图像处理。 主要是,我们需要完成查询时,查询的图片的上传者的角色等级小于等于我们当前登陆账号。 后端controller: package com.llpp.controller;import cn.…

计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型音乐推荐系统 音乐数据分析 音乐可视化 音乐爬虫 知识图谱 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

《Python实战进阶》No 11:微服务架构设计与 Python 实现

第11集:微服务架构设计与 Python 实现 2025年3月3日更新了代码和微服务运行后的系统返回信息截图,所有代码在 python3.11.5虚拟环境下运行通过。 微服务架构通过将复杂应用拆分为独立部署的小型服务,显著提升了系统的可扩展性和维护性。本集…

NC2227_约瑟夫环

题解: import java.util.Scanner;​public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int k sc.nextInt();int m sc.nextInt();int set 0;for(int i 2;i < n;i ){set (set m) % i;}System.out.p…