Docker for PHP:一個從頭到尾的指南
你可能在過去的幾年裡看到過Docker的提及。本指南介紹了基礎知識,以便您可以在本地開發環境中啟動和運行Docker for PHP。
為何選擇Docker?
在昏暗和遙遠的過去,當開發人員想要更改生產代碼時,他們可能已經SSH連接到伺服器並手動更改了代碼。 (SSH意味著Secure Shell,它是在不安全的網路上運行網路服務的一種方式。)當然,在PHP的良好測試和良好的構建管道方面幾乎沒有經驗和指導。謝天謝地,這已經改變了。
如今,開發團隊希望能夠在類似生產的環境中測試代碼。這樣做可以讓團隊自信地部署代碼。為此,本地開發環境需要與代碼運行的生產環境相同(或儘可能接近)。
虛擬機是朝著這個方向邁出的一步。有了這些,開發人員可以在本地計算機上啟動生產軟體的版本。虛擬機工作正常,但它們很慢並且使用了大量系統資源。
Docker修復了這些問題以及更多問題。能夠在項目之間建立隔離環境,輕鬆測試不同版本的代碼,以及佔用空間小的這些東西,這只是Docker贏得我心的原因之一。
Docker for PHP入門
首先,確保在本地系統上安裝了Docker。我認為網站上的文檔對於所有操作系統都是清晰的。
本教程您將需要的另一件事是名為composer的PHP包管理系統。
一些工具將為您提供Docker配置,而無需自己理解。我嘗試了幾種這樣的工具,而且我的經驗好壞參半。我喜歡控制構建中的所有內容,以確保只安裝必要的工具。像大多數其他開發人員一樣,我也想了解代碼正在做什麼,而不是依賴於「魔術」命令。因此,當我設置此配置時,我將嘗試解釋所發生的一切。
讓我們使用一個簡單的Laravel應用程序來啟動和運行。但是,本指南適用於所有PHP軟體和框架。
通過打開新終端並運行以下命令來安裝空的Laravel項目:
作曲家創作項目laravel / laravel docker-tutorial
現在創建Docker配置所需的三個文件:
mkdir .docker#一個隱藏文件夾,用於保存大部分Docker配置。
觸摸.docker / Dockerfile .docker / vhost.conf
touch docker-compose.yml#這必須在根目錄下。
就是這樣 – 三個文件和一個目錄
如果您使用此設置與每個框架或應用程序準備,那麼您將始終知道在哪裡查看和檢查什麼。
讓我們來看看每個文件如何為您的配置做出貢獻。我們還將介紹一些關鍵的Docker命令。
編寫Dockerfile
Dockerfile是一個文本文檔,其中包含構建Docker鏡像所需的指令。構建後,容器會運行這些映像的實例。幾乎在每種情況下,您的圖像都將構建在另一個場景之上。 Docker Hub有很多可供選擇的圖像。我喜歡使用官方PHP圖像作為我的項目的基礎。
在本教程中,我們使用Apache伺服器:
來自php:7.3-apache
複製。 /應用
COPY .docker / vhost.conf /etc/apache2/sites-available/000-default.conf
RUN chown -R www-data:www-data / app && a2enmod rewrite
Dockerfile指令僅依賴於幾個主要關鍵字。我在這裡列出了其中三個。
- 這裡的FROM命令聲明要使用的基本映像。我們使用的是php:7.3-apache,一個帶有特定標籤的官方PHP圖像。在文檔中,您可以看到可供選擇的特定和通用標記。您越具體,不同環境之間的兼容性問題就越少。
- 接下來,您可以將一些文件複製到圖像中。您可能希望先將代碼複製到/ app文件夾中,然後將vhost.conf文件複製到文件系統的正確部分。您可以將任何文件複製到相對於構建圖像的上下文的圖像中。
- 然後,您可以運行chown命令,將應用程序文件的所有權更改為Apache Web用戶。使用RUN關鍵字執行的命令會自動在根級別運行,因此您無需在sudo前添加它們。
編寫vhost文件
這個文件中沒有太多內容。我們將Web主機指向Laravel入口點並收集日誌。
DocumentRoot / app / public
AllowOverride all
要求全部授予
ErrorLog ${APACHE_LOG_DIR} /error.log
CustomLog ${APACHE_LOG_DIR} /access.log組合在一起
日誌文件通過管道傳送到STDOUT,因此您可以在應用程序運行時實時查看它們。這對於在本地調試錯誤很方便。
構建圖像
Docker管理容器,Docker運行的每個容器都依賴於圖像。該映像是一個構建工件,可以經過嚴格測試,並且對所有伺服器都是相同的。這種測試和相同性使部署代碼的質量和穩定性更加可靠。
要生成構建映像,請從項目根目錄運行以下命令:
docker build -file .docker / Dockerfile
-t docker-tutorial。
文件標誌顯示Dockerfile的位置,-t標誌用於標記圖像。標記很有用,因此您可以跟蹤系統中的圖像並區分項目。它還簡化了以後如何引用圖像的過程。
最後的「。」定義了構建發生的上下文。此上下文對於構建過程中的COPY命令尤其重要。
運行伺服器
現在,您可以使用此圖像啟動容器,最後查看您的應用程序。
docker run -rm -p 8080:80 docker-tutorial
如果您已經跟隨,請導航到localhost:8080。您應該看到Laravel項目啟動頁面。
做得好您已經從頭開始構建Dockerfile和容器。
命令中的-rm標誌表示退出docker進程時將刪除容器。 -p標誌將localhost上的埠映射到docker容器內的埠。最後一個參數是您要構建的圖像,由您之前添加的標記引用。
我們到了嗎?
創建構建映像時,可以複製應用程序文件並使其成為工件的一部分。這些文件在構建後是靜態的,在本地更改它們不會在docker鏡像中更改它們。
在開發過程中,您可能希望在容器中更新文件。為此,請使用docker-compose。
編寫docker-compose.yml文件
docker-compose文件編排了多個Docker容器的創建,並處理它們之間的網路連接。為每個作業安裝一個容器是一種好習慣,因此通常有一個用於Web伺服器的容器和一個用於資料庫的容器。您可以在docker-compose文件中聲明和協調這兩者。
版本:'3'
服務:
搬運工教程:
建立:
背景:。
dockerfile:.docker / Dockerfile
圖片:docker-tutorial
埠:
– 8080:80
頂部的版本聲明告訴docker-compose您正在使用哪種配置格式。
此時,您可以開始聲明服務。 Docker為每個服務旋轉一個單獨的容器。目前,您只有一個名為docker-tutorial的容器。其餘配置應類似於命令行執行。
對於構建步驟,您可以提供上下文(在本例中為當前目錄)。然後你可以指向正確的Dockerfile。您還擁有與之前相同的埠綁定。
從項目根目錄運行:
碼頭工人組成
你已經設法讓docker-compose為你帶來前所未有的位置但您仍然無法訪問本地文件系統。為此,您需要安裝成交量並更改Dockerfile中的構建步驟。
…
服務:
搬運工教程:
…
成交量:
– 。:/ app
在Dockerfile中,不是將文件複製到映像中,而是創建/ app目錄,然後
複製。 /應用
然後成為
運行mkdir / app
現在,運行你的docker-compose命令 – 但是,因為你已經更新了Dockerfile,你需要確保重建圖像。通過將-build標誌添加到docker-compose命令來執行此操作。
docker-compose up -build
當您訪問localhost:8080上的站點時,它應該提供實時本地文件。您所做的任何更改都將立即在生產環境中可見。
可能的許可權錯誤
在某些情況下,您可能會收到錯誤,因為Apache Web用戶無法寫入日誌。如果發生這種情況,您需要更改存儲和引導目錄的許可權,如下所示:
chmod -R o + rw bootstrap / storage /
之後一切都應該正常工作。
添加資料庫
大多數應用程序都有一個持久存儲資料庫。讓我們在您的設置中添加一個MySQL資料庫。您需要對docker-compose.yml文件進行一些更改。
版本:'3'
服務:
搬運工教程:
…
鏈接:
– mysql
環境:
DB_HOST:mysql
DB_DATABASE:docker
DB_USERNAME:docker
DB_PASSWORD:docker
MySQL的:
image:mysql:5.7
埠:
– 13306:3306
環境:
MYSQL_DATABASE:docker
MYSQL_USER:docker
MYSQL_PASSWORD:docker
MYSQL_ROOT_PASSWORD:docker
你的docker-compose.yml文件有很多內容,但希望很明顯發生了什麼。
鏈接鍵是聲明您希望docker-tutorial容器鏈接到的所有容器。在這種情況下,它只是MySQL伺服器,但它可以是任何數量的其他服務。 Docker使用此聲明處理容器之間的所有內部路由。
然後我們聲明了一些環境變數。這些將否決在Laravel的.env文件中聲明的任何變數。
第二個啟動的服務是mysql。該圖像是具有特定版本號的官方MySQL。
最後,您可以添加埠映射和環境變數。
運行命令
Docker容器已啟動並運行最後要看的是運行命令。要在docker-tutorial容器中獲取命令提示符,請嘗試以下操作:
docker-compose exec docker-tutorial / bin / bash
這在/ var / www / html目錄中提供了bash提示符,這是apache2 hosting的標準目錄。如果您正在使用/ app,則可以更改目錄並運行資料庫遷移。
cd / app
php工匠遷移
嗯,哦您沒有資料庫驅動程序。為什麼不?因為Laravel使用的驅動程序與標準的PHP安裝程序略有不同。
完成之前的最後一個配置是更改Dockerfile以安裝Laravel所需的PHP擴展。
更新Dockerfile
這些是讓Docker環境正常運行的最終更改。 Laravel 5.8需要在伺服器上安裝許多PHP擴展。這是最終文件的樣子:
來自php:7.3-apache
運行apt-get update
運行apt-get install -y libzip-dev libjpeg62-turbo-dev libpng-dev libfreetype6-dev
#安裝擴展
運行docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd -with-gd -with-freetype -dir = / usr / include / -with-jpeg-dir = / usr / include / -with-png-dir = / usr / include /
運行docker-php-ext-install gd
運行mkdir / app
COPY .docker / vhost.conf /etc/apache2/sites-available/000-default.conf
WORKDIR / app
RUN chown -R www-data:www-data / app && a2enmod rewrite
我們安裝了一些必需的軟體包,然後安裝了PHP擴展。唯一的另一個區別是添加WORKDIR指令。現在當你啟動一個bash提示符時,你將會在/ app目錄中,而不必在執行任何PHP artisan命令之前去任何地方。
我們試一試:
docker-compose up -d -build
在這裡,我們正在重建圖像並旋轉容器。 -d標誌告訴Docker一旦它們啟動並運行就要從容器中分離出來。
現在,讓我們回到那些遷移。
docker-compose exec docker-tutorial / bin / bash
php工匠遷移
唷全部啟動並運行
結束用於PHP的Docker
在本指南中,我們已經介紹了構建Docker鏡像,運行容器以及使用docker-compose編排這些容器的過程。日誌正在通過管道輸送到STDOUT。因此,在生產中,您可以輕鬆地聚合,分析和處理日誌。
Retrace是一個很好的服務來做到這一點。它提供應用程序性能數據,使您可以找到錯誤並提高性能。對於PHP,它提供了幫助提高代碼質量的工具。 Retrace也經過優化,可支持Docker容器,提供出色的文檔。