353 lines
76 KiB
JavaScript
353 lines
76 KiB
JavaScript
import{_ as i,o as a,c as n,a2 as p}from"./chunks/framework.B-QBKwc1.js";const g=JSON.parse('{"title":"Docker 快速体验","description":"Docker 方案适合快速体验项目功能,无需手动安装 PHP、MySQL 等环境。","frontmatter":{},"headers":[],"relativePath":"zh/quickstart/docker.md","filePath":"zh/quickstart/docker.md"}'),l={name:"zh/quickstart/docker.md"};function h(k,s,t,e,d,r){return a(),n("div",null,[...s[0]||(s[0]=[p(`<h1 id="_2-7-Docker-快速体验" tabindex="-1">2.7 Docker 快速体验 <a class="header-anchor" href="#_2-7-Docker-快速体验" aria-label="Permalink to "2.7 Docker 快速体验""></a></h1><div class="tip custom-block"><p class="custom-block-title">概述</p><p>Docker 方案适合快速体验项目功能,无需手动安装 PHP、MySQL 等环境。本文提供完整的 Nginx + PHP-FPM 架构配置,复制即可使用。生产环境部署请参考<a href="/zh/deploy/checklist.html">第 11 章</a>。</p></div><h2 id="架构说明" tabindex="-1">架构说明 <a class="header-anchor" href="#架构说明" aria-label="Permalink to "架构说明""></a></h2><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>浏览器 → localhost:8000 → [Nginx 容器:80] → [PHP-FPM 容器:9000] → ThinkPHP</span></span>
|
||
<span class="line"><span> ↕</span></span>
|
||
<span class="line"><span> [MySQL 容器:3306] + [Redis 容器:6379]</span></span></code></pre></div><h2 id="文件结构" tabindex="-1">文件结构 <a class="header-anchor" href="#文件结构" aria-label="Permalink to "文件结构""></a></h2><div class="language- vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span>├── docker-compose.yml # 容器编排(项目根目录)</span></span>
|
||
<span class="line"><span>├── docker/</span></span>
|
||
<span class="line"><span>│ ├── Dockerfile # PHP-FPM 镜像定义</span></span>
|
||
<span class="line"><span>│ ├── nginx.conf # Nginx 站点配置</span></span>
|
||
<span class="line"><span>│ └── .env.docker # 环境变量(密码等)</span></span>
|
||
<span class="line"><span>├── .env # 应用配置</span></span>
|
||
<span class="line"><span>└── ...</span></span></code></pre></div><h2 id="快速启动" tabindex="-1">快速启动 <a class="header-anchor" href="#快速启动" aria-label="Permalink to "快速启动""></a></h2><p>项目已内置完整的 Docker 配置文件(<code>docker-compose.yml</code>、<code>docker/Dockerfile</code>、<code>docker/nginx.conf</code>),无需手动创建,直接启动即可:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 从官方网站 (https://www.rxthink.cn) 下载授权源码包并解压</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">cd</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> RXThinkCMF_ThinkPhp8_EleVue</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 配置应用环境变量</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">cp</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> .env.example</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> .env</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 编辑 .env,修改数据库连接地址为 Docker 服务名(见下方说明)</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 启动所有服务(首次会自动构建镜像,约 2-5 分钟)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> up</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看运行状态</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ps</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看日志(确认无报错)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -f</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span></span></code></pre></div><div class="tip custom-block"><p class="custom-block-title">说明</p><p><code>docker-compose.yml</code> 使用 <code>\${VAR:-默认值}</code> 语法,未配置 <code>.env.docker</code> 时自动使用默认密码(Your_Strong_Password_2024 / Your_Redis_Password_2024),适合快速体验。生产部署请参考<a href="/zh/deploy/docker.html">第 11 章</a>使用 <code>--env-file</code> 指定生产密码。</p></div><h2 id="docker-compose-yml" tabindex="-1">docker-compose.yml <a class="header-anchor" href="#docker-compose-yml" aria-label="Permalink to "docker-compose.yml""></a></h2><p>项目根目录的 <code>docker-compose.yml</code> 内容如下(供参考,无需手动创建):</p><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Docker Compose — RXThinkCMF 容器编排</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 架构:Nginx(80) → PHP-FPM(9000) → MySQL(3306) + Redis(6379)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">#</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 快速启动(使用默认密码):</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># docker-compose up -d</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">#</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 生产部署(使用 .env.docker 中的密码):</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># docker-compose --env-file docker/.env.docker up -d --build</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">version</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> '</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">3.8</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">services</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Nginx 反向代理</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 接收浏览器请求,静态资源直接返回,.php 请求转发给 PHP-FPM 容器</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> nginx</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> image</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> nginx:1.25-alpine</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> container_name</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-nginx</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ports</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\${NGINX_PORT:-8000}:80</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 宿主机端口(默认 8000),可通过环境变量覆盖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ./docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 站点配置(只读)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ./:/var/www/html:ro</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 项目代码(只读)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> depends_on</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-net</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> restart</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> unless-stopped</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # PHP-FPM 应用服务</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 执行 ThinkPHP 代码,处理 API 请求和业务逻辑</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> app</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> build</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> context</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> .</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 构建上下文为项目根目录</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> dockerfile</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> docker/Dockerfile</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Dockerfile 路径</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> container_name</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-app</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ./:/var/www/html</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 项目代码(可写)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> uploads_data:/opt/data/uploads</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 上传文件持久化</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> environment</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> APP_DEBUG=\${APP_DEBUG:-true}</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 调试模式(快速体验默认开启)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> depends_on</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> mysql</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> condition</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> service_healthy</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 等待 MySQL 就绪</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> redis</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> condition</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> service_started</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 等待 Redis 启动</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-net</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> restart</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> unless-stopped</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # MySQL 数据库</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 存储业务数据,首次启动自动导入 init.sql</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> mysql</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> image</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql:8.0</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> container_name</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-mysql</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ports</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\${MYSQL_PORT:-3306}:3306</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 宿主机端口(默认 3306),可通过环境变量覆盖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> environment</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> MYSQL_ROOT_PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> \${MYSQL_ROOT_PASSWORD:-Your_Strong_Password_2024}</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # root 密码</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> MYSQL_DATABASE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> \${MYSQL_DATABASE:-rxthinkcmf.thinkphp8.elevue}</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 自动创建的数据库</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> MYSQL_CHARSET</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> utf8mb4</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> MYSQL_COLLATION</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> utf8mb4_general_ci</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql_data:/var/lib/mysql</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 数据持久化</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> ./document/mysql/rxthinkcmf.thinkphp8.elevue.sql:/docker-entrypoint-initdb.d/init.sql:ro</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 初始化 SQL</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> command</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> --character-set-server=utf8mb4</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> --collation-server=utf8mb4_general_ci</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> --default-authentication-plugin=mysql_native_password</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> healthcheck</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 健康检查:确保 MySQL 可接受连接</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> test</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;"> [</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">CMD</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">mysqladmin</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">ping</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">-h</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">localhost</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">-u</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">root</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">-p\${MYSQL_ROOT_PASSWORD:-Your_Strong_Password_2024}</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> interval</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 10s</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> timeout</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 5s</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> retries</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 5</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> start_period</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> 30s</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # MySQL 启动较慢,给 30 秒缓冲</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-net</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> restart</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> unless-stopped</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Redis 缓存</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 提供缓存加速,与 config/cache.php 中的 redis 驱动配合</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ===========================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> redis</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> image</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> redis:7-alpine</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> container_name</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-redis</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> ports</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\${REDIS_PORT:-6379}:6379</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 宿主机端口(默认 6379),可通过环境变量覆盖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> command</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> redis-server --requirepass \${REDIS_PASSWORD:-Your_Redis_Password_2024}</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 访问密码</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> redis_data:/data</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 数据持久化</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> -</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf-net</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> restart</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> unless-stopped</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 命名卷 — 持久化存储</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 容器删除后数据保留,彻底重置请执行:docker-compose down -v</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">volumes</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> mysql_data</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # MySQL 数据文件</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> redis_data</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Redis RDB 快照</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> uploads_data</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 用户上传文件</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 内部网络</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 容器间通过服务名(mysql / redis / app)互相访问</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;">networks</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> rxthinkcmf-net</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#97E1F1;--shiki-light:#998418;"> driver</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">:</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> bridge</span></span></code></pre></div><h2 id="Dockerfile" tabindex="-1">Dockerfile <a class="header-anchor" href="#Dockerfile" aria-label="Permalink to "Dockerfile""></a></h2><p>将以下内容保存为 <code>docker/Dockerfile</code>:</p><div class="language-dockerfile vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">dockerfile</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Dockerfile — PHP-FPM 应用镜像</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 基础镜像:PHP 8.2 + FPM</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 构建命令:docker-compose build app</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">FROM</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> php:8.2-fpm</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 1. 安装系统依赖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> apt-get update && apt-get install -y --no-install-recommends \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> libpng-dev </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # GD 扩展 — PNG 支持</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> libjpeg-dev </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # GD 扩展 — JPEG 支持</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> libfreetype6-dev </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # GD 扩展 — 字体渲染(验证码)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> libzip-dev </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # zip 扩展依赖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> zip </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> # Composer 解压依赖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> unzip \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && rm -rf /var/lib/apt/lists/*</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 2. 安装 PHP 扩展</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># pdo_mysql=MySQL驱动 mbstring=多字节 gd=图片 bcmath=高精度 zip=压缩 redis=缓存</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> docker-php-ext-configure gd --with-freetype --with-jpeg \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && docker-php-ext-install -j$(nproc) pdo_mysql mbstring gd bcmath zip \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && pecl install redis \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && docker-php-ext-enable redis</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 3. 安装 Composer</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">COPY</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> --from=composer:latest /usr/bin/composer /usr/bin/composer</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 4. PHP 生产配置</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> mv </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">"$PHP_INI_DIR/php.ini-production"</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> "$PHP_INI_DIR/php.ini"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && echo </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">'\\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">date.timezone = Asia/Shanghai</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">memory_limit = 256M</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">upload_max_filesize = 50M</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">post_max_size = 50M</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">max_execution_time = 60</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">opcache.enable = 1</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">opcache.memory_consumption = 256</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;">\\n</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">'</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> >> </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">"$PHP_INI_DIR/php.ini"</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 5. 安装项目依赖</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">WORKDIR</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> /var/www/html</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">COPY</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> composer.json composer.lock ./</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> composer install --no-dev --optimize-autoloader --no-interaction</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">COPY</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> . .</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 6. 目录权限</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># -----------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">RUN</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> mkdir -p runtime uploads \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && chown -R www-data:www-data runtime uploads \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> && chmod -R 775 runtime uploads</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">EXPOSE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> 9000</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">CMD</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> [</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">"php-fpm"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">]</span></span></code></pre></div><h2 id="Nginx-配置" tabindex="-1">Nginx 配置 <a class="header-anchor" href="#Nginx-配置" aria-label="Permalink to "Nginx 配置""></a></h2><p>将以下内容保存为 <code>docker/nginx.conf</code>:</p><div class="language-nginx vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">nginx</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Nginx 配置 — ThinkPHP 8 反向代理</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># =============================================================================</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">server</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> {</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> listen </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">80</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> server_name </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">localhost</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # ThinkPHP 入口目录</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> root </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">/var/www/html/public</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> index </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">index.php</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # URL 重写(ThinkPHP 路由必需)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;"> / </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> if</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> (</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;">!-e </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">request_filename</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">) {</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> rewrite</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> ^(.*)$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> /index.php?s=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">1</span><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> last</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # PHP-FPM 转发("app" 是 docker-compose 中的服务名)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ~</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> \\.php$ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_pass </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> app:9000</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_index </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> index.php</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_param </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> SCRIPT_FILENAME </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">document_root</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">$</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#B07D48;">fastcgi_script_name</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> include </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> fastcgi_params</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_read_timeout </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 300</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> fastcgi_send_timeout </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;"> 300</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 安全:禁止访问隐藏文件</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ~</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> /\\. </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> deny </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#1E754F;">all</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 安全:禁止上传目录执行 PHP</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ~</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> /uploads/.*\\.php$ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> deny </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#1E754F;">all</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # 静态资源缓存 30 天</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> location</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> ~*</span><span style="--shiki-dark:#E7EE98;--shiki-light:#AB5E3F;"> \\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">{</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> expires </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">30d</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> add_header </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">Cache-Control </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">"public, immutable"</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> }</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"> # Gzip 压缩</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> gzip </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#1E754F;"> on</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> gzip_types </span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> text/plain text/css application/json application/javascript text/xml</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> gzip_min_length </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">1024</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;"> gzip_comp_level </span><span style="--shiki-dark:#BF9EEE;--shiki-light:#2F798A;">5</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">;</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">}</span></span></code></pre></div><h2 id="环境变量配置" tabindex="-1">环境变量配置 <a class="header-anchor" href="#环境变量配置" aria-label="Permalink to "环境变量配置""></a></h2><p>将以下内容保存为 <code>docker/.env.docker</code>:</p><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Docker 环境变量(密码等敏感信息,切勿提交 Git)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MYSQL_ROOT_PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">Your_Strong_Password_2024</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">MYSQL_DATABASE</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">rxthinkcmf.thinkphp8.elevue</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">Your_Redis_Password_2024</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">APP_DEBUG</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;">=</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;">false</span></span></code></pre></div><p>修改项目根目录 <code>.env</code> 文件中的数据库和缓存连接:</p><div class="language-ini vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ini</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">DATABASE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 连接地址(Docker 内部使用服务名 "mysql")</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">HOSTNAME</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> mysql</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> Your_Strong_Password_2024</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">CACHE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 连接地址(Docker 内部使用服务名 "redis")</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_HOST</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> redis</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">REDIS_PASSWORD</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> Your_Redis_Password_2024</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">[</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#59873A;">FILE</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">]</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;">; 上传目录(容器内路径)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#F286C4;--shiki-light:#1E754F;">UPLOAD_DIR</span><span style="--shiki-dark:#F286C4;--shiki-light:#999999;"> =</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> /opt/data/uploads</span></span></code></pre></div><h2 id="访问服务" tabindex="-1">访问服务 <a class="header-anchor" href="#访问服务" aria-label="Permalink to "访问服务""></a></h2><p>启动成功后:</p><table tabindex="0"><thead><tr><th>服务</th><th>地址</th><th>说明</th></tr></thead><tbody><tr><td>后端 API</td><td><a href="http://localhost:8000" target="_blank" rel="noreferrer">http://localhost:8000</a></td><td>Nginx → PHP-FPM → ThinkPHP</td></tr><tr><td>MySQL</td><td>localhost:3306</td><td>用户名 root,密码 Your_Strong_Password_2024</td></tr><tr><td>Redis</td><td>localhost:6379</td><td>密码 Your_Redis_Password_2024</td></tr></tbody></table><p>验证后端是否正常:</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 访问首页</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">curl</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> http://localhost:8000/</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 登录获取 Token</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">curl</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -X</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> POST</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> http://localhost:8000/api/login</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -H</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> "</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">Content-Type: application/json</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">"</span><span style="--shiki-dark:#F286C4;--shiki-light:#A65E2B;"> \\</span></span>
|
||
<span class="line"><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> '</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">{"username":"admin","password":"123456","captcha":"618618"}</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">'</span></span></code></pre></div><h2 id="常用命令" tabindex="-1">常用命令 <a class="header-anchor" href="#常用命令" aria-label="Permalink to "常用命令""></a></h2><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 服务管理</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 启动服务</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> up</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 停止服务(保留数据)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> down</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 停止并清空所有数据(重新开始)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> down</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -v</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 重建镜像(Dockerfile 或 composer.json 变更后)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> up</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --build</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 日志排查</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看所有日志</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -f</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看应用日志</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -f</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 进入容器</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 进入 PHP-FPM 容器</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> bash</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 进入 MySQL 容器</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> bash</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 数据库操作</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 导入 SQL(手动方式)</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -T</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -uroot</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -pYour_Strong_Password_2024</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf.thinkphp8.elevue</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> <</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> document/mysql/rxthinkcmf.thinkphp8.elevue.sql</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 进入 MySQL 命令行</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> mysql</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -uroot</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -pYour_Strong_Password_2024</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> rxthinkcmf.thinkphp8.elevue</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># ThinkPHP 命令</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># --------------------------------------------------------------------------</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 清除缓存</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> clear</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看路由</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> exec</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> php</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> think</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> route:list</span></span></code></pre></div><h2 id="常见问题" tabindex="-1">常见问题 <a class="header-anchor" href="#常见问题" aria-label="Permalink to "常见问题""></a></h2><h3 id="端口被占用" tabindex="-1">端口被占用 <a class="header-anchor" href="#端口被占用" aria-label="Permalink to "端口被占用""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Windows 查看占用端口的进程</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">netstat</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -ano</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> |</span><span style="--shiki-dark:#62E884;--shiki-light:#59873A;"> findstr</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> :8000</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># Linux/Mac</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">lsof</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -i</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> :8000</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 解决方案:修改 docker-compose.yml 中的端口映射</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># ports:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># - "8080:80" # 改为 8080</span></span></code></pre></div><h3 id="数据库连接失败" tabindex="-1">数据库连接失败 <a class="header-anchor" href="#数据库连接失败" aria-label="Permalink to "数据库连接失败""></a></h3><p>确认 <code>.env</code> 中 <code>[DATABASE]</code> 下 <code>HOSTNAME = mysql</code>(Docker 服务名),不是 <code>127.0.0.1</code>。</p><h3 id="容器启动后立即退出" tabindex="-1">容器启动后立即退出 <a class="header-anchor" href="#容器启动后立即退出" aria-label="Permalink to "容器启动后立即退出""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 查看退出原因</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> logs</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> app</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 常见原因:</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 1. PHP 扩展缺失 → 检查 Dockerfile 中的 docker-php-ext-install</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 2. 目录权限问题 → 确认 runtime 和 uploads 目录可写</span></span>
|
||
<span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 3. composer install 失败 → 检查网络或镜像源</span></span></code></pre></div><h3 id="重新开始" tabindex="-1">重新开始 <a class="header-anchor" href="#重新开始" aria-label="Permalink to "重新开始""></a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes dracula-soft vitesse-light vp-code" tabindex="0"><code><span class="line"><span style="--shiki-dark:#7B7F8B;--shiki-light:#A0ADA0;"># 删除所有容器、网络、数据卷,完全重来</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> down</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -v</span></span>
|
||
<span class="line"><span style="--shiki-dark:#62E884;--shiki-light:#59873A;">docker-compose</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> up</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> -d</span><span style="--shiki-dark:#BF9EEE;--shiki-light:#A65E2B;"> --build</span></span></code></pre></div><h2 id="相关文档" tabindex="-1">相关文档 <a class="header-anchor" href="#相关文档" aria-label="Permalink to "相关文档""></a></h2><ul><li><a href="/zh/deploy/docker.html">生产部署</a> — 生产环境完整方案</li><li><a href="/zh/quickstart/backend-start.html">后端启动</a> — 不用 Docker,手动启动</li><li><a href="/zh/quickstart/database-init.html">数据库初始化</a> — 手动导入 SQL</li></ul>`,42)])])}const F=i(l,[["render",h]]);export{g as __pageData,F as default};
|