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