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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;思路一&…