Docker Compose部署LNMP环境完整示例
时间:2026-10-8 08:13 作者:emer 分类: 无
前言
手动装Nginx、PHP、MySQL太麻烦,用Docker Compose一键部署LNMP环境,几分钟搞定。
一、项目结构
lnmp/
├── docker-compose.yml
├── nginx/
│ ├── conf.d/
│ │ └── default.conf
│ └── nginx.conf
├── php/
│ └── php.ini
├── mysql/
│ └── my.cnf
└── www/
└── index.php
二、docker-compose.yml
version: '3'
services:
nginx:
image: nginx:latest
container_name: lnmp_nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./www:/var/www/html
depends_on:
- php
networks:
- lnmp
php:
image: php:fpm
container_name: lnmp_php
volumes:
- ./www:/var/www/html
- ./php/php.ini:/usr/local/etc/php/php.ini
networks:
- lnmp
mysql:
image: mysql:5.7
container_name: lnmp_mysql
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: mydb
networks:
- lnmp
networks:
lnmp:
driver: bridge
三、Nginx配置
nginx/conf.d/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 /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
}
四、PHP配置
php/php.ini
[PHP]
date.timezone = Asia/Shanghai
upload_max_filesize = 20M
post_max_size = 20M
memory_limit = 128M
五、MySQL配置
mysql/my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
六、测试文件
www/index.php
<?php
phpinfo();
?>
七、启动
cd lnmp
docker-compose up -d
查看状态
docker-compose ps
访问
http://localhost
能看到phpinfo页面就是成功了。
八、常用命令
| 命令 | 说明 |
|---|---|
| docker-compose up -d | 启动 |
| docker-compose down | 停止并删除容器 |
| docker-compose restart | 重启 |
| docker-compose logs -f | 看日志 |
| docker-compose exec php bash | 进PHP容器 |
| docker-compose exec mysql bash | 进MySQL容器 |
九、连接MySQL
从宿主机连接
mysql -h 127.0.0.1 -P 3306 -u root -p123456
从PHP连接
<?php
$pdo = new PDO('mysql:host=mysql;dbname=mydb', 'root', '123456');
echo "连接成功";
?>
注意:host填mysql,不是localhost,是docker-compose.yml里的服务名。
十、安装PHP扩展
进入PHP容器
docker-compose exec php bash
安装pdo_mysql
docker-php-ext-install pdo_mysql
docker-php-ext-install mysqli
重启PHP
docker-compose restart php
常见坑
坑1:Nginx报502
502 Bad Gateway,原因是PHP容器没启动,或者地址不对。
解决:确认PHP容器在运行,fastcgi_pass填服务名php:9000。
坑2:MySQL启动失败
原因:数据目录权限不对,或者密码没设。
解决:确认MYSQL_ROOT_PASSWORD设了,数据目录权限改成777。
坑3:文件修改不生效
改了www里的文件,浏览器刷新没变。
解决:确认volumes挂载了./www:/var/www/html。
坑4:端口被占用
port is already allocated,原因是宿主机80端口被占了。
解决:改端口,比如改成8080。
坑5:数据丢失
删了容器,MySQL数据没了。
解决:一定要挂载数据卷,./mysql/data:/var/lib/mysql。
总结
部署五步:建项目目录结构,写docker-compose.yml,写配置文件,docker-compose up -d启动,浏览器访问测试。
记住:数据一定要挂载,不然删容器数据就没了。
遇到问题加QQ23979811 协助处理