当前位置: 首页 > news >正文

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.lryc.cn/news/605534.html

相关文章:

  • 向量检索服务的功能特性
  • 企业智脑1.3.1技术升级全面解读:AI笔记引擎如何重塑企业知识管理范式
  • 【科研绘图系列】R语言绘制线性相关性
  • 前端技术栈详解
  • window中qemu使用(安装ubuntu系统)
  • uniapp x swiper/image组件mode=“aspectFit“ 图片有的闪现后黑屏
  • 【机器学习】KNN算法与模型评估调优
  • 8.1-使用向量存储值列表
  • 从“健忘”到“懂我”:构建新一代AI记忆系统
  • 基于MATLAB实现二维云模型
  • Android开发:6种获取屏幕高度和宽度的最佳实践与性能对比
  • 基于MATLAB的GUI来对不同的(彩色或灰色)图像进行图像增强
  • 2025年最新SCI-灰熊增脂优化器(Grizzly Bear Fat Increase, GBF)-附完整Matlab免费代码
  • 007TG洞察:波场TRON上市观察,Web3流量工具的技术解析与应用
  • mysql 日志机制
  • C++_HELLO算法_哈希表的简单实现
  • 反射之专题
  • 将本地项目关联并推送到已有的 GitHub 仓库
  • 第13届蓝桥杯C++青少组中/高级组选拔赛2022年1月22日真题
  • 可计算存储(Computational Storage)与DPU(Data Processing Unit)的技术特点对比及实际应用场景分析
  • #C语言——学习攻略:深挖指针路线(五)--回调函数,qsort函数,qsort函数的模拟实现
  • axios封装对比
  • 《C#与.NET Core跨平台开发的融合架构与实践逻辑》
  • 编程语言Java——核心技术篇(六)解剖反射:性能的代价还是灵活性的福音?
  • 【[CSP-J 2022] 上升点列】
  • RabbitMQ 的死信队列完整指南 (With Spring Boot)
  • 从遮挡难题到精准测量:激光频率梳技术如何实现深孔 3D 轮廓的 2um 级重复精度?
  • Mac上优雅简单地使用Git:从入门到高效工作流
  • 05百融云策略引擎项目交付-laravel实战完整交付定义常量分文件配置-独立建立lib类处理-成功导出pdf-优雅草卓伊凡
  • LCM中间件入门(1):工作原理核心概念及Ubuntu环境下的C++实践