Docker 初學者需要了解的幾個知識點 (六):docker-compose.yml (ThinkPHP)

?下面這個文?docker-compose.yml?文件定義了一個包含?PHP、Nginx、MySQL、Redis?的完整 ThinkPHP 開發環境,各配置項的含義如下:

version: '3.8'services:# PHP-FPM 服務php-fpm:image: php:8.1-fpmvolumes:- ./tp-demo:/var/www/html- ./php.ini:/usr/local/etc/php/php.ininetworks:- app-network# Nginx 服務nginx:image: nginx:alpineports:- "80:80"volumes:- ./tp-demo:/var/www/html- ./nginx.conf:/etc/nginx/conf.d/default.confdepends_on:- php-fpmnetworks:- app-network# MySQL 服務mysql:image: mysql:5.7ports:- "3306:3306"environment:- MYSQL_ROOT_PASSWORD=root- MYSQL_DATABASE=thinkphp_db- MYSQL_USER=thinkphp_user- MYSQL_PASSWORD=thinkphp_pwdvolumes:- ./mysql_data:/var/lib/mysql- ./init.sql:/docker-entrypoint-initdb.d/init.sqlnetworks:- app-network# Redis 服務(可選)redis:image: redis:alpineports:- "6379:6379"networks:- app-networknetworks:app-network:driver: bridgevolumes:mysql_data:    

1. 版本聲明

version: '3.8'
  • 指定 Docker Compose 文件的版本(3.8?是較新的穩定版本),不同版本支持的語法和特性不同,這里使用 3.8 以支持大部分現代功能。

2. 服務定義(services

這是核心部分,定義了需要啟動的所有容器服務(PHP、Nginx、MySQL 等)。

2.1 PHP-FPM 服務(php-fpm

php-fpm:image: php:8.1-fpmvolumes:- ./tp-demo:/var/www/html- ./php.ini:/usr/local/etc/php/php.ininetworks:- app-network
  • php-fpm: 服務名稱(自定義,用于內部識別,如 Nginx 可通過此名稱訪問 PHP 服務)。

  • image: php:8.1-fpm: 使用官方 PHP 8.1 版本的 FPM 鏡像(FPM 是 PHP 的 FastCGI 進程管理器,適合與 Nginx 配合)。

  • volumes: 目錄映射(主機目錄:容器內目錄):

    • ./tp-demo:/var/www/html: 將主機當前目錄下的?tp-demo?文件夾(ThinkPHP 項目代碼)映射到容器內的?/var/www/html(PHP 服務的工作目錄),實現 “主機修改代碼,容器內實時生效”。

    • ./php.ini:/usr/local/etc/php/php.ini: 將主機的?php.ini?配置文件映射到容器的 PHP 配置目錄,用于自定義 PHP 配置(如啟用擴展、設置時區等)。

  • networks: - app-network: 讓該服務加入?app-network?網絡,以便與其他服務(如 MySQL、Nginx)通信。

2.2 Nginx 服務(nginx

nginx:image: nginx:alpineports:- "80:80"volumes:- ./tp-demo:/var/www/html- ./nginx.conf:/etc/nginx/conf.d/default.confdepends_on:- php-fpmnetworks:- app-network
  • nginx: 服務名稱。
  • image: nginx:alpine: 使用輕量級的 Nginx 鏡像(alpine?版本體積更小)。
  • ports: - "80:80": 端口映射(主機端口:容器端口),將主機的 80 端口映射到容器的 80 端口,這樣可以通過?http://localhost?訪問 Nginx 服務。
  • volumes:
    • ./tp-demo:/var/www/html: 與 PHP 服務共享同一個項目目錄(確保 Nginx 能訪問到 ThinkPHP 的?public?目錄,這是 ThinkPHP 的入口目錄)。
    • ./nginx.conf:/etc/nginx/conf.d/default.conf: 將主機的?nginx.conf?配置文件映射到容器的 Nginx 默認配置,用于定義 ThinkPHP 的路由規則(如 URL 重寫)。
  • depends_on: - php-fpm: 聲明依賴關系,Nginx 會在?php-fpm?服務啟動后再啟動(避免 Nginx 先啟動卻找不到 PHP 服務的問題)。
  • networks: - app-network: 加入?app-network?網絡,可通過?php-fpm?服務名訪問 PHP 服務(如 Nginx 配置中?fastcgi_pass php-fpm:9000)。

2.3 MySQL 服務(mysql

mysql:image: mysql:5.7ports:- "3306:3306"environment:- MYSQL_ROOT_PASSWORD=root- MYSQL_DATABASE=thinkphp_db- MYSQL_USER=thinkphp_user- MYSQL_PASSWORD=thinkphp_pwdvolumes:- ./mysql_data:/var/lib/mysql- ./init.sql:/docker-entrypoint-initdb.d/init.sqlnetworks:- app-network
  • mysql: 服務名稱。
  • image: mysql:5.7: 使用 MySQL 5.7 版本鏡像(ThinkPHP 對 MySQL 5.7 兼容性較好)。
  • ports: - "3306:3306": 端口映射,主機的 3306 端口映射到容器的 3306 端口,方便用 Navicat 等工具連接容器內的 MySQL。
  • environment: 環境變量(初始化 MySQL 配置):
    • MYSQL_ROOT_PASSWORD=root: 根用戶(root)的密碼。
    • MYSQL_DATABASE=thinkphp_db: 自動創建名為?thinkphp_db?的數據庫(ThinkPHP 項目可直接使用)。
    • MYSQL_USER=thinkphp_user?和?MYSQL_PASSWORD=thinkphp_pwd: 自動創建一個普通用戶(用于 ThinkPHP 連接數據庫,避免直接使用 root 權限)。
  • volumes:
    • ./mysql_data:/var/lib/mysql: 將 MySQL 數據目錄(容器內?/var/lib/mysql)映射到主機?mysql_data?文件夾,實現數據持久化(即使刪除容器,數據庫數據也不會丟失)。
    • ./init.sql:/docker-entrypoint-initdb.d/init.sql: 將初始化 SQL 腳本(init.sql)映射到容器的初始化目錄,MySQL 啟動時會自動執行該腳本(如創建表、插入測試數據)。
  • networks: - app-network: 加入?app-network?網絡,ThinkPHP 項目(PHP 服務)可通過?mysql?服務名連接數據庫(如配置中?hostname => 'mysql')。

2.4 Redis 服務(redis,可選)

redis:image: redis:alpineports:- "6379:6379"networks:- app-network
  • redis: 服務名稱(可選,用于 ThinkPHP 的緩存、會話存儲等)。
  • image: redis:alpine: 輕量級 Redis 鏡像。
  • ports: - "6379:6379": 端口映射,主機可通過 6379 端口訪問 Redis。
  • networks: - app-network: 加入網絡,PHP 服務可通過?redis?服務名連接(如 ThinkPHP 緩存配置中?host => 'redis')。

3. 網絡定義(networks

networks:app-network:driver: bridge
  • 定義一個名為?app-network?的網絡,驅動為?bridge(Docker 默認的橋接網絡模式)。
  • 所有服務(php-fpm、nginx、mysql、redis)都加入這個網絡后,可通過?服務名?互相訪問(無需記 IP 地址),例如:
    • Nginx 訪問 PHP:php-fpm:9000
    • PHP 訪問 MySQL:mysql:3306
    • PHP 訪問 Redis:redis:6379

4. 數據卷定義(volumes

volumes:mysql_data:

  • 聲明一個名為?mysql_data?的數據卷(由 Docker 管理的持久化存儲)。
  • 雖然在?mysql?服務的?volumes?中已經映射了?./mysql_data:/var/lib/mysql,但這里顯式聲明后,Docker 會更規范地管理該目錄(避免權限問題)。

總結

這個配置通過 Docker Compose 一鍵啟動了 ThinkPHP 開發所需的所有服務:

  • Nginx 處理 HTTP 請求并轉發給 PHP-FPM
  • PHP-FPM 運行 ThinkPHP 代碼
  • MySQL 提供數據庫服務
  • Redis 提供緩存服務(可選)
  • 所有服務通過統一網絡通信,數據通過卷映射持久化到主機,確保開發時 “修改即生效” 且數據不丟失。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91358.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91358.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TiDB 詳解

TiDB 詳解:架構、特性與應用實踐 TiDB 是 PingCAP 公司開發的開源分布式 NewSQL 數據庫,采用 “計算-存儲分離” 架構設計,兼具傳統關系型數據庫的 ACID 事務特性和 NoSQL 系統的水平擴展能力。以下是 TiDB 的全面技術解析。一、核心架構設計…

推客小程序商業模型設計:合規分傭體系×盈利模式×LTV提升策略

一、推客小程序的市場背景與商業價值在當今移動互聯網紅利逐漸消退的背景下,社交電商正成為流量增長的新突破口。推客小程序作為一種基于社交關系的分銷工具,完美融合了社交傳播與電商變現的雙重優勢,為企業和個人創業者提供了全新的商業機會…

Matlab處理多個循環的判斷的方式:

1、使用正則表達式:pattern strcat(\b, strjoin(tuple, \b|\b), \b);% 4. 逐行處理文件內容 modifiedContents {}; % 存儲修改后的內容 for i 1:length(fileContents)line fileContents{i};% 使用正則表達式檢查當前行是否包含元組中的任何元素if ~isempty(reg…

從字符串中“薅出”最長子串:LeetCode 340 Swift 解法全解析

文章目錄摘要描述題解答案題解代碼分析詳細解析:示例測試及結果結果解釋:時間復雜度總結摘要 在日常開發中,我們經常需要處理字符串,比如分析用戶輸入、文本挖掘、數據清洗等等。而這道題就特別實用:如何找到一個字符…

時序數據庫廠商 TDengine 發布 AI 原生的工業數據管理平臺 IDMP,“無問智推”改變數據消費范式

在工業企業越來越依賴數據驅動決策的今天,數據的獲取不再是難題,難的是從紛繁復雜的數據中提煉出有用的信息。而 AI 的崛起,正在重塑整個數據分析的邏輯。 7 月 29 日晚,TDengine 發布了一款全新產品 —— TDengine IDMP&#xf…

HBase、MongoDB 和 Redis 的區別詳解

這三者都是流行的 NoSQL 數據庫,但設計目標、數據模型和適用場景有顯著差異。以下是它們的核心對比: 1. 數據模型對比特性HBaseMongoDBRedis數據模型寬列存儲(類似 BigTable)文檔存儲(BSON/JSON)鍵值存儲&a…

設計模式之單例模式及其在多線程下的使用

很多時候,我們在使用類創建類的實例并不想可以創建很多實例對象,比如在數據庫連接的時候,對于一個數據庫的連接通常只需要連接池中的某個連接的實例,連接一次即可,對于session會話,用戶在訪問網頁做會話保持…

Apache Ignite 2.8 引入的新指標系統(New Metrics System)的完整說明

這段文檔是關于 Apache Ignite 2.8 引入的“新指標系統(New Metrics System)” 的完整說明。這是 Ignite 監控體系的一次重大升級,相比舊的、分散的統計方式,新系統更統一、靈活、可擴展。 我們來逐層拆解、通俗易懂地理解這個新…

【氮化鎵】GaN同質外延p-i-n二極管中星形與三角形擴展表面缺陷的電子特性

2025年7月23日,美國國家標準與技術研究院(NIST)與美國海軍研究實驗室的Andrew J. Winchester等人在《Applied Physics Letters》期刊發表了題為《Electronic properties of extended surface defects in homoepitaxial GaN diodes》的文章,基于光電發射電子顯微術、導電原子…

使用 Scrapy 框架定制爬蟲中間件接入淘寶 API 采集商品數據

一、引言 在電商數據分析、市場調研等領域,獲取淘寶平臺上的商品數據是一項常見需求。淘寶提供了 API 接口,允許開發者通過授權的方式獲取商品信息。本文將介紹如何使用 Scrapy 框架定制爬蟲中間件,實現對淘寶 API 的接入,從而高…

Jmeter全局變量跨線程組的使用

一、線程組1中從數據庫中查詢到字段值二、BeanShell取樣器中設置為全局變量#為什么說props.put("Out1",Out);其實是設置Out1為Jmeter的屬性了呢? 因為在后面的調試取樣器運行結果中,會發現如果只打開顯示變量開關,是看不到Out1運行…

前端技術棧詳解

前端技術棧是指構建現代Web應用程序所需的一系列技術和工具的集合。以下是當前主流前端技術棧的詳細解析&#xff1a; 一、核心基礎技術 1. HTML5 作用&#xff1a;網頁內容的結構化標記關鍵特性&#xff1a; 語義化標簽&#xff08;<header>, <section>, <arti…

Git Pull 時遇到 Apply 和 Abort 選項?詳解它們的含義與應對策略

在使用 Git 進行團隊協作時&#xff0c;git pull 是最常用的命令之一&#xff0c;用于拉取遠程倉庫的最新代碼并合并到本地分支。但有時執行 git pull 后&#xff0c;Git 會提示 ?Apply&#xff08;應用&#xff09;?? 和 ?Abort&#xff08;中止&#xff09;?? 兩個選項…

暑期算法訓練.11

目錄 47. 力扣203 移除鏈表元素 47.1 題目解析&#xff1a; ?編輯 47.2 算法思路&#xff1a; 47.3 代碼演示&#xff1a; ?編輯 48. 力扣2.兩數相加 48.1 題目解析&#xff1a; ?編輯 48.2 算法思路; 48.3 代碼演示&#xff1a; 48.4 總結反思&#xff1a; …

nl2sql grpo強化學習訓練,加大數據量和輪數后,準確率沒提升,反而下降了,如何調整

在NL2SQL任務中使用GRPO強化學習訓練時&#xff0c;增加數據量和訓練輪數后準確率下降&#xff0c;通常是由過擬合、訓練不穩定、獎勵函數設計不合理、數據質量問題或探索-利用失衡等原因導致的。以下是具體的診斷思路和調整策略&#xff0c;幫助定位問題并優化性能&#xff1a…

PHP/Java/Python實現:如何有效防止惡意文件上傳

文章目錄 木馬病毒防范:文件上傳如何徹底防止偽造文件類型 引言 一、文件類型偽造的原理與危害 1.1 常見偽造手段 1.2 潛在危害 二、防御體系設計 2.1 防御架構 三、核心防御技術實現 3.1 服務端驗證實現 3.1.1 文件內容檢測(Python示例) 3.1.2 擴展名與內容雙重驗證(Java示…

SpringBoot系列之基于Redis的分布式限流器

SpringBoot系列之基于Redis的分布式限流器 SpringBoot 系列之基于 Redis 的分布式限流器 圖文并茂,代碼即拷即用,支持 4 種算法(固定窗口 / 滑動窗口 / 令牌桶 / 漏桶) 一、為什么要用分布式限流? 單機 Guava-RateLimiter 在集群下會 各玩各的,流量漂移,無法全局控量。…

面試遇到的問題2

Redisson的看門狗相關問題 首先要明確一點&#xff0c;看門狗機制的使用方式是&#xff1a;在加鎖的時候不加任何參數&#xff0c;也就是&#xff1a; RLock lock redisson.getLock("myLock"); try {lock.lock(); // 阻塞式加鎖// 業務邏輯... } finally {lock.unl…

Linux—進程概念與理解

目錄 1.馮諾依曼體系結構 小結&#xff1a; 2.操作系統 概念&#xff1a; 結構示意圖&#xff1a; 理解操作系統&#xff1a; 用戶使用底層硬件層次圖&#xff1a;?編輯 3.進程 概念 結構示意圖 task_ struct內容分類 典型用法示例 觀察進程: 了解 PID PPID 查…

LeetCode 面試經典 150_數組/字符串_買賣股票的最佳時機(7_121_C++_簡單)(貪心)

LeetCode 面試經典 150_數組/字符串_買賣股票的最佳時機&#xff08;7_121_C_簡單&#xff09;題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;貪心算法&#xff09;&#xff1a;代碼實現代碼實現&#xff08;思路一&…