利用Docker Compose部署多容器LNMP环境的实战步骤

 更新时间:2025年12月10日 10:30:13   作者:酒城译痴无心剑  
本次实战通过Docker Compose成功构建了完整的LNMP(Nginx + MySQL + PHP-FPM)开发环境,通过自定义PHP-FPM镜像安装MySQL扩展,配置 Nginx 反向代理 PHP 请求,本文介绍的非常详细,感兴趣的朋友一起看看吧

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),具备良好的可移植性与复用性,适用于教学、开发与快速部署场景。

到此这篇关于利用Docker Compose部署多容器LNMP环境的实战步骤的文章就介绍到这了,更多相关docker compose 部署lnmp内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何使用Docker和cpolar在Linux服务器上搭建DashDot监控面板

    如何使用Docker和cpolar在Linux服务器上搭建DashDot监控面板

    本文主要介绍如何在Linux服务器上使用Docker和cpolar技术搭建DashDot监控面板,实现实时服务器监控,DashDot提供直观的监控界面和丰富的指标,通过cpolar可以实现公网访问,方便用户随时了解服务器状态,文章详细说明了环境准备、安装Docker、配置DashDot和cpolar的步骤
    2024-09-09
  • docker删除拉取的镜像释放内存的操作方法

    docker删除拉取的镜像释放内存的操作方法

    kali内存满了,释放一下内存,通过查看本地镜像,删除本地镜像,文中给大家介绍了docker image ls详解,对docker删除拉取的镜像释放内存相关知识操作感兴趣的朋友一起看看吧
    2023-01-01
  • 编写最佳的Dockerfile的方法

    编写最佳的Dockerfile的方法

    本文给大家分享的是如何编写最佳的dockerfile的方法,通过具体实例帮助大家快速掌握编写Dockerfile的技巧
    2017-06-06
  • Docker容器的调试技巧之docker logs与docker service logs解读

    Docker容器的调试技巧之docker logs与docker service logs

    这篇文章主要介绍了Docker容器的调试技巧之docker logs与docker service logs,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Docker中使用gosu的方法详解

    Docker中使用gosu的方法详解

    在Docker镜像中启动服务时,我们通常不希望以root身份运行主进程,sudogosu是一个非常轻量的工具,功能类似sudo,但不会产生额外进程,非常适合在Docker容器中用来切换用户,本文给大家介绍Docker中使用gosu的方法,感兴趣的朋友一起看看吧
    2025-10-10
  • Docker MySQL 单主从及分表函数的解决方案

    Docker MySQL 单主从及分表函数的解决方案

    本文介绍了MySQL单主从配置和按月分表两种方案,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-10-10
  • 使用 docker部署tomcat并接入skywalking的使用

    使用 docker部署tomcat并接入skywalking的使用

    这里主要介绍了使用 docker 部署 tomact 并接入 skywalking 的使用,因为在网上并没有查到太多相关的信息,所以这里记录下来,需要对有需求的小伙伴提供一些帮助
    2021-04-04
  • Docker 运行时的用户与组管理的方法

    Docker 运行时的用户与组管理的方法

    这篇文章主要介绍了Docker 运行时的用户与组管理的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Docker下安装ElasticSearch和Kibana的示例代码

    Docker下安装ElasticSearch和Kibana的示例代码

    这篇文章主要介绍了Docker下安装ElasticSearch和Kibana的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 详解docker国内镜像拉取和镜像加速registry-mirrors配置修改

    详解docker国内镜像拉取和镜像加速registry-mirrors配置修改

    由于国内访问直接访问Docker hub网速比较慢,拉取镜像的时间就会比较长。一般我们会使用镜像加速或者直接从国内的一些平台镜像仓库上拉取
    2017-05-05

最新评论