Docker Compose部署LNMP:新手也能搞定:用D
前置准备
使用 Docker Compose部署LNMP 前,请确保你的服务器已安装以下软件:
- Docker:容器运行环境。
- Docker Compose:多容器编排工具(通常随Docker一起安装)。
- Git(可选):用于拉取示例配置文件。
检查安装
docker --version
docker-compose --version如果未安装,请参考官方文档安装(Ubuntu快速命令):
# 安装Docker
curl -fsSL https://get.docker.com | bash
安装Docker Compose
sudo apt install docker-compose -y
目录规划
创建专用于 LNMP 的目录结构:
mkdir -p ~/lnmp/nginx/conf.d ~/lnmp/mysql/data ~/lnmp/php
cd ~/lnmp分步操作
1. 编写 docker-compose.yml
在 ~/lnmp/ 目录下创建 docker-compose.yml,内容如下:
version: '3'
services:
nginx:
image: nginx:latest
container_name: lnmp-nginx
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./html:/usr/share/nginx/html
depends_on:
- php
networks:
- lnmp
php:
image: php:7.4-fpm
container_name: lnmp-php
volumes:
- ./html:/var/www/html
networks:
- lnmp
mysql:
image: mysql:5.7
container_name: lnmp-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: testdb
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
networks:
- lnmp
networks:
lnmp:
说明:此配置会启动三个容器,分别是 Nginx、PHP-FPM 和 MySQL,并共享一个自定义网络。
2. 配置 Nginx 站点
创建 ~/lnmp/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 $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3. 创建测试 PHP 文件
mkdir ~/lnmp/html
echo "" > ~/lnmp/html/index.php4. 启动容器
回到 ~/lnmp/ 目录,执行:
docker-compose up -d查看容器状态:
docker-compose ps如果所有容器都显示 Up,则部署成功。
避坑指南
1. 端口冲突
错误提示:Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use
原因:宿主机80或3306端口已被其他服务占用。
解决:先停止占用端口的服务(如 Nginx、Apache),或修改 docker-compose.yml 中的宿主机端口映射。
2. MySQL 连接拒绝
PHP 连接数据库时出现 Connection refused。
原因:容器内使用 localhost 而不是服务名。
解决:在 PHP 代码中将数据库主机改为容器服务名 mysql,即:
$host = 'mysql'; // 对应 docker-compose.yml 中的服务名3. 文件权限问题
PHP 写入文件时提示 Permission denied。
解决:将 ./html 目录权限设置为 777 或使用 chown 调整:
chmod -R 777 ~/lnmp/html高频问题解答
Q1:如何修改 MySQL 的 root 密码?
A:
在 docker-compose.yml 的 mysql 服务下修改 MYSQL_ROOT_PASSWORD 值,
然后 docker-compose down && docker-compose up -d 重建容器。注意:
这会导致原有 MySQL 数据丢失(除非提前挂载持久化卷)。
Q2:能否同时运行多个 PHP 版本?
A:可以。
复制 php 服务块,指定不同镜像标签(如 php:8.2-fpm),并修改容器名和端口映射。
Q3:如何添加 HTTPS 支持?
A:在 Nginx 配置中添加 SSL 证书,并映射 443 端口即可。
可以参考 Let's Encrypt 自动申请证书。
效果验证
- 浏览器访问
http://你的服务器IP,如果看到 PHP 信息页面,说明 LNMP 正常运行。 - 测试 MySQL 连接:进入 PHP 容器,用命令行或写一个
test.php验证:
$conn = new mysqli('mysql', 'root', 'root123', 'testdb');
if ($conn->connect_error) {
die('连接失败: ' . $conn->connect_error);
}
echo 'MySQL连接成功';
?>如果输出“MySQL连接成功”,则 LNMP 整体部署成功。
如果你正在处理 Docker Compose部署LNMP,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。