利用Docker Compose部署多容器LNMP環(huán)境的實(shí)戰(zhàn)步驟
1. 實(shí)戰(zhàn)概述
- 本實(shí)戰(zhàn)基于 Docker Compose 搭建 LNMP 開發(fā)環(huán)境,通過(guò)自定義 PHP-FPM 鏡像安裝 MySQL 擴(kuò)展,配置 Nginx 反向代理 PHP 請(qǐng)求,導(dǎo)入商品數(shù)據(jù)并創(chuàng)建
showProducts.php頁(yè)面,成功實(shí)現(xiàn)商品信息的表格化展示,完整驗(yàn)證了 Web 服務(wù)、動(dòng)態(tài)腳本與數(shù)據(jù)庫(kù)的協(xié)同工作。
2. 實(shí)戰(zhàn)步驟
2.1 創(chuàng)建項(xiàng)目目錄
執(zhí)行命令:mkdir lnmp

執(zhí)行命令:cd lnmp

執(zhí)行命令:mkdir wwwroot php-fpm

2.2 準(zhǔn)備nginx配置文件
2.2.1 創(chuàng)建nginx容器
執(zhí)行命令:docker run -dit --name hwnginx nginx

2.2.2 拷貝nginx配置文件到當(dāng)前目錄
執(zhí)行命令:docker cp hwnginx:/etc/nginx ./

2.2.3 停止并刪除nginx容器
執(zhí)行命令:docker stop hwnginx

執(zhí)行命令:docker rm hwnginx

2.2.4 修改nginx配置文件
執(zhí)行命令: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 準(zhǔn)備測(cè)試網(wǎng)頁(yè)文件
執(zhí)行命令:notepad wwwroot\index.html

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>首頁(yè)</title>
</head>
<body style='text-align: center; background-color: antiquewhite'>
<h1 style='color: red'>歡迎訪問(wèn)Nginx頁(yè)面~</h1>
</body>
</html>執(zhí)行命令:notepad wwwroot\index.php

<?php
// 設(shè)置時(shí)區(qū)
date_default_timezone_set('Asia/Shanghai');
// 獲取當(dāng)前日期時(shí)間并格式化
$now = date('Y-m-d H:i:s');
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>當(dāng)前時(shí)間</title>
</head>
<body style='text-align: center; background-color: antiquewhite'>
<h1 style='color: red'>系統(tǒng)當(dāng)前日期時(shí)間</h1>
<p style='color: blue'><?php echo htmlspecialchars($now); ?></p>
</body>
</html>執(zhí)行命令:notepad wwwroot\db.php

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>數(shù)據(jù)庫(kù)連接測(cè)試</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;">? 數(shù)據(jù)庫(kù)連接失??!</h2>';
exit;
}
echo '<h2 style="color:green;">? 數(shù)據(jù)庫(kù)連接成功!</h2>';
mysqli_close($link);
?>
</body>
</html>2.4 準(zhǔn)備php的Dockerfile文件
- Docker官方php鏡像沒(méi)有安裝mysql插件,無(wú)法連接mysql數(shù)據(jù)庫(kù),需要利用Dockerfile重新生成新鏡像。從php:7.4-fpm開始構(gòu)建,安裝
mysqli和pdo_mysql擴(kuò)展。 - 執(zhí)行命令:
notepad php-fpm\Dockerfile

2.5 編寫Docker編排配置文件
執(zhí)行命令: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 構(gòu)建LNMP項(xiàng)目
執(zhí)行命令:docker-compose up -d

- 結(jié)果說(shuō)明:執(zhí)行
docker-compose up -d成功啟動(dòng) LNMP 環(huán)境,創(chuàng)建了默認(rèn)網(wǎng)絡(luò)和 MySQL 數(shù)據(jù)卷,依次啟動(dòng) fpm、mysql 和 nginx 容器,服務(wù)運(yùn)行正常,可訪問(wèn) http://localhost:8100 進(jìn)行測(cè)試。
2.7 測(cè)試LNMP項(xiàng)目
2.7.1 創(chuàng)建數(shù)據(jù)庫(kù)連接
創(chuàng)建LNMPMySQL數(shù)據(jù)庫(kù)連接


2.7.2 運(yùn)行數(shù)據(jù)庫(kù)腳本
運(yùn)行數(shù)據(jù)庫(kù)腳本lnmp.sql

單擊【開始】按鈕

2.7.3 查看數(shù)據(jù)表
查看商品表

2.7.4 準(zhǔn)備圖片文件
在D:\docker_work\lnmp\wwwroot\images里準(zhǔn)備15張商品圖片

2.7.5 創(chuàng)建顯示商品頁(yè)面
在D:\docker_work\lnmp\wwwroot里創(chuàng)建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
// 數(shù)據(jù)庫(kù)連接配置
$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;'>暫無(wú)商品數(shù)據(jù)。</p>";
} else {
echo "<table>";
echo "<thead>";
echo "<tr>";
echo "<th>ID</th>";
echo "<th>商品名稱</th>";
echo "<th>價(jià)格</th>";
echo "<th>圖片</th>";
echo "<th>添加時(shí)間</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'>無(wú)圖</div>";
}
echo "</td>";
echo "<td>{$product['add_time']}</td>";
echo "</tr>";
}
echo "</tbody>";
echo "</table>";
}
} catch (PDOException $e) {
echo "<p style='color:red;'>數(shù)據(jù)庫(kù)錯(cuò)誤:" . htmlspecialchars($e->getMessage()) . "</p>";
}
?>
</body>
</html>2.7.6 重新構(gòu)建LNMP項(xiàng)目
執(zhí)行命令:docker-compose up --build -d

2.7.7 訪問(wèn)頁(yè)面
訪問(wèn)http://localhost:8100

訪問(wèn)http://localhost:8100/index.php

訪問(wèn)http://localhost:8100/db.php

訪問(wèn)http://localhost:8100/showProducts.php

2.8 停止并刪除LNMP項(xiàng)目
執(zhí)行命令:docker-compose down

- 結(jié)果說(shuō)明:執(zhí)行
docker-compose down成功停止并移除了 mysql、nginx、fpm 三個(gè)容器及默認(rèn)網(wǎng)絡(luò) lnmp_default,徹底清理了 LNMP 環(huán)境,避免資源占用和配置沖突,為下次部署提供干凈環(huán)境。
3. 實(shí)戰(zhàn)總結(jié)
- 本次實(shí)戰(zhàn)通過(guò) Docker Compose 成功構(gòu)建了完整的 LNMP(Nginx + MySQL + PHP-FPM)開發(fā)環(huán)境。從創(chuàng)建項(xiàng)目目錄、提取并配置 Nginx 默認(rèn)配置,到編寫自定義 Dockerfile 安裝
mysqli和pdo_mysql擴(kuò)展,確保 PHP 能正常連接數(shù)據(jù)庫(kù);通過(guò)導(dǎo)入lnmp.sql初始化商品數(shù)據(jù),并在wwwroot中準(zhǔn)備圖片資源,最終實(shí)現(xiàn)showProducts.php頁(yè)面以美觀表格展示全部商品信息。整個(gè)流程涵蓋了容器編排、服務(wù)協(xié)同、數(shù)據(jù)庫(kù)操作與前端展示,驗(yàn)證了 LNMP 架構(gòu)的完整性與可用性。環(huán)境可一鍵啟動(dòng)(docker-compose up -d)和清理(docker-compose down),具備良好的可移植性與復(fù)用性,適用于教學(xué)、開發(fā)與快速部署場(chǎng)景。
到此這篇關(guān)于利用Docker Compose部署多容器LNMP環(huán)境的實(shí)戰(zhàn)步驟的文章就介紹到這了,更多相關(guān)docker compose 部署lnmp內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Docker Compose一鍵部署LNMP環(huán)境詳細(xì)過(guò)程
- Docker-compose詳解和LNMP搭建全過(guò)程
- 使用 Docker-compose 搭建lnmp的詳細(xì)過(guò)程
- 詳解docker compose搭建lnmpr環(huán)境實(shí)現(xiàn)
- Docker多容器編排Compose實(shí)戰(zhàn)案例
- Docker Compose 輕松管理多容器應(yīng)用小結(jié)
- 使用?Docker?Compose?構(gòu)建復(fù)雜的多容器?App的方法
- Docker Compose快速部署多容器服務(wù)實(shí)戰(zhàn)的實(shí)例詳解
- Docker Compose多容器部署的實(shí)現(xiàn)
相關(guān)文章
利用Docker?運(yùn)行?python?簡(jiǎn)單程序
這篇文章主要介紹了利用Docker?運(yùn)行?python?簡(jiǎn)單程序,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04
安裝docker-ce報(bào)錯(cuò)yum倉(cāng)庫(kù)錯(cuò)誤問(wèn)題及解決
安裝Docker-CE時(shí),可能會(huì)因依賴軟件版本不足導(dǎo)致報(bào)錯(cuò),解決方法包括使用yum update更新軟件包,若倉(cāng)庫(kù)無(wú)該包則需更新repo源,也可通過(guò)yum install -y docker-ce --skip-broken跳過(guò)依賴更新直接安裝,若遇yum命令執(zhí)行報(bào)錯(cuò)2024-11-11
docker部署mysql8之PXC8.0分布式集群過(guò)程
這篇文章主要介紹了docker部署mysql8之PXC8.0分布式集群過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
docker如何開啟2375端口提供外部訪問(wèn)docker
這篇文章主要介紹了docker如何開啟2375端口提供外部訪問(wèn)docker問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Docker基于現(xiàn)有鏡像構(gòu)建新鏡像的實(shí)現(xiàn)方法
這篇文章主要介紹了Docker基于現(xiàn)有鏡像構(gòu)建新鏡像的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
在docker容器中elasticsearch的導(dǎo)入導(dǎo)出方式
文章詳細(xì)介紹了如何使用Docker拉取Elasticsearch鏡像,并導(dǎo)出和導(dǎo)入索引數(shù)據(jù),還討論了在Elasticsearch?Head中解決請(qǐng)求頭顯示不正確的問(wèn)題,包括從容器中復(fù)制文件、編輯文件和將文件回傳到容器2025-11-11
使用Portainer部署Docker容器的項(xiàng)目實(shí)踐
這篇文章主要介紹了使用Portainer部署Docker容器的項(xiàng)目實(shí)踐,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Docker部署搭建WebDav服務(wù)的詳細(xì)過(guò)程
這篇文章主要介紹了Docker部署WebDav服務(wù),小編綜合了各種共享方式后最終選擇了使用 WebDav 來(lái)共享文件,下面小編把搭建部署過(guò)程分享給大家,需要的朋友可以參考下2022-08-08

