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容器,提供出色的文檔。

資訊來源:由0x資訊編譯自STACKIFY,版權歸作者Kevin Cunningham所有,未經許可,不得轉載
你可能還喜歡