避坑!用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
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896721.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896721.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896721.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

自動化測試開發

4、Servlet模型(一) Servlet的編寫、訪問過程 Servlet簡介 Servlet是Java Servlet的簡稱,是小服務程序或服務連接器,是用Java編寫的服務器端程序,主要功能在于獲取請求,返回響應廣義:一個Ser…

24、Java 集合

十一章:Java 集合 一、集合框架的概述 1、集合:就像一個容器,可以動態的把多個對象的引用放入容器中。簡稱 Java 容器 ? 說明:此時的存儲,主要指的是內存層面的存儲,不涉及到持續化的存儲(.t…

1114棋盤問題acwing(深度優先搜索)

題目描述 在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。 要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對于給定形狀和大小的棋盤,擺放 kk 個棋子的所有可行的擺放…

logback日志輸出配置范例

logback日志輸出配置范例 在wutool中,提供了logback日志輸出配置范例,實現日志文件大小限制、滾動覆蓋策略、定時清理等功能。 關于wutool wutool是一個java代碼片段收集庫,針對特定場景提供輕量解決方案,只要按需選擇代碼片段…

測試人員如何驅動開發?

軟件開發中測試人員的作用正在從傳統的缺陷發現者演變為開發過程的主動推動者。特別是在敏捷和 DevSecOps 環境中,測試人員如何通過參與需求、提供反饋和推動自動化來驅動開發,成為一個值得探討的話題。本文將詳細分析測試人員驅動開發的具體方式&#x…

大模型語料庫的構建過程 包括知識圖譜構建 垂直知識圖譜構建 輸入到sql構建 輸入到cypher構建 通過智能體管理數據生產組件

以下是大模型語料庫的構建過程: 一、文檔切分語料庫構建 數據來源確定: 首先,需要確定語料庫的數據來源。這些來源可以是多種多樣的,包括但不限于: 網絡資源:利用網絡爬蟲技術從各種網站(如新聞…

oracle游標為什么沒有共享,統計一下原因

-- Script Code為什么沒共享 define sql_id bs391f0yq5tpw;set serveroutput onDECLAREv_count number;v_sql varchar2(500);v_sql_id varchar2(30) : &sql_id; BEGINv_sql_id : lower(v_sql_id);dbms_output.put_line(chr(13)||chr(10));dbms_output.put_line(sql_id: ||…

哈希碰撞攻防戰——深入淺出Map/Set的底層實現

各位看官早安午安晚安呀 如果您覺得這篇文章對您有幫助的話 歡迎您一鍵三連,小編盡全力做到更好 歡迎您分享給更多人哦 今天我們來學習Map/Set的底層實現 目錄 問題一:hash會出現負數?數組越界 一:什么是二叉搜索樹&#xff1f…

win10使用haneWIN NFS Server掛載NFS v2服務,u-boot通過NFS下載zImage

1. haneWIN NFS Server掛載NFS v2服務 https://www.hanewin.net/nfs-e.htm netstat -ano | findstr ":2049"TCP 0.0.0.0:2049 0.0.0.0:0 LISTENING 3824UDP 0.0.0.0:2049 *:* 38…

Linux文件系統與目錄結構

Linux系統中一切皆文件 bin 是Binary 的縮寫, 這個目錄存放著最經常使用的命令 boot 這里存放的是啟動Linux時使用的一些核心文件,包括一些連接文件以及鏡像文件,自 己的安裝別放這里。 cdrom 這個目錄通常專門用來掛載光盤。當系統剛安裝時&#x…

一文詳解基于NarrotoAI的短劇短視頻自動解說、混剪AI平臺搭建

背景 前陣給孩子做電子相冊學了點剪輯技術,就想湊個熱鬧剪剪短劇玩玩,一是學以 致用,再者也好奇短劇創作為啥這么火,跟個風。 初步了解情況后,發現我的剪輯技術已經落后了,行家們玩的主要是解說 &#xf…

計算機畢業設計Hadoop+Spark+DeepSeek-R1大模型音樂推薦系統 音樂數據分析 音樂可視化 音樂爬蟲 知識圖譜 大數據畢業設計

溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 溫馨提示:文末有 CSDN 平臺官方提供的學長聯系方式的名片! 作者簡介:Java領…

《Canvas修仙傳·第三重天金丹境(下集)》 ——量子煙花與物理宇宙的混沌法則

各位道友久候!上集我們煉就了《靈蛇奇譚》的元神,今日將開啟Canvas修仙路上最絢麗的篇章——掌控微觀粒子的創世之力!(ノ≧?≦)ノ 章前黑話詞典 🔍 量子境術語表: 對象池(Object Po…

c++ namespace名字域空間

在C中,namespace 是一個非常重要的概念,用于組織代碼,避免名稱沖突。namespace(命名空間)是一個邏輯上的代碼組織單元,用于將代碼(類、函數、變量等)分組,從而避免命名沖…

獲取阿里云OSS預簽名URL下載(java)

1,引入依賴 <dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId> </dependency> <!--AliSms--> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-s…

中間件專欄之Redis篇——Redis的基本IO網絡模型

Redis主要采用的是單線程的事件驅動模型&#xff0c;通過I/O多路復用來實現高效的并發請求處理。 一、單線程模型 Redis 采用 單線程模型 來處理所有請求&#xff0c;包括網絡 I/O 和命令執行。雖然現代多核 CPU 能夠并行處理任務&#xff0c;但 Redis 的設計原則是盡量避免多…

Python 線程同步

Python 線程同步 Python 線程同步 Python 線程同步 線程同步是一種確保兩個或多個線程不同時執行同一塊共享代碼的機制。共享塊中的代碼通常是訪問共享數據或資源&#xff0c;這種共享塊被稱作臨界區。這個概念可以用下面的圖清晰地表示出來&#xff1a; #mermaid-svg-2TivIuc…

Linux操作系統5-進程信號3(信號的捕捉流程,信號集,sigaction)

上篇文章&#xff1a;Linux操作系統5-進程信號3&#xff08;信號的保存, 用戶態與內核態&#xff0c;內核空間&#xff09;-CSDN博客 本篇Gitee倉庫&#xff1a;???????myLerningCode/l26 橘子真甜/Linux操作系統與網絡編程學習 - 碼云 - 開源中國 (gitee.com) 本篇重點…

【機器學習chp10】降維——(核化)PCA + MDS + lsomap + 拉普拉斯特征映射 + t-NSE + UMAP

目錄 一、降維的意義與本質 1、意義 2、本質 3、常見降維方法 &#xff08;1&#xff09;線性降維 &#xff08;2&#xff09;非線性降維 二、基于重構的降維 1、PCA 2、核化PCA &#xff08;1&#xff09;實現過程 步驟一&#xff1a;數據映射與核函數定義 步驟二…

代碼的解讀——自用

代碼來自&#xff1a;https://github.com/ChuHan89/WSSS-Tissue?tabreadme-ov-file 借助了一些人工智能 run_pipeline.sh 功能總結 該腳本用于執行一個 弱監督語義分割&#xff08;WSSS&#xff09; 的完整流程&#xff0c;包含三個階段&#xff1a; Stage1&#xff1a;訓…