使用 Docker Compose 部署 LNMP
1. 准备工作
确保已安装 Docker 和 Docker Compose。如果未安装,可参考以下命令(以 Ubuntu 为例):
2. 创建项目目录
创建并进入项目目录,用于存放配置文件和代码:
mkdir lnmp && cd lnmp
mkdir -p nginx/conf.d www
3. 创建 Docker Compose 配置文件
在 lnmp
目录下创建 docker-compose.yml
,并添加以下内容:
version: '3.8'
services:
nginx:
image: hub.yumesakura.com/library/nginx:latest
container_name: nginx
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./www:/var/www/html
depends_on:
- php
networks:
- lnmp-network
php:
image: hub.yumesakura.com/library/php:8.1-fpm
container_name: php
volumes:
- ./www:/var/www/html
networks:
- lnmp-network
mysql:
image: hub.yumesakura.com/library/mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: myapp
MYSQL_USER: app_user
MYSQL_PASSWORD: app_password
volumes:
- mysql-data:/var/lib/mysql
networks:
- lnmp-network
volumes:
mysql-data:
networks:
lnmp-network:
driver: bridge
说明:
- Nginx:映射宿主机的 80 端口,挂载配置文件和 Web 根目录。
- PHP:使用 PHP 8.1 FPM 镜像,与 Nginx 共享 Web 根目录。
- MySQL:设置数据库 root 密码、默认数据库和用户,数据持久化到卷。
- 网络:使用桥接网络确保容器间通信。
4. 配置 Nginx
在 nginx/conf.d
目录下创建 default.conf
,添加以下内容:
server {
listen 80;
server_name default_server;
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;
}
}
说明:此配置使 Nginx 支持 PHP 文件处理,通过 FastCGI 转发给 PHP 容器。
5. 创建测试 PHP 文件
在 www
目录下创建 index.php
,添加以下内容:
<?php
phpinfo();
?>
此文件用于测试 PHP 是否正常运行。
6. 启动 LNMP 环境
在 lnmp
目录下运行以下命令启动所有服务:
docker-compose up -d
-d
表示后台运行。- 启动后,Docker 会拉取 Nginx、PHP 和 MySQL 镜像,并创建容器。
7. 验证部署
- 打开浏览器,访问
http://localhost
,应看到 PHP 信息页面(phpinfo)。 - 验证 MySQL:使用 MySQL 客户端连接数据库:
输入密码docker exec -it mysql mysql -uapp_user -papp_password
app_password
,进入 MySQL 后运行SHOW DATABASES;
检查myapp
数据库是否存在。
8. 管理服务
- 停止服务:
docker-compose down
- 查看日志:
docker-compose logs
- 重启服务:
docker-compose restart
9. 注意事项
- 端口冲突:确保宿主机 80 端口未被占用,否则修改
docker-compose.yml
中的端口映射(例如"8080:80"
)。 - 数据持久化:MySQL 数据存储在
mysql-data
卷中,停止容器后数据不会丢失。 - 扩展:可将
www
目录替换为您的 PHP 项目代码。
10. 故障排查
- 如果页面无法访问,检查容器状态:
docker ps -a
- 查看具体容器日志,例如:
docker logs nginx
- 确保
nginx/conf.d/default.conf
和www/index.php
文件权限正确(例如chmod -R 755 www
)。