Files
rxthinkcmf-wiki/RXThinkCMF_ThinkPhp6_EleVue/.vitepress/dist/assets/zh_quickstart_docker.md.w0mTl3oj.js
T
2026-10-25 18:52:36 +08:00

353 lines
76 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 &quot;2.7 Docker 快速体验&quot;">​</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 &quot;架构说明&quot;">​</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 &quot;文件结构&quot;">​</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 &quot;快速启动&quot;">​</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_ThinkPhp6_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 &quot;docker-compose.yml&quot;">​</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;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">3.8</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\${NGINX_PORT:-8000}:80</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\${MYSQL_PORT:-3306}:3306</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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.thinkphp6.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.thinkphp6.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;">&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">CMD</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">mysqladmin</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">ping</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">-h</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">localhost</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">-u</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">root</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#999999;">,</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;"> &quot;</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;">&quot;</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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">\${REDIS_PORT:-6379}:6379</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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 &quot;Dockerfile&quot;">​</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 &amp;&amp; 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;"> &amp;&amp; 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;"> &amp;&amp; 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;"> &amp;&amp; pecl install redis \\</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &amp;&amp; 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;">&quot;$PHP_INI_DIR/php.ini-production&quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> &quot;$PHP_INI_DIR/php.ini&quot;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> \\</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &amp;&amp; echo </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">&#39;\\</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;">&#39;</span><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &gt;&gt; </span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">&quot;$PHP_INI_DIR/php.ini&quot;</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;"> &amp;&amp; chown -R www-data:www-data runtime uploads \\</span></span>
<span class="line"><span style="--shiki-dark:#F6F6F4;--shiki-light:#393A34;"> &amp;&amp; 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;">&quot;php-fpm&quot;</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 &quot;Nginx 配置&quot;">​</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 6 反向代理</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 转发(&quot;app&quot; 是 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;">&quot;public, immutable&quot;</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 &quot;环境变量配置&quot;">​</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.thinkphp6.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 内部使用服务名 &quot;mysql&quot;)</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 内部使用服务名 &quot;redis&quot;)</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 &quot;访问服务&quot;">​</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;"> &quot;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">Content-Type: application/json</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&quot;</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;"> &#39;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;">{&quot;username&quot;:&quot;admin&quot;,&quot;password&quot;:&quot;123456&quot;,&quot;captcha&quot;:&quot;618618&quot;}</span><span style="--shiki-dark:#DEE492;--shiki-light:#B5695977;">&#39;</span></span></code></pre></div><h2 id="常用命令" tabindex="-1">常用命令 <a class="header-anchor" href="#常用命令" aria-label="Permalink to &quot;常用命令&quot;">​</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.thinkphp6.elevue</span><span style="--shiki-dark:#F286C4;--shiki-light:#AB5959;"> &lt;</span><span style="--shiki-dark:#E7EE98;--shiki-light:#B56959;"> document/mysql/rxthinkcmf.thinkphp6.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.thinkphp6.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 &quot;常见问题&quot;">​</a></h2><h3 id="端口被占用" tabindex="-1">端口被占用 <a class="header-anchor" href="#端口被占用" aria-label="Permalink to &quot;端口被占用&quot;">​</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;"># - &quot;8080:80&quot; # 改为 8080</span></span></code></pre></div><h3 id="数据库连接失败" tabindex="-1">数据库连接失败 <a class="header-anchor" href="#数据库连接失败" aria-label="Permalink to &quot;数据库连接失败&quot;">​</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 &quot;容器启动后立即退出&quot;">​</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 &quot;重新开始&quot;">​</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 &quot;相关文档&quot;">​</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};