1. 实战概述
- 本实战基于 Docker Compose 搭建 LNMP 开发环境,通过自定义 PHP-FPM 镜像安装 MySQL 扩展,配置 Nginx 反向代理 PHP 请求,导入商品数据并创建
showProducts.php页面,成功实现商品信息的表格化展示,完整验证了 Web 服务、动态脚本与数据库的协同工作。
2. 实战步骤
2.1 创建项目目录
- 执行命令:
mkdir lnmp

- 执行命令:
cd lnmp

- 执行命令:
mkdir wwwroot php-fpm

2.2 准备nginx配置文件
2.2.1 创建nginx容器
- 执行命令:
docker run -dit --name hwnginx nginx

2.2.2 拷贝nginx配置文件到当前目录
- 执行命令:
docker cp hwnginx:/etc/nginx ./

2.2.3 停止并删除nginx容器
-
执行命令:
docker stop hwnginx

-
执行命令:
docker rm hwnginx

2.2.4 修改nginx配置文件
-
执行命令:
notepad nginx/conf.d/default.conf

server { listen 80; listen [::]:80; server_name localhost; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root /var/www; fastcgi_pass fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
2.3 准备测试网页文件
-
执行命令:
notepad wwwroot\index.html

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body style='text-align: center; background-color: antiquewhite'> <h1 style='color: red'>欢迎访问Nginx页面~</h1> </body> </html> -
执行命令:
notepad wwwroot\index.php

<?php // 设置时区 date_default_timezone_set('Asia/Shanghai'); // 获取当前日期时间并格式化 $now = date('Y-m-d H:i:s'); ?> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>当前时间</title> </head> <body style='text-align: center; background-color: antiquewhite'> <h1 style='color: red'>系统当前日期时间</h1> <p style='color: blue'><?php echo htmlspecialchars($now); ?></p> </body> </html> -
执行命令:
notepad wwwroot\db.php

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>数据库连接测试</title> <style> body { text-align: center; padding-top: 50px; font-family: Arial, sans-serif; background-color: antiquewhite } </style> </head> <body> <?php $link = mysqli_connect('mysql', 'root', '903213'); if (!$link) { echo '<h2 style="color:red;">❌ 数据库连接失败!</h2>'; exit; } echo '<h2 style="color:green;">✅ 数据库连接成功!</h2>'; mysqli_close($link); ?> </body> </html>
2.4 准备php的Dockerfile文件
- Docker官方php镜像没有安装mysql插件,无法连接mysql数据库,需要利用Dockerfile重新生成新镜像。从php:7.4-fpm开始构建,安装
mysqli和pdo_mysql扩展。 - 执行命令:
notepad php-fpm\Dockerfile

2.5 编写Docker编排配置文件
-
执行命令:
notepad docker-compose.yml

services: fpm: build: ./php-fpm container_name: fpm volumes: - ./wwwroot:/var/www ports: - "9000" nginx: image: nginx container_name: nginx ports: - "8100:80" volumes: - ./wwwroot:/usr/share/nginx/html - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/conf.d:/etc/nginx/conf.d depends_on: - fpm mysql: image: mysql:5.7 container_name: mysql ports: - "3309:3306" environment: MYSQL_ROOT_PASSWORD: 903213 MYSQL_DATABASE: lnmp volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:
2.6 构建LNMP项目
- 执行命令:
docker-compose up -d

- 结果说明:执行
docker-compose up -d成功启动 LNMP 环境,创建了默认网络和 MySQL 数据卷,依次启动 fpm、mysql 和 nginx 容器,服务运行正常,可访问 http://localhost:8100 进行测试。
2.7 测试LNMP项目
2.7.1 创建数据库连接
- 创建
LNMPMySQL数据库连接


2.7.2 运行数据库脚本
- 运行数据库脚本
lnmp.sql

- 单击【开始】按钮

2.7.3 查看数据表
- 查看商品表

2.7.4 准备图片文件
- 在
D:\docker_work\lnmp\wwwroot\images里准备15张商品图片

2.7.5 创建显示商品页面
-
在
D:\docker_work\lnmp\wwwroot里创建showProducts.php文件

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>商品列表</title> <style> body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f9f9f9; margin: 20px; color: #333; } h1 { text-align: center; color: #0066cc; margin-bottom: 30px; } table { width: 100%; border-collapse: collapse; box-shadow: 0 2px 10px rgba(0,0,0,0.1); background: white; overflow: hidden; border-radius: 8px; } th, td { padding: 12px 15px; text-align: left; border-bottom: 1px solid #ddd; } th { background-color: #0066cc; color: white; font-weight: bold; } tr:hover { background-color: #f1f1f1; } img { width: 80px; height: 80px; object-fit: cover; border-radius: 4px; vertical-align: middle; } .no-image { width: 80px; height: 80px; background-color: #eee; display: flex; align-items: center; justify-content: center; color: #999; font-size: 12px; } .price { color: #e63946; font-weight: bold; } </style> </head> <body> <h1>商品列表</h1> <?php // 数据库连接配置 $host = 'mysql'; $user = 'root'; $pass = '903213'; $dbname = 'lnmp'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 查询所有商品 $stmt = $pdo->query("SELECT id, name, price, image, add_time FROM t_product"); $products = $stmt->fetchAll(PDO::FETCH_ASSOC); if (empty($products)) { echo "<p style='text-align:center; color:#999;'>暂无商品数据。</p>"; } else { echo "<table>"; echo "<thead>"; echo "<tr>"; echo "<th>ID</th>"; echo "<th>商品名称</th>"; echo "<th>价格</th>"; echo "<th>图片</th>"; echo "<th>添加时间</th>"; echo "</tr>"; echo "</thead>"; echo "<tbody>"; foreach ($products as $product) { echo "<tr>"; echo "<td>{$product['id']}</td>"; echo "<td>{$product['name']}</td>"; echo "<td class='price'>¥{$product['price']}</td>"; echo "<td>"; if (!empty($product['image'])) { echo "<img src='{$product['image']}' alt='{$product['name']}'>"; } else { echo "<div class='no-image'>无图</div>"; } echo "</td>"; echo "<td>{$product['add_time']}</td>"; echo "</tr>"; } echo "</tbody>"; echo "</table>"; } } catch (PDOException $e) { echo "<p style='color:red;'>数据库错误:" . htmlspecialchars($e->getMessage()) . "</p>"; } ?> </body> </html>
2.7.6 重新构建LNMP项目
- 执行命令:
docker-compose up --build -d

2.7.7 访问页面
-
访问
http://localhost:8100

-
访问
http://localhost:8100/index.php

-
访问
http://localhost:8100/db.php

-
访问
http://localhost:8100/showProducts.php

2.8 停止并删除LNMP项目
-
执行命令:
docker-compose down

-
结果说明:执行
docker-compose down成功停止并移除了 mysql、nginx、fpm 三个容器及默认网络 lnmp_default,彻底清理了 LNMP 环境,避免资源占用和配置冲突,为下次部署提供干净环境。
3. 实战总结
- 本次实战通过 Docker Compose 成功构建了完整的 LNMP(Nginx + MySQL + PHP-FPM)开发环境。从创建项目目录、提取并配置 Nginx 默认配置,到编写自定义 Dockerfile 安装
mysqli和pdo_mysql扩展,确保 PHP 能正常连接数据库;通过导入lnmp.sql初始化商品数据,并在wwwroot中准备图片资源,最终实现showProducts.php页面以美观表格展示全部商品信息。整个流程涵盖了容器编排、服务协同、数据库操作与前端展示,验证了 LNMP 架构的完整性与可用性。环境可一键启动(docker-compose up -d)和清理(docker-compose down),具备良好的可移植性与复用性,适用于教学、开发与快速部署场景。
1737

被折叠的 条评论
为什么被折叠?



