LNMP 栈实战
约 499 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › Docker › Docker Compose(在新窗口打开) › LNMP 栈实战
用 Compose 编排一个完整的 LNMP 环境(Nginx + PHP-FPM + MySQL + Redis),覆盖 Web 后端、数据库和缓存的典型组合。
项目结构
project/
├── compose.yml
├── nginx/
│ └── default.conf
├── php/
│ └── Dockerfile
├── app/
│ └── index.php
└── .envcompose.yml
services:
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./app:/var/www/html:ro
depends_on:
- php
networks:
- frontend
- backend
php:
build:
context: ./php
dockerfile: Dockerfile
volumes:
- ./app:/var/www/html
environment:
- DB_HOST=${DB_HOST}
- DB_NAME=${DB_NAME}
- DB_USER=${DB_USER}
- DB_PASSWORD=${DB_PASSWORD}
- REDIS_HOST=redis
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_started
networks:
- backend
mysql:
image: mysql:8.4
volumes:
- mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- backend
redis:
image: redis:alpine
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 3s
retries: 3
networks:
- backend
volumes:
mysql-data:
redis-data:
networks:
frontend:
backend:nginx/default.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}php/Dockerfile
FROM php:8.3-fpm-alpine
RUN docker-php-ext-install pdo_mysql mysqli
RUN apk add --no-cache \
&& pecl install redis \
&& docker-php-ext-enable redis
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/htmlapp/index.php
<?php
// Database connection test
try {
$pdo = new PDO(
"mysql:host={$_ENV['DB_HOST']};dbname={$_ENV['DB_NAME']}",
$_ENV['DB_USER'],
$_ENV['DB_PASSWORD']
);
echo "✓ MySQL connected<br>";
} catch (PDOException $e) {
echo "✗ MySQL: " . $e->getMessage() . "<br>";
}
// Redis connection test
try {
$redis = new Redis();
$redis->connect('redis', 6379);
$redis->set('test', 'Hello from Redis!');
echo "✓ Redis connected: " . $redis->get('test') . "<br>";
} catch (Exception $e) {
echo "✗ Redis: " . $e->getMessage() . "<br>";
}
phpinfo();.env
DB_HOST=mysql
DB_NAME=lnmp_app
DB_USER=appuser
DB_PASSWORD=apppass
DB_ROOT_PASSWORD=rootpass启动
# 构建并启动
docker compose up -d
# 查看状态
docker compose ps
# 访问 http://localhost:8080
# 查看日志
docker compose logs -f
# 停止
docker compose down -v小结
- LNMP 栈的 Compose 编排:Nginx 暴露端口 + 反向代理 PHP-FPM;PHP 连接 MySQL 和 Redis;MySQL 和 Redis 通过 named volume 持久化数据。
- Nginx 通过
fastcgi_pass php:9000与服务名互联。 depends_on: condition: service_healthy确保 MySQL 就绪后 PHP 才连接。.env文件管理敏感信息,不提交到 Git(需加入.gitignore)。- 网络隔离:Nginx 连接 frontend(对外)和 backend(对内);PHP/MySQL/Redis 仅在 backend 内部通信。
上一节:Compose 常用命令 下一节:镜像安全
