如何在Windows上使用Docker搭建PHP開發環境

前言

在本地搭建開發環境我好像沒幾年就要折騰一次,因為本地開發電腦使用的是windows,早些年的時候,用過很多類似WAMP之類的東西,但最終都有或多或少不滿意的地方,前兩年的時候,還折騰過WSL,但也是有這樣那樣的問題,不過后來終于是win版寶塔更新了, 基本能和linux版的保持一致了,雖然有些東西在windows上要不沒有,要不用不了;

最近又換了電腦,本地的環境需要重新配置,借此機會,其實我一直想試試docker,前兩年折騰wsl2的時候,發現其實wsl2的io已經沒有那么差了。 而且Docker Desktop for windows 也已經支持基于wsl2來創建使用了。

(至于為什么要換,因為我老機器上跑的nginx好像內存泄露了一樣,啟動四到五個小時候內存占用就會跑到90%以上;啟動一天,遠程都連不上,鼠標都不會動了;老機器的環境是win版寶塔)

所以,花了幾天的時間,現在終于是弄通了,本文記錄下流程,以做沉淀。

安裝Docker Desktop

Docker Desktop: The #1 Containerization Tool for Developers | Docker
訪問上述鏈接即可下載,訪問不了的話可能需要想想辦法;
至于具體安裝, 這個網上有很多教程,不是本文要記錄的重點,所以暫且路過,不過有一點要說明的是,要使用wsl2;wsl2要求應該是win10某個版本以上,目前你能下載到的新一點的win10鏡像肯定都是沒問題的;wsl2的啟用可能也會有些小步驟,這個也建議去看下資料看看怎么安裝使用,本文略過;

選擇鏡像

假設上面的必備條件都已經準備妥當。
接下來就是選擇鏡像來啟動了, 其實在一開始我是打算全部單獨啟動容器,比如我需要用到的php,mysql,nginx等等,我原計劃打算一個php版本就啟動一個容器,然后以后需要的時候就再用需要的php版本鏡像再啟動一個容器就好了;

但實際操作中,需要自己修改調試的東西還是很多,不僅要先理解docker的基本語法來進行端口映射和卷映射,還需要了解在nginx中怎么配置才能將請求轉發到php進程進行處理,這些坑其實我都已經踩過了,但最后為什么放棄呢?

因為在我的實際開發中,雖然并不是外包公司,但是內部其實還是有很多大大小小的項目的,所以需要經常創建站點部署新項目,每配置一個新項目,我就需要去修改nginx的配置文件來配置代理,中間也記錄了一些操作筆記,也自己盡量劃分好了文件夾等等來實現nginx.conf自動加載某個目錄下的文件來實現快速的新增站點,但這個問題解決完后又發現,在一些項目中,還需要為php安裝特定擴展等等,我還想把php的配置文件映射到本地來隨時修改并保證刪除容器也不會對我做過的修改造成影響等等,更不用說還有mysql等等,這一系列操作,可能熟練了,或者專業的運維人員應該問題不大,但讓我來一個個去配置確實很難受。

后來我還試過利用docker-compose來編排服務依賴等等,在某種程度上來說,確實減少了一些操作步驟等,但我在對docker不是很熟練的情況下, 寫了很多很多個版本,都沒有一次性的成功啟動并完美運行,前前后后也是折騰了兩三天,到了最后還是繞不過手動配置站點以及其它的問題。再加上,需要端口映射,啟動過的容器好像是不能修改端口映射了。 這就很煩,網絡是host模式我這邊僅僅成功了一次,之后就直接失靈再也沒正常過了;

所以,最后最后最后,我還是妥協了,我選擇使用寶塔;
當然,我這次選擇使用docker版的寶塔,相比于win版寶塔,linux版的寶塔要好用的多;

使用寶塔鏡像

其實在以前我是知道在docker hub上是有大佬制作過baota鏡像的,但是因為當時不知道docker具體指令是干什么用的,一知半解下啟動的容器后來因為不懂把卷給刪了,自己可算是把自己給坑到哭了;

這次發現寶塔官方有提供docker鏡像,看了下版本也還算新(8.05);于是就直接拿來使用了;

拉取鏡像: docker pull btpanel/baota:lib ,我建議拉lib標簽的,你可以先看一下官方的docker hub介紹: hub.docker.com/r/btpanel/baota ,介紹里給的例子是拉取lnmp標簽, 本身做php開發確實要這個就剛剛好,但是我啟動后,發現里面的nginx,mysql,php什么的,都是掛掉的, 反正是不能用。試了兩次都不行,最后是卸載了重新安裝才可以,所以與其如此,我覺得直接拉取lib標簽的鏡像就好了,啟動進入后自己需要什么再單獨安裝吧;

啟動容器

docker run --name baota -v E:/www/wwwroot:/www/wwwroot -v E:/www/mysql_data:/www/server/data -v E:/www/vhost:/www/server/panel/vhost -p 22:22 -p 443:443 -p 80:80 -p 888:888 -p 8888:8888 -p 3306:3306 --restart=unless-stopped -d btpanel/baota:lib

上面是我的指令,簡單解釋下:
--name是給容器起名,我這里就起做baota了;

-v 是卷映射,:符號作為分隔,前面的是你本地的路徑,后面的是容器內的實際路徑,映射分幾種不同的模式,我這里就是把本機(windows)下的目錄映射到了容器里的具體路徑,比如這里的wwwroot目錄,做完映射就實現了代碼在我本地宿主機上,我可以隨時用windows來編輯修改;最重要的是不會隨著容器刪除等對我的代碼造成影響;以上映射的三個目錄也是遵循官方說明來做的, 一個站點目錄,一個mysql數據目錄,一個是虛擬域名的配置目錄;

-p 是端口映射,因為我本地測試給容器使用host網絡模式失敗,所以最后只能采用bridge模式,bridge模式就必須做端口映射了,不然本地可能就訪問不了你容器內的服務了,語法上,同樣是:做分隔,前面是本地(宿主機)端口,后面是容器內具體服務的端口,例如我這里有80(nginx),8888(該寶塔鏡像面板默認端口),以及mysql等等;按需做映射,或者如果你可以使用host模式,就不需要做映射了,但是要注意host模式下,是直接占用了宿主機的端口的,要注意這些端口是不是已經被占用;

--restart=unless-stopped 這個意思是僅在非正常停止的情況下自動重啟容器,也有其它選項,可自行查詢按需配置

-d 表示在后臺運行,我想大概就是守護模式運行一個意思;

btpanel/baota:lib 這個是鏡像名稱,要指定使用哪個鏡像來啟動容器;

一般是可以正常啟動的,啟動后訪問 http://localhost:8888/btpanel 就可以進入后臺了,這個地址是官方鏡像默認的地址,你可以自己使用docker進入容器,輸入bt就可以調出寶塔的指令,可自行進行修改端口,路徑,賬號,密碼等;

進入后版本為8.05,當前最新版本為8.20,我試過直接升級,目前沒發現什么問題;但是要注意,你在容器中做的操作,除了映射到本地的文件夾外,其它內容都會隨著容器的刪除等等丟失!(該問題可以考慮先啟動容器后把環境配置到自己滿意的程度,然后把容器打包為新的鏡像后期備用,同時鏡像也是可以保存為文件的,可以保存為文件方便更換設備時使用)

附加:使用docker中的php來配置vscode中的php驗證等

環境已經使用docker搭建了,其它一些依賴php的服務如果再讓去本地再裝一個php環境就本末倒置了,這點也有解決方案,但是有沒有未知的問題我還不清楚;后續使用中如果有發現我再更新說明;

創建php.bat文件

自己找個目錄,比如我放在了E:/www目錄下,新建php.bat文件,命名隨意;
內容如下,請根據備注釋義按需修改:

@echo offrem 啟用延遲變量擴展setlocal enabledelayedexpansionrem 設置 Docker 容器名稱和 PHP 路徑set CONTAINER_NAME=bt82lnmprem 設置php在docker中的執行路徑set PHP_PATH=phprem 設置Windows映射盤符set WIN_DRIVE=E:\rem 設置要替換為的windows盤符內容set WIN_DRIVE_REPLACE=\rem 原始文件路徑set FILE_PATH=%1if exist "%FILE_PATH%" (rem 將 Windows 路徑轉換為容器內的路徑set "FILE_PATH=!FILE_PATH:%WIN_DRIVE%=%WIN_DRIVE_REPLACE%!"rem 將 Windows 路徑轉換為linux的路徑set FILE_PATH=!FILE_PATH:\=/!)rem 使用 Docker 容器中的 PHP 運行傳遞的 PHP 文件docker exec %CONTAINER_NAME% %PHP_PATH% !FILE_PATH!rem 結束局部化變量的作用域endlocal

以上命令因為有注釋,所以不過多解釋,其中有個修改路徑的操作,是因為我vscode中安裝了code runner插件, 經常直接在php文件中執行某行代碼測試用,這一塊兒代碼專門針對不能使用code runner的問題進行的處理;

配置php路徑等

如上,創建完php.bat文件后,它的路徑假如是這樣: E:/www/php.bat 那么在vscode的配置文件中,路徑就直接這樣寫: E://www//php.bat ,配置完后可以測試一下是否可用

打包容器為鏡像

docker commit bt82lnmp baota bt82lnmp是新鏡像名稱,baota是當前容器的名稱;

保存鏡像為文件

docker save -o bt82lnmp.tar bt82lnmp bt82lnmp.tar是文件名稱,可以帶上路徑,像我這樣不帶的話,那就看當前命令行是在哪個目錄下,保存好的文件就直接在這個目錄下了,后面的bt82lnmp是鏡像名稱;
(PS:打包格式好像必須是.tar)

加載鏡像文件

docker load -i PATHFILE 在其它機器上加載鏡像文件,這里的PATHFILE自行更換,填寫你鏡像.tar文件的具體路徑

結語

至此,基本流程全部結束,間斷的折騰了近一周,寫文章寫了快兩個小時,寫到后邊的時候有些內容已經沒有心思寫的更詳細了。但我總體看了下,基本流程應該已經沒問題了;除了可能在實際操作中會碰到的一些亂七八糟的問題,但是基本都可以搜索解決;

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

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

相關文章

批量文件名修改軟件:一鍵解決同一編碼多型號文件分類與命名難題,高效管理文件

在數字化時代,圖片文件已經成為我們工作中不可或缺的一部分。然而,當面對成百上千個同一編碼下不同型號的圖片文件時,如何快速、準確地進行分類和命名,成為了許多職場人士頭疼的問題。現在,我們為您帶來了一款神奇的批…

MyBatisPlus 基礎數據表的增刪改查 入門 簡單查詢

MyBatisPlus MyBatisPlus(簡稱MP)是一個基于MyBatis的增強工具庫,簡化了MyBatis的開發,提供了很多實用的功能和特性,如自動生成SQL、通用CRUD操作、分頁插件、條件構造器、代碼生成器等。它不僅簡化了開發過程&#x…

2024海亮日記

寫在前面:長文預警 20240617 聽說要去海亮,不考(補考)期末考試,于是進行一個停課的辦理,第一次進入410,被逆天的配置和氣氛所震驚 發誓這回去HL一定要有好效果,于是制定了詳細的計…

golang 未指定類型interface{} 類型的 int類型數據json.Unmarshal 解碼后變成float64類型問題解決方法

golang內置的json反序列化方法,默認情況下對應 未指定類型interface{} 類型的的 int類型數據在經過Unmarshal解碼后 int類型的數據會變成 float64類型。 因為json里面默認將interface{}類型的int數據都當做float64來處理。 解決方法很簡單,就是使用自定…

優盤有盤符顯示0字節:故障解析與數據恢復策略

一、優盤有盤符顯示0字節現象描述 在使用優盤的過程中,我們有時會遇到一種令人困惑的情況:插入優盤后,電腦能正常識別到優盤的盤符,但當我們嘗試訪問其中的數據時,卻發現優盤的容量顯示為0字節,無法讀取或…

快速掌握MyBatis

MyBatis 是一個流行的 Java 持久層框架,它提供了一種半自動的 SQL 映射方式,使得開發者能夠更加靈活地編寫 SQL 語句,同時避免了傳統 JDBC 代碼的冗余和復雜性。下面進行簡要概述: MyBatis 快速掌握 核心概念:理解 My…

8.1 Firmware Update Process

8.1 Firmware Update Process 通過reset激活firmware 更新的過程: host發出firmare下載命令,將FW image下載到控制器。FW image可能有多個部分要下載,因此FW image 下載命令中指定正在下載的FW image的每個部分的偏移量。FW image 下載命令…

Sui創始團隊在競速環節中的快問快答

在Sui Basecamp活動期間,Sui區塊鏈的最初貢獻者在Oracle紅牛賽車模擬器上展示了他們的技術能力,在駕駛圈時回答了有關Sui的問題。 Evan Cheng(又名Revvin’ Evan)在解釋Mysticeti創下區塊鏈最終性記錄的同時保持著他的駕駛線路。…

Java | Leetcode Java題解之第200題島嶼數量

題目&#xff1a; 題解&#xff1a; class Solution {void dfs(char[][] grid, int r, int c) {int nr grid.length;int nc grid[0].length;if (r < 0 || c < 0 || r > nr || c > nc || grid[r][c] 0) {return;}grid[r][c] 0;dfs(grid, r - 1, c);dfs(grid, r…

go Channel原理 (三)

Channel 設計原理 不要通過共享內存的方式進行通信&#xff0c;而是應該通過通信的方式共享內存。 在主流編程語言中&#xff0c;多個線程傳遞數據的方式一般都是共享內存。 Go 可以使用共享內存加互斥鎖進行通信&#xff0c;同時也提供了一種不同的并發模型&#xff0c;即通…

【嵌入式——FreeRTOS】任務

【嵌入式——FreeRTOS】任務 任務創建和刪除動態方式創建任務靜態方式創建任務 刪除任務任務切換調度器任務切換流程 任務掛起任務恢復相關API函數 任務創建和刪除 動態方式創建任務 任務的任務控制塊以及任務的棧空間所需的內存&#xff0c;均由freeRTOS從freeRTOS管理的堆中…

c#asp.net中字典的使用

字典是一個鍵值對&#xff0c;可以用來保存數據&#xff0c;再查詢&#xff1b; 下面是一個案例&#xff1a;依據多個學號查詢多個學生的姓名&#xff0c;只能到數據庫查詢一次數據&#xff01;&#xff01;&#xff01; 先在數據庫查詢學號對應的學生&#xff0c;把數據保存在…

mysql8.0.19安裝zip版本

下載地址https://downloads.mysql.com/archives/community/ 下載版本 下載后解壓&#xff0c;不包括data 和my.ini文件。其中data 文件是自動生成的【mysqld --initialize --console】&#xff0c;my.ini需要自己編寫設置。 新建my.ini文件 需要自己設置 basedirG:\soft\mysql…

內網服務器時間校正

新購買的云服務器發現內網機器和可以訪問外網的機器時間慢了三分鐘&#xff0c;導致有些訪問會報錯&#xff0c;那么我們配置一下ntp校正一下時間。外網配置起來比較簡單&#xff0c;直接下載ntp執行校正命令即可。 比當前時間慢了三分鐘 注意當前服務器是可以訪問外網的機器這…

【gitee使用教程】(創建項目倉庫并上傳代碼簡易版)

gitee使用教程&#xff0c;創建項目倉庫并上傳代碼簡易版 1.在碼云上創建一個倉庫2.將代碼克隆到本地1.復制倉庫地址2.找到你想要放置的文件位置&#xff0c;右鍵點擊更多選項&#xff0c;選擇Git Clone3.將復制的倉庫地址填入URL 3. IDEA結合GIT和Gitee的簡單使用idea需要識別…

【python】最新版抖音s逆向拿到數據,非常詳細教程(附完整代碼)

?? 歡迎大家來到景天科技苑?? ???? 養成好習慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構師,華為云開發者社區專家博主,阿里云開發者社區專家博主,CSDN全棧領域優質創作者,掘金優秀博主,51CTO博客專家等。 ??《博客》:Python全…

Excel 宏錄制與VBA編程 ——VBA編程技巧篇一 (Union方法、Resize方法、Cells方法、UseSelect方法、With用法)

Uniom方法 使用Union方法可以將多個非連續區域連接起來成為一個區域&#xff0c;從而可以實現對多個非連續區域一起進行操作。 Resize方法 使用Range對象的Resize屬性調整指定區域的大小&#xff0c;并返回調整大小后的單元格區域。 Cells方法 Cells屬性返回一個Range對象。 Us…

Domino應用中的HTML5

大家好&#xff0c;才是真的好。 在xpages多年不見有效更新&#xff0c;前景不明的時候&#xff0c;Domino傳統Web應用開發方式還是受到了應有的青睞。畢竟&#xff0c;在Nomad Web時代&#xff0c;連最傳統的Notes CS原生應用也突然煥發了勃勃生機一樣。 但&#xff0c;對有…

什么是strcmp函數

目錄 開頭1.什么是strcmp函數2.strcmp函數里的內部結構3.strcmp函數的實際運用(這里只列舉其一)腦筋急轉彎 結尾 開頭 大家好&#xff0c;我叫這是我58。今天&#xff0c;我們要來認識一下C語言中的strcmp函數。 1.什么是strcmp函數 strcmp函數來自于C語言中的頭文件<str…

ARP 原理詳解 一

ARP 原理 ARP&#xff08;Address Resolution Protocol&#xff09;地址解析協議&#xff0c;是根據 IP 地址獲取物理地址的一個 TCP/IP 協議。 OSI 網絡七層模型中&#xff0c;IP 地址在 OSI 模型第三層&#xff0c;MAC 地址在第二層&#xff0c;彼此不直接通信。 在通過以…