前言
传统 LNMP(Linux + Nginx + MySQL + PHP)环境的部署过程,对许多新手站长来说是个不小的挑战。编译安装费时费力,apt/yum 安装又面临版本不一致的问题,更别说日后迁移服务器时需要重头再来。Docker 容器化部署可以完美解决这些痛点——环境隔离、一键部署、轻松迁移。
本文将手把手教你用 Docker Compose 搭建一个生产可用的 LNMP 环境,包含 Nginx、PHP 8.1、MySQL 8.0 以及 Redis 缓存服务。
一、准备工作
1.1 安装 Docker 和 Docker Compose
如果你是在全新服务器上操作,先安装 Docker:
# Ubuntu/Debian
curl -fsSL https://get.docker.com | bash -s docker
sudo usermod -aG docker $USER
# 安装 Docker Compose
sudo apt install docker-compose-plugin
# 验证安装
docker --version
docker compose version1.2 项目目录结构
我们规划如下的目录结构:
~/lnmp-docker/
├── docker-compose.yml
├── nginx/
│ ├── conf.d/
│ │ └── default.conf
│ └── html/
│ └── wordpress/
├── php/
│ └── Dockerfile
├── mysql/
│ └── data/
└── redis/
└── data/二、编写 Docker Compose 配置
2.1 docker-compose.yml
version: '3.8'
services:
nginx:
image: nginx:stable-alpine
container_name: lnmp-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/html:/var/www/html
- ./nginx/ssl:/etc/nginx/ssl
depends_on:
- php
networks:
- lnmp
restart: always
php:
build: ./php
container_name: lnmp-php
volumes:
- ./nginx/html:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini:ro
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_started
networks:
- lnmp
restart: always
mysql:
image: mysql:8.0
container_name: lnmp-mysql
ports:
- "127.0.0.1:3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: your_wp_password
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- lnmp
restart: always
redis:
image: redis:7-alpine
container_name: lnmp-redis
volumes:
- ./redis/data:/data
networks:
- lnmp
restart: always
networks:
lnmp:
driver: bridge2.2 PHP Dockerfile
FROM php:8.1-fpm-alpine
RUN apk add --no-cache libzip-dev libpng-dev libjpeg-turbo-dev freetype-dev oniguruma-dev libxml2-dev curl-dev
RUN docker-php-ext-install pdo_mysql mysqli zip gd mbstring exif bcmath opcache
RUN pecl install redis && docker-php-ext-enable redis
WORKDIR /var/www/html三、Nginx 站点配置
在 nginx/conf.d/default.conf 中编写站点配置:
server {
listen 80;
server_name yourdomain.com;
root /var/www/html/wordpress;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}四、启动与验证
cd ~/lnmp-docker
docker compose up -d
docker compose ps
docker compose logs -f五、生产环境注意事项
- 安全加固:MySQL 端口不要暴露到公网,使用
127.0.0.1:3306:3306绑定本地回环地址 - 日志管理:配置 Docker 的 log rotate 策略,避免日志文件撑爆磁盘
- 备份策略:数据库文件映射到宿主机目录,定期使用 mysqldump 执行逻辑备份
- 镜像版本锁定:生产环境建议使用具体版本号而非 latest 标签
- 资源限制:在 docker-compose.yml 中为每个服务设置 CPU 和内存限制
六、迁移到新服务器
Docker 部署的最大优势在于迁移极其简单:把整个 ~/lnmp-docker/ 目录打包,传到新服务器,执行 docker compose up -d 即可恢复完整的运行环境。数据库文件因为做了数据卷映射,迁移后不会丢失数据。
相比传统 LNMP 一键安装包(如 LNMP.org)需要重装配置,Docker 方案在可维护性和可重现性上有着质的提升。
七、总结
Docker 容器化不是锦上添花,而是现代网站部署的基础技能。对于个人站长来说,掌握 Docker Compose 搭建 LNMP 环境不仅节约时间,更重要的是让服务器管理变得可预期、可重现。即使你遭遇服务器故障,也可以在一台新机器上迅速重建整个环境,恢复服务时间从天级别缩短到分钟级别。