指南)
示例工程【免費下載鏈接】awesome-composeAwesome Docker Compose samples項目地址https://gitcode.com/gh_mirrors/aw/awesome-compose點擊查看免費下載本指南圍繞 awesome-compose 倉庫中 apache-php 示例展開講解如何用 Docker Compose 將一個最簡 PHP 應(yīng)用與 Apache2 Web 服務(wù)器打包、構(gòu)建、啟動、驗證并清理。讀完本文你將掌握compose.yaml中構(gòu)建上下文、端口映射、卷掛載等核心配置的實戰(zhàn)寫法理解官方 PHP-Apache 鏡像的多階段構(gòu)建機(jī)制并能獨立復(fù)現(xiàn)從docker compose up -d到curl localhost:80的完整部署閉環(huán)。示例概覽一個單服務(wù)PHP 應(yīng)用的樣板apache-php 是 awesome-compose 倉庫中典型的**單服務(wù)single service**示例其定位在倉庫根 README.md 中被明確歸類為 Single service samples。它的用途不是演示多容器協(xié)作而是展示最基礎(chǔ)也最常用的一種容器化形態(tài)把一個帶 Apache2 的 PHP 應(yīng)用通過 Compose 一條命令跑起來。該示例的完整目錄結(jié)構(gòu)如下與文檔一致. ├── compose.yaml # Compose 編排文件服務(wù)定義入口 └── app ├── Dockerfile # PHP Apache2 鏡像構(gòu)建腳本 └── index.php # 唯一的路由/頁面入口整條鏈路只有兩個角色compose.yaml負(fù)責(zé)描述服務(wù)app/目錄負(fù)責(zé)承載應(yīng)用代碼與鏡像構(gòu)建邏輯。核心配置解析compose.yaml文檔給出了示例的服務(wù)編排配置當(dāng)前倉庫中的實際文件 compose.yaml 內(nèi)容如下services: web: build: context: app target: builder ports: - 80:80 volumes: - ./app:/var/www/html/相比文檔中的簡寫build: app倉庫當(dāng)前版本使用了build.contextbuild.target的完整寫法語義上更精確。逐項拆解services.web定義一個名為web的服務(wù)這是本示例唯一的服務(wù)后續(xù)docker compose up默認(rèn)啟動它。build.context: app構(gòu)建上下文為app目錄Docker 會以該目錄為基準(zhǔn)解析Dockerfile與 COPY 的源路徑。注意 Compose 會自動在該上下文內(nèi)查找名為Dockerfile的構(gòu)建文件。build.target: builder指定多階段構(gòu)建的目標(biāo)階段為builder對應(yīng) Dockerfile 中的AS builder。這保證了默認(rèn)部署時只產(chǎn)出輕量的運行鏡像而不會把后文提到的開發(fā)工具階段dev-envs帶入運行產(chǎn)物。ports: - 80:80將容器內(nèi) Apache 的 80 端口映射到宿主機(jī)的 80 端口80:80是hostPort:containerPort的標(biāo)準(zhǔn)寫法。若宿主機(jī) 80 端口被占用可自行改為如8080:80。volumes: - ./app:/var/www/html/把宿主機(jī)app/目錄掛載為容器內(nèi) Apache 文檔根目錄/var/www/html/。Apache 的默認(rèn)站點根目錄正是/var/www/html因此容器啟動后即可直接以/var/www/html/index.php作為首頁入口。這里有一個值得強(qiáng)調(diào)的實戰(zhàn)要點卷掛載意味著應(yīng)用代碼不在鏡像內(nèi)、而在宿主機(jī)上實時可見。修改app/index.php后無需重新構(gòu)建鏡像刷新瀏覽器即可生效非常適合本地開發(fā)調(diào)試。應(yīng)用源碼與 Dockerfile 深度解析頁面入口 index.phpapp/index.php 是整個應(yīng)用的唯一業(yè)務(wù)代碼?php echo h1Hello World!/h1; ?它通過 PHP 直接輸出一個一級標(biāo)題Hello World!。由于 Apache 的mod_php處理.php請求當(dāng)瀏覽器訪問根路徑時Apache 會把請求交給 PHP 解釋器執(zhí)行該文件并把渲染后的 HTML 返回客戶端。說明文檔中curl localhost:80的示例輸出為純文本Hello World!那是示例早期版本無 HTML 標(biāo)簽的返回結(jié)果當(dāng)前倉庫 index.php 會返回帶h1標(biāo)簽的 HTML 內(nèi)容實際 curl 輸出為h1Hello World!/h1。多階段 Dockerfileapp/Dockerfile 采用多階段構(gòu)建整體結(jié)構(gòu)如下# syntaxdocker/dockerfile:1.4 FROM --platform$BUILDPLATFORM php:8.0.9-apache as builder CMD [apache2-foreground] FROM builder as dev-envs RUN EOF apt-get update apt-get install -y --no-install-recommends git EOF RUN EOF useradd -s /bin/bash -m vscode groupadd docker usermod -aG docker vscode EOF # install Docker tools (cli, buildx, compose) COPY --fromgloursdocker/docker / / CMD [apache2-foreground]幾個值得展開的關(guān)鍵點基礎(chǔ)鏡像php:8.0.9-apache這是官方 PHP 鏡像的 Apache 變體內(nèi)置 Apache2 與 PHP 模塊。文檔部署日志中出現(xiàn)的php:7.2-apache是示例早期使用的鏡像版本當(dāng)前倉庫已升級到 8.0.9。--platform$BUILDPLATFORM配合 BuildKit 的跨平臺構(gòu)建能力允許在不同架構(gòu)的宿主機(jī)上為構(gòu)建階段選取合適的平臺提升多架構(gòu)構(gòu)建效率。CMD [apache2-foreground]以前臺模式啟動 Apache保證容器主進(jìn)程持續(xù)運行且日志直接輸出到 stdout這是容器內(nèi)運行 Web 服務(wù)的標(biāo)準(zhǔn)姿勢容器內(nèi)不能用service apache2 start這類后臺啟動方式。dev-envs階段在builder基礎(chǔ)上追加 git、vscode用戶、docker 用戶組以及 Docker CLI 工具鏈專供開發(fā)容器如 Dev Containers使用。由于 compose.yaml 的target: builder指向了builder階段默認(rèn)部署不會攜帶這些開發(fā)依賴鏡像更精簡。Dockerfile 語法# syntaxdocker/dockerfile:1.4啟用 Dockerfile 1.4 語法從而支持RUN EOF這種 heredoc 寫法與COPY --from跨階段拷貝等 BuildKit 特性。一鍵部署docker compose up -d進(jìn)入示例根目錄執(zhí)行部署命令$ docker compose up -d-ddetached讓容器在后臺運行。文檔中展示的典型構(gòu)建與啟動日志如下Creating network php-docker_web with the default driver Building web Step 1/6 : FROM php:7.2-apache ... ... Creating php-docker_web_1 ... done日志中的兩處細(xì)節(jié)值得注意網(wǎng)絡(luò)名與容器名Compose 默認(rèn)以所在目錄名作為 project 名并以此派生網(wǎng)絡(luò)、卷與容器名。php-docker_web、php-docker_web_1表明該示例早期位于名為php-docker的目錄中當(dāng)前目錄名為apache-php因此實際生成的名字會是apache-php_web、apache-php-web-1。若想顯式控制 project 名可用docker compose -p name up -d指定。首次構(gòu)建耗時首次執(zhí)行需要拉取php:8.0.9-apache基礎(chǔ)鏡像并完成構(gòu)建日志中的Step 1/6即對應(yīng) Dockerfile 的逐步執(zhí)行再次啟動時鏡像已緩存速度會快得多。驗證運行結(jié)果部署完成后先檢查容器與端口映射是否符合預(yù)期$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2bc8271fee81 apache-php_web docker-php-entrypoi… About a minute ago Up About a minute 0.0.0.0:80-80/tcp apache-php-web-1關(guān)鍵信息解讀STATUS: Up容器正常運行說明apache2-foreground前臺進(jìn)程沒有退出PORTS: 0.0.0.0:80-80/tcp宿主機(jī) 80 端口已成功映射到容器 80 端口NAMES容器名遵循{project}-{service}-{序號}規(guī)則。隨后在瀏覽器訪問http://localhost:80或直接用 curl 驗證$ curl localhost:80 h1Hello World!/h1返回的h1Hello World!/h1正是 index.php 中echo的輸出證明瀏覽器 → Apache2 → mod_php → index.php整條請求鏈路已打通。若使用-i參數(shù)還能看到HTTP/1.1 200 OK狀態(tài)碼與Content-Type: text/html響應(yīng)頭。停止與清理開發(fā)或測試結(jié)束后用以下命令停止并移除容器$ docker compose down該命令會按 Compose 項目維度清理停止并刪除web容器、移除由up創(chuàng)建的默認(rèn)網(wǎng)絡(luò)。若還需一并刪除掛載卷或構(gòu)建緩存可擴(kuò)展使用$ docker compose down -v # 同時刪除該項目的匿名卷 $ docker build --no-cache # 需要強(qiáng)制重建鏡像時跳過緩存注意本示例通過卷將宿主機(jī)./app映射進(jìn)容器應(yīng)用數(shù)據(jù)存于宿主機(jī)因此down不會丟失代碼。關(guān)鍵機(jī)制與注意事項小結(jié)文檔與倉庫的版本差異屬正常演進(jìn)README 中php:7.2-apache、簡寫build: app與純文本Hello World!均來自示例早期版本當(dāng)前倉庫的 compose.yaml、Dockerfile、index.php 已升級為 PHP 8.0.9 多階段構(gòu)建形態(tài)實操時以倉庫現(xiàn)行為準(zhǔn)。卷掛載是開發(fā)利器也是生產(chǎn)隱患./app:/var/www/html/讓代碼改動即時生效省去重建鏡像但生產(chǎn)環(huán)境通常應(yīng)把代碼 COPY 進(jìn)鏡像、去掉卷映射以獲得可復(fù)現(xiàn)的交付物。鏡像必須前臺運行容器存活的前提是主進(jìn)程不退出CMD [apache2-foreground]正是為容器化定制的啟動方式勿改成 Apache 默認(rèn)的后臺守護(hù)模式。適用范圍與倉庫根 README.md 的聲明一致本示例面向本地開發(fā)環(huán)境項目初始化、技術(shù)棧驗證等不應(yīng)直接用于生產(chǎn)部署。至此從配置解讀、鏡像構(gòu)建、一鍵部署到結(jié)果驗證與清理回收你已經(jīng)完整掌握了 apache-php 示例的全部實戰(zhàn)鏈路這套compose.yamlapp/的組織模式同樣適用于遷移到你自己的 PHP 項目。贊分享示例工程【免費下載鏈接】awesome-composeAwesome Docker Compose samples項目地址https://gitcode.com/gh_mirrors/aw/awesome-compose點擊查看免費下載相關(guān)推薦Firefox Send 容器化部署指南基于 Docker 與 docker-compose 的完整實戰(zhàn)Firefox Send 容器化部署指南基于 Docker 與 docker compose 的完整實戰(zhàn) 本篇技術(shù)指南以 Firefox Send 官方文檔后端前端Spark Java 應(yīng)用容器化部署實戰(zhàn)基于 Awesome Compose 的 Docker Compose 單服務(wù)示例Spark Java 應(yīng)用容器化部署實戰(zhàn)基于 Awesome Compose 的 Docker Compose 單服務(wù)示例 本篇技術(shù)指南以倉庫中的 spark示例工程使用 PHP mysqli 擴(kuò)展連接 Apache Doris完整示例與實戰(zhàn)指南使用 PHP mysqli 擴(kuò)展連接 Apache Doris完整示例與實戰(zhàn)指南 導(dǎo)讀 Apache Doris 對外提供 MySQL 協(xié)議兼容的訪問接口默OLAP數(shù)據(jù)庫大數(shù)據(jù)實時分析上一篇深度修復(fù)戴森V6/V7電池開源固件終極實戰(zhàn)指南下一篇如何在Android手機(jī)上快速部署Alpine LinuxTermuxAlpine完整指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考