這篇文章給大家介紹PHPSTORM中怎么調(diào)試Docker項目,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Docker基本用法首先要知道 Docker 最基本的兩樣?xùn)|西:image和
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司提供網(wǎng)站設(shè)計和自適應(yīng)建站服務(wù)。團隊由有經(jīng)驗的網(wǎng)頁設(shè)計師、程序員和市場專家組成,能夠提供從成都h5網(wǎng)站建設(shè),網(wǎng)站制作,1元廣告,模板建站到重慶小程序開發(fā)等全方位服務(wù)。 以客戶為中心,致力于為客戶提供創(chuàng)新、高效的解決方案,幫助您打造成功的企業(yè)網(wǎng)站。
containerimage 鏡像,搭建一個 Docker 環(huán)境最基本的就是 image??梢?/strong>簡單理解
為這就是創(chuàng)建虛擬機的那個鏡像。container 容器。即 依據(jù) image,創(chuàng)建出來的虛擬環(huán)境。可以簡單理解
為就是運行著的虛擬機
Docker 的配置文件為 Dockerfile。該文件內(nèi)容為構(gòu)建 container 的命令。基本命令有:FROM
設(shè)置 container 運行在哪個 image 上。必須寫在 Dockerfile 的開頭??梢栽?Docker Hub里找適合的 image。RUN 在 image build
時執(zhí)行命令。一般用于安裝環(huán)境CMD 在 container剛啟動
時執(zhí)行命令。一般用于啟動服務(wù)COPY
將宿主機的文件拷貝到 container中WORKDIR
設(shè)置工作目錄。所有命令都會在這個目錄的基礎(chǔ)上進行工作
了解了上面的三個命令后,我們可以來簡單寫一個 Dockerfile了。#基礎(chǔ) image 為 php:7.3-apacheFROM php:7.3-apache#安裝 xdebug 擴展 并開啟RUN pecl install xdebug && \docker-php-ext-enable xdebug#將 宿主機的 phpinfo.php 拷貝到 container /var/www/html/phpinfo.php 中COPY ./phpinfo.php /var/www/html/phpinfo.php
寫完后在 Dockerfile 的目錄里運行docker build -t test/testmyphp .
等命令跑完,輸入以下命令即可看到創(chuàng)建好的 image$ docker image lsREPOSITORY TAG IMAGE ID ......test/testmyphp latest 4931b92274f2 ......
要想讓 container 運行起來,使用如下命令。使用-p來指定映射端口,左邊是宿舍機端口,右邊是 container 端口docker run -p 81:80 test/testmyphp
查看運行中的 container$ docker container lsCONTAINER ID IMAGE PORTS ......10b8c28b2f69 test/testmyphp 0.0.0.0:81->80/tcp ......
進入 container 的 shell$ docker exec -it CONTAINER_ID值 bashroot@10b8c28b2f69:/var/www/html#
至此,基本的 Docker 環(huán)境我們就建好了。接下來研究下如何讓 PHPSTORM 調(diào)試 Docker 項目調(diào)試方式一 - Docker掛載調(diào)試
這里做測試使用前文的 Dockerfile,需要按照實際情況進行配置添加。配置Dockerfile#基礎(chǔ) image 為 php:7.3-apacheFROM php:7.3-apache#安裝 xdebug 擴展 并開啟RUN pecl install xdebug && \docker-php-ext-enable xdebug# !!! 使用一個啟動腳本來啟動服務(wù) !!!COPY ./start.sh /start.shRUN chmod +x /start.shCMD ["/start.sh"]
start.sh 內(nèi)容#配置 Xdebugecho "xdebug.client_host = host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.iniecho "xdebug.client_port = 9003" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.iniecho "xdebug.mode = debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.iniecho "xdebug.max_nesting_level = 1000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.iniecho "xdebug.discover_client_host = true" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini#重啟 apache sshservice apache2 restart
重建 image:#最好先刪掉之前的再重建docker image rm IMAGE值 -fdocker build -t test/testmyphp .
重建完先不急著跑 container。先定位到我們的項目代碼位置
使用 Docker 的 Bind mounts 技術(shù)。將宿主機的項目目錄映射到 container 的網(wǎng)站目錄下docker run -p 81:80 --mount type=bind,source=/home/xp/test_docker/test_program,target=/var/www/html test/testmyphp
至此,調(diào)試環(huán)境所需要的服務(wù)就安裝好了,接下來配置 PHPSTORM。配置 PHPSTORM
直接使用Open打開項目
配置 目錄映射
進入 File -> Settings -> Languages & Frameworks -> PHP -> Servers。配置目錄映射
注意一定要把 Use path mappings 的勾勾上,才能配置目錄映射
Absolute path on the server 是要手動打上路徑的
設(shè)置Xdebug端口
進入 File -> Settings -> Languages & Frameworks -> PHP -> Debug。設(shè)置 Xdebug Debug port 為 9003。和 php 配置一致。
配置一個 Run/Debug Configuration
點擊 PHPSTORM 右上角的 Add Configuration....。進入配置面,新增一個 PHP Web Page。并進行如下簡單的配置即可(改名字設(shè)url 路徑)
啟動 PHP Debug Listening
直接點擊 PHPSTROM 右上角的 小電話 ,即可開啟監(jiān)聽
驗證
在 php文件上打上斷點,點擊 右上角 甲殼蟲樣式的 Debug按鈕。即可成功斷點調(diào)試方式二 - ssh 隧道這種方式不僅僅可以用在 Docker 環(huán)境上,同樣可以用在 遠程服務(wù)器
上。缺點就是要在 container 里頭安裝許多額外服務(wù)。配置Dockerfile
安裝ssh服務(wù)。 PHPSTORM需要 ssh 來進行目錄映射,不然無法成功 Debug
安裝 xdebug。這是調(diào)試的基礎(chǔ)擴展組件
設(shè)置 ssh 允許 root 登陸。畢竟只是個 docker 調(diào)試環(huán)境,就不弄那么麻煩了。當(dāng)然如果是線上業(yè)務(wù)啥的當(dāng)然要做好權(quán)限分配。
修改 root密碼。畢竟不知道密碼也無法連接
啟動 ssh 服務(wù)
重啟 apache 服務(wù)
這里做測試使用前文的 Dockerfile,需要按照實際情況進行配置添加。
修改前文的 Dockerfile。#基礎(chǔ) image 為 php:7.3-apacheFROM php:7.3-apacheENV APACHE_DOCUMENT_ROOT /var/www/html#安裝 ssh 服務(wù)RUN apt-get update && \apt-get install ssh -y#安裝 xdebug 擴展 并開啟RUN pecl install xdebug && \docker-php-ext-enable xdebug#將宿主機的 phpinfo.php 拷貝到 container /var/www/html/phpinfo.php 中COPY ./phpinfo.php /var/www/html/phpinfo.php# !!! 使用一個啟動腳本來完成流程 3 4 5 的工作 !!!COPY ./start.sh /start.shRUN chmod +x /start.shCMD ["/start.sh"]
start.sh 內(nèi)容#!/bin/bash#設(shè)置 ssh 允許 root 登錄echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config#修改root密碼echo root:123456 | chpasswd#配置 Xdebug。Xdebug 3 的配置如下,和 Xdebug 2不太一樣echo "xdebug.client_host = host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.iniecho "xdebug.client_port = 9003" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.iniecho "xdebug.mode = debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.iniecho "xdebug.max_nesting_level = 1000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.iniecho "xdebug.discover_client_host = true" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini#重啟 apache sshservice apache2 restartservice ssh restart#要加上這個,不然 container 運行完就停止了。sleep infinity
重建 image:#最好先刪掉之前的再重建docker image rm IMAGE值 -fdocker build -t test/testmyphp .
啟動 container:docker run -p 81:80 -p 2222:22 test/testmyphp
至此,調(diào)試環(huán)境所需要的服務(wù)就安裝好了,接下來配置 PHPSTORM。配置 PHPSTORM
打開 PHPSTORM,新建一個 Project。選擇 New Project from Existing Files
選擇 Web server is on remote host。
一路 Next。走到配置 Remote Server
然后又是一路 Next 即可。
配置完成后,將能看到我們的項目。
此時是不能直接進行代碼調(diào)試的。我們要做以下工作
配置 CLI Interpreter
配置目錄映射
設(shè)置Xdebug端口
配置一個 Run/Debug Configuration
啟動 PHP Debug Listening
ps:由于有些步驟是一樣的,就直接拉上文的截圖過來了。
配置 CLI Interpreter
進入 File -> Settings -> Languages & Frameworks -> PHP。設(shè)置 CLI Interpreter
新建一個 CLI Interpreter。選擇 From Docker, Vagrant, VM, WSL,Remote....
這里我們可以填 SSH,也可以直接選擇 Docker。我這里用的是 SSH
設(shè)置 PHP executable 路徑。不知道可以進入 container 中使用whereis php進行搜索
配置 目錄映射
進入 File -> Settings -> Languages & Frameworks -> PHP -> Servers。配置目錄映射
注意一定要把 Use path mappings 的勾勾上,才能配置目錄映射
Absolute path on the server 是要手動打上服務(wù)器路徑的
設(shè)置Xdebug端口
進入 File -> Settings -> Languages & Frameworks -> PHP -> Debug。設(shè)置 Xdebug Debug port 為 9003。和 php 配置一致。
配置一個 Run/Debug Configuration
點擊 PHPSTORM 右上角的 Add Configuration....。進入配置面,新增一個 PHP Web Page。并進行如下簡單的配置即可(改名字設(shè)url 路徑)
啟動 PHP Debug Listening
直接點擊 PHPSTROM 右上角的 小電話 ,即可開啟監(jiān)聽
驗證
在 php文件上打上斷點,點擊 右上角 甲殼蟲樣式的 Debug按鈕。即可成功斷點擴展 - 遠程服務(wù)器調(diào)試
這里可以擴展以一下,如果調(diào)試目標是遠程服務(wù)器而不是本地 Docker,該如何配置?
其實和上面的步驟一樣的,只是 Xdebug 監(jiān)聽的流量我們要做修改下。
簡單說說 Xdebug 監(jiān)聽的原理:
當(dāng) php-xdebug 接收到帶有 XDEBUG_SESSION_START 的請求時,將會把當(dāng)前的 Debug信 息發(fā)送給 xdebug 中配置的 client_host 和 cilent_port。
在我們的 start.sh 啟動文件中,設(shè)置如下:xdebug.client_host = host.docker.internalxdebug.client_port = 9003
host.docker.internal值在 Xdebug 中是自動將請求端的 ip 設(shè)置為 調(diào)試端,即自動將 Debug信息 發(fā)送給任何請求IP。
而xdebug.client_port的值是 Debug信息 被發(fā)送至的端口。
我們可以想下,在本地,xdebug端是能訪問到到我們請求端的 ip 和 端口 的,因為都是同一局域網(wǎng)。
但若調(diào)試的是遠程服務(wù)器,由于公網(wǎng)和內(nèi)網(wǎng)的原因,公網(wǎng)服務(wù)器是無法發(fā)送 Debug信息 調(diào)試端的(除非調(diào)試端也在公網(wǎng)上。。)
所以我們需要將xdebug.client_host設(shè)置為127.0.0.1,讓 xdebug 轉(zhuǎn)發(fā) Debug信息 到本地的 9003 端口中。
接著使用 ssh 隧道進行端口轉(zhuǎn)發(fā),把調(diào)試端監(jiān)聽的 9003 端口映射到 服務(wù)端的 9003 上。這樣就能接收到 xdebug 轉(zhuǎn)發(fā)的 Debug信息了。這一點使用 ssh 隧道是可以做到的。
我們來測試下,首先修改 php.ini。讓xdebug.client_host值為127.0.0.1
進行 ssh隧道端口轉(zhuǎn)發(fā)
ssh -N -R 遠程IP:遠程端口:127.0.0.1:9003 root@遠程IP