想要快速入門並跳過下面的詳細教學嗎?為您的作業系統安裝Docker ,複製此儲存庫,將 Laravel 應用程式檔案新增至src目錄,然後從您剛剛複製的根專案目錄執行:

docker-compose build && docker-compose up -d

簡介

在開始之前,我們應該知道,本文並不是關於 Docker 的完整教程,也不是對該工具集複雜性的解釋。它更像是使用 Docker 和 docker-compose 快速設定本地開發環境的簡化演練,而不是直接在電腦上安裝 LAMP 堆疊。雖然有一些注意事項,但我發現下面的方法在開發 Laravel 應用程式時最適合我。

對於那些不知道 Docker 是什麼的人,讓我們先簡單了解一下。根據 opensource.com 報告:

Docker是一種工具,旨在讓使用容器更輕鬆地建立、部署和執行應用程式。容器允許開發人員將應用程式及其所需的所有部分(例如庫和其他依賴項)打包在一起,並將其全部作為一個套件發布。

您可以將 Docker 視為一個淡化的虛擬機器。

為什麼這有幫助或有用?如果您有多個執行不同版本的 Linux、PHP 或任何其他 Web 軟體的生產伺服器,那麼這些變數可以複製到您的容器中,並且可以保證應用程式將按照其預期在生產電腦上準確執行。

更符合本文的基調,如果您的本地計算機上有多個跨越不同版本的Laravel 專案,您可以為每個應用程式指定特定的Docker 配置,而無需實現PHP 版本切換器之類的東西並修改實際計算機的配置。您甚至可以同時存取這兩個專案,每個容器都彼此隔離執行。

聽起來令人興奮嗎?讓我們深入了解一下吧!

安裝 Docker

在本文中,螢幕截圖和參考資料將與 MacOS 用戶相關。但是,Windows 上的安裝和使用說明應該非常相似(即使不是幾乎完全相同)。

首先,取得安裝程式: https://docs.docker.com/docker-for-mac/install/

執行典型的應用程式安裝過程,完成後打開應用程式。第一次開啟 Docker 時,系統會要求您透過系統密碼對 Docker 進行授權,之後您會看到頂部狀態列中出現小鯨魚圖示。

專案結構

以下是我在 Laravel + Docker 專案中使用的結構。儘管本文的其餘部分將假設您的專案是使用相同的佈局設定的,但您不必明確遵循這一點。

my-project.com/
├── nginx/
│   └── default.conf
├── src/
│   └── (Laravel app files)
├── docker-compose.yml
└── Dockerfile

在接下來的幾個部分中,我將介紹每個檔案的用途,但現在只需使用上面的佈局將它們建立為空白佔位符。此外,在src/目錄下新增(或建立)整個 Laravel 應用程式的檔案。

建立我們的堆疊

使用 Docker 時的一個重要經驗法則是每個容器都應該提供單一服務。由於我們正在建立一個典型的 LEMP 堆疊,這意味著我們需要一個用於 Web 伺服器 ( Nginx )、 PHPMySQL 的堆疊。雖然理論上我們可以為每個服務建立單獨的容器,然後嘗試將它們連結在一起,但 Docker 有一個漂亮的內建工具,稱為docker-compose

我們所做的就是定義將要使用的服務,並在執行時 Docker 將每個服務提供為一個容器並將它們全部包裝在虛擬網路中。這意味著每個服務都可以從每個容器存取。

首先,打開docker-compose.yml檔案並將以下內容新增至其頂部:

docker-compose.yml 截圖開始

對我們剛剛加入的內容的一些快速解釋:

  • 版本:3 ,最新最推薦的docker-compose引擎版本

  • 網路:我們只使用一個網路laravel ,除了名稱之外我們沒有加入任何選項

  • 服務:我們將在其中指定構成堆疊的映像

新增 Nginx

在我們在上面docker-compose.yml檔案底部指定的服務標題的正下方,您將加入以下內容:

nginx 服務的 docker-compose.yml 截圖

上面我們所做的就是告訴 Docker 我們想要一個名為nginx的容器,它是從 nginx:stable-alpine 映像建置的(您可以在此處查看其完整原始程式碼)。我們使用 alpine linux 作為基礎作業系統,因為它輕巧且響應靈敏。

接下來,我們將容器命名為nginx並將其:80連接埠在本機電腦上公開為:8080 。我們最終將使用此連接埠號碼來存取我們的網站,您可以將其調整為您喜歡的任何非保留連接埠號碼。

對於 Web 伺服器的捲,我們新增以下兩項:

  • 我們的本地/src資料夾綁定到容器的/var/www路徑。與符號連結不同,我們在 /src 中修改的任何內容都將立即可供 /var/www 下的伺服器使用。

  • 我們建立的/nginx/default.conf檔案連結到/etc/nginx/conf.d/default.conf容器文件,並且使我們能夠修改本地電腦上的 nginx Web 伺服器。

您可以在此標題下指定任意數量的目錄或文件,以將它們從本機電腦符號連結到 nginx 容器。

透過在depends_on專案下加入php和mysql(我們接下來將建立的服務),我們告訴Docker在初始化時php和mysql容器需要在nginx之前執行。此外,如果我們嘗試只啟動 nginx 容器,它也會啟動這兩個依賴容器。

最後,我們明確指定容器位於我們在 docker-compose.yml 檔案開頭所建立的laravel網路下。

新增MySQL

我們要加入docker-compose.yml檔案中的下一個服務是 MySQL。這個相對簡單。

docker-compose.yml 截圖新增mysql服務

最初,我們指定映像和容器名稱,以及設定一些我認為有助於維護 MySQL 在容器中的穩定性的其他設定。

預設的 MySQL 端口:3306是我們向本地計算機公開的端口,然後使用環境物件,我們可以設定初始化期間使用的一些變數來修改建立的資料庫。由於我們正在為 Laravel 應用程式配置 Docker,因此我使用典型 Laravel .env 檔案中的預設資料庫名稱/使用者名稱/密碼。

就像 nginx 一樣,我們將此服務附加到laravel網路。

✨ 簡單!

新增 PHP

與 Nginx 和 MySQL 不同,新增PHP容器將採取不同的、稍微複雜的路徑。透過前兩個服務,我們能夠直接引用映像來建置我們的容器,但是由於 Laravel 需要依賴項,我們實際上將基於本機 Dockerfile 建置我們自己的映像。

在我們開始這部分之前,將以下內容作為下一個(也是最後一個)服務加入到我們的docker-compose.yml檔案中。

新增php服務的docker-compose.yml截圖

您已經可以發現差異,我們正在用建置標題替換之前使用的圖像標題。在它下面,我們將上下文指定為當前專案目錄,並將 dockerfile 指定為 Dockerfile(我們之前已經建立了)。

與我們的 nginx 容器一樣,我們為根目錄指定相同的捲,然後為容器公開連接埠:9000並將網路設定為laravel

現在我們已經加入了該服務,是時候將以下內容加入到我們的Dockerfile中了:

用於建立 PHP 映像的 Dockerfile 螢幕截圖

是的,就是這樣。

我們在這裡所做的就是:

  • 指定我們希望從7.2-fpm-alpine PHP 映像建置 php 容器。

  • 安裝 Laravel 的 ORM 與其資料庫方法一起使用的pdopdo_mysql PHP 擴充。

docker-php-ext-install指令是 Docker 內建的(並且沒有詳細記錄)。您可以傳遞任何 PHP 擴展,它將在我們新建立的容器中處理安裝和配置。

配置nginx

還記得我們建立的/nginx/default.conf檔案嗎?打開它並加入以下內容:

預設 nginx 設定的螢幕截圖

老實說,這裡沒有太多可討論的,因為它主要是與大多數基本 Laravel 應用程式一起使用的樣板 nginx 配置。請注意,根路徑設定為我們將 Laravel 應用程式連結到的/var/www nginx 目錄的公共資料夾。

啟動 Docker

我們已經將所有單獨的部分都準備好了,現在終於可以組裝我們的 Docker 網路了!開啟終端機視窗並導航到該專案的根目錄。由於我們的一個容器( php )使用 Dockerfile 作為其映像,並且這是我們第一次啟動這些容器,因此我們需要做的第一件事是執行建置命令來產生映像資料:

docker-compose build

這需要一些時間才能完成,並且可能看起來有一段時間沒有發生任何事情。大約 1-2 分鐘後,您應該會在終端機中看到「已成功建置」「已成功標記」訊息。然後,您可以使用以下命令繼續實際啟動容器:

docker-compose up -d

Docker 將建立我們的 laravel 網絡,然後建立我們在 docker-compose.yml 檔案的 services 部分中指定的三個容器。如果您對-d標誌感到好奇,它代表分離並在處理完所有命令後保持容器執行。否則,一旦完成初始化,Docker 就會停止它們。對於網頁伺服器來說毫無意義!

配置 Laravel

在我們第一次存取我們的應用程式之前,我們需要對 Laravel .env 檔案進行一些小的調整。特別是關於資料庫連接和應用程式域。在src目錄中開啟專案的.env檔案並修改以下行:

  • DB_HOST=mysql - 這個名稱來自我們在 docker-compose.yml 檔案中建立的 MySQL 服務,並在 Docker 網路中用於引用其他容器中的服務。

  • APP_URL=http://localhost:8080 - 新增您在 nginx 容器中公開的連接埠號,以使其指向可解析的位址。

存取您的應用程式

假設上述步驟中的所有內容都已成功啟動,我們現在可以使用公開的連接埠存取我們的容器並查看我們應用程式的登陸頁面!

在瀏覽器中,導覽至http://localhost:8080 ,其中8080是您在 docker-compose.yml 檔案中的 nginx 服務下指定的第一個連接埠。

顯示 Laravel 登陸畫面的瀏覽器螢幕截圖

💥 繁榮!我們的 Laravel 應用程式在 Docker 網路中執行!

當然,如果您可能還想使用TablePlus之類的工具存取 MySQL 資料庫,那麼連接到該資料庫也同樣簡單。您要做的就是使用127.0.0.1作為主機,以及您在 docker-compose.yml 檔案中的 MySQL 服務下公開的連接埠(在本範例中,我們將其保留為預設值3306 ) 。

我們在環境變數中指定的使用者名稱和密碼分別為MYSQL_USERMYSQL_PASSWORDhomesteadSecret

TablePlus 設定的螢幕截圖

注意:如果您打算為不同的專案同時執行多個網絡,則必須指定不同的連接埠以在本機電腦上公開(例如,一個為 8080,另一個為 8081)。否則,在容器初始化期間,您將收到port is already allocated錯誤。

執行命令

Laravel 經常使用命令列來進行遷移、佇列和測試等操作。使用 docker-compose 的exec指令在我們的 Docker 網路上執行這些指令非常簡單。

Docker 不是透過 ssh 進入系統並直接在作業系統上執行命令的虛擬機,而是偏好將命令傳遞到容器,然後將這些命令的輸出回顯到終端。例如,讓我們透過在專案根目錄的終端機中執行以下命令來執行 Laravel 附帶的預設遷移:

docker-compose exec php php /var/www/artisan migrate

讓我們稍微分解一下:

  • docker-compose exec告訴 Docker 我們要在容器網路上執行指令。

  • php我們要執行指令的容器名稱。由於我們要執行 PHP 命令,因此它需要位於執行 PHP 的容器上。

  • php /var/www/artisan 遷移我們正在執行的指令的實際名稱。我們使用 artisan 的絕對路徑,該路徑通過 ./src 的本地捲進行符號連結,並執行標準的 Laravel 遷移。

執行 docker-compose migrate 指令後的終端螢幕截圖

執行我們的命令後,您應該會看到遷移輸出,並且您的資料庫現在將填充兩個表!

可以從本機終端將任意數量的命令執行到我們選擇的 Docker 容器。只需注意要在其上執行命令的容器中安裝和可用的服務即可。

提示:如果您堅持要直接透過 ssh 進入容器來執行命令,有一個非常簡單的解決方法。跑步

docker-compose exec {container_name} /bin/sh將開啟與 {container_name} 參數中指定的容器的持久連線。

隊伍的盡頭

好吧,我們就有了!我們已經安裝了 Docker,設定並配置了 docker-compose 檔案來建立包含在單一網路中的三個容器的 LEMP 堆疊,在該網路上公開了允許我們存取應用程式和資料庫的端口,甚至執行了 cli 命令透過docker-compose的exec方法。

展望未來,如果您想關閉容器和網絡,只需導航到專案的根資料夾並執行即可

docker-compose down 。這將關閉並銷毀容器以及儲存在其中的任何關聯的非磁碟區資料

當我處理跨越不同 Laravel 版本的多個專案時,Docker 為我開啟了一個充滿開發可能性的世界。我可以使用7.1輕鬆地在具有 PHP 容器的 Docker 網路上執行一個專案,如果我想了解當前專案在 PHP 7.3中的執行情況,只需更改 Dockerfile 中的單個字符,重新建置容器即可,並恢復docker -compose 網路。

我不會否認,與直接在機器硬體上執行堆疊相比,您不會獲得更好的本地開發效能。但對我來說,性能多功能性、易用性、並行環境和客製化的權衡遠遠超過了這些。

如果您有任何問題、意見或想進一步討論

PHP 和 Laravel,請隨時在Twitter上與我聯絡!如果您正在尋找專門針對 Laravel 應用程式的超級簡單錯誤和日誌監控服務,我已經建立了Larahawk 。它目前處於內測階段,很快就會推出,每個應用程式每月只需 5 美元。


原文出處:https://dev.to/aschmelyun/the-beauty-of-docker-for-local-laravel-development-13c0


共有 0 則留言