利用Docker-Compose部署多容器LNMP环境

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开始构建,安装 mysqlipdo_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 安装 mysqlipdo_mysql 扩展,确保 PHP 能正常连接数据库;通过导入 lnmp.sql 初始化商品数据,并在 wwwroot 中准备图片资源,最终实现 showProducts.php 页面以美观表格展示全部商品信息。整个流程涵盖了容器编排、服务协同、数据库操作与前端展示,验证了 LNMP 架构的完整性与可用性。环境可一键启动(docker-compose up -d)和清理(docker-compose down),具备良好的可移植性与复用性,适用于教学、开发与快速部署场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酒城译痴无心剑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值