使用Docker搭建 LNMP(Linux、Nginx, MySQL, PHP)环境是一种高效且灵活的方法,能够快速部署并轻松管理。这份指南将详细介绍如何在 Docker中搭建LNMP环境详细步骤,感兴趣的可以了解下。
环境准备安装Docker和Docker Compose
安装 Docker
在 Ubuntu 上,你可以使用以下命令安装 Docker:
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
在 CentOS 上:
sudo yum update
sudo yum install docker
sudo systemctl start docker
sudo systemctl enable docker
macOS 你可以从Docker官网下载并安装 Docker Desktop。
这个需要提前创建,因为如果直接使用docker命令创建容器会报错本地没有映射文件
安装Docker Compose
在 Ubuntu 上:
sudo apt install docker-compose
在 CentOS 上:
sudo yum install epel-release
sudo yum install python-pip
sudo pip install docker-compose
在 macOS 上,Docker Desktop 已经包含 Docker Compose。
验证 Docker 和 Docker Compose 是否正确安装:
docker --version
docker-compose --version
确保输出显示版本号,证明安装成功。
创建项目目录结构,我们需要创建一个项目目录来组织配置文件和数据。
mkdir lnmp-docker
cd lnmp-docker
在项目目录下,创建以下子目录:
mkdir nginx mysql php www logs
配置 Docker Compose 文件
在 lnmp-docker 目录下创建一个名为 docker-compose.yml 的文件,定义 Nginx、MySQL 和 PHP 服务。
yaml
version: '3.8'
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./www:/var/www/html
- ./logs/nginx:/var/log/nginx
depends_on:
- php
php:
image: php:8.2-fpm
container_name: php
volumes:
- ./www:/var/www/html
depends_on:
- mysql
mysql:
image: mysql:latest
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: user_password
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
docker-compose.yml 文件解析:
本版本声明:version: '3.8' 表示使用 Docker Compose 的 3.8 版本语法。
服务定义为:nginx:使用最新的 Nginx 镜像,暴露 80 和 443 端口,并挂载配置文件、网站文件和日志。
使用 PHP 8.2-FPM 镜像,挂载网站文件。
mysql:使用最新的 MySQL 镜像,设置数据库环境变量,并挂载数据卷以持久化数据。
数据盘:mysql_data 用于持久化 MySQL 数据,以防止数据丢失。
服务器配 Nginx创建 Nginx 配置文件
在 nginx 目录下创建 conf.d 子目录:
mkdir nginx/conf.d
在 nginx/conf.d 目录下创建 default.conf 文件,添加以下内容:
nginx
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
重新创建Ngin 日志目录,在logs 目录下为 Nginx 创建日志子目录:
mkdir logs/nginx
配置PHP在php目录中,使用 PHP-FPM 镜像,它已经支持许多扩展。
如果需要安装其他PHP扩展,可以创建自定义Dockerfile:
创建 PHP Dockerfile
php目录下创建 Dockerfile 文件,内容如下:
dockerfile
FROM php:8.2-fpm
# 安装 PHP 扩展
RUN docker-php-ext-install pdo pdo_mysql
修改 Docker Compose 文件以使用自定义 PHP 镜像
将docker-compose.yml 中的 PHP 服务改为使用 Dockerfile 构建:
yaml
php:
build:
context: ./php
volumes:
- ./www:/var/www/html
depends_on:
- mysql
配置 MySQL
MySQL 在 docker-compose.yml 中已经设置了环境变量来创建数据库和用户。可以根据需要更改这些值。
yaml
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: mydb
MYSQL_USER: user
MYSQL_PASSWORD: user_password
创建网站目录
在 lnmp-docker目录下创建 www 目录,并在里面创建一个简单的 PHP 文件用于测试:
mkdir www
在 www 目录下创建 index.php 文件,添加以下内容:
php
<?php
phpinfo();
?>
启动 LNMP 环境
在 lnmp-docker 目录下,执行以下命令启动服务:
docker-compose up -d
启动过程解析:
docker-compose up 命令启动所有在 docker-compose.yml 文件中定义的服务。
-d 选项表示在后台运行容器。
这将启动 Nginx、PHP 和 MySQL 容器。你可以通过访问 http://localhost 来查看 PHP 信息页面,确认环境是否成功搭建。
验证与测试
1. 访问 PHP 测试页面
打开浏览器,访问 http://localhost,你应该能看到 PHP 信息页面。这表明 Nginx 和 PHP-FPM 配置正常。
2. 检查 MySQL 连接
通过 MySQL 客户端连接到数据库:
docker exec -it mysql mysql -uuser -puser_password mydb
输入密码后,可以执行 SQL 查询以验证连接:
sql
SHOW TABLES;
3. 查看日志
检查容器日志以诊断问题:
Nginx 日志:位于 logs/nginx 目录中。
MySQL 日志:通过 Docker 查看日志:
docker logs mysql
4. 检查容器状态
使用 Docker 命令查看容器状态:
docker ps
这将显示所有正在运行的容器,确保 Nginx、PHP 和 MySQL 容器都在运行。
自定义和扩展
安装更多 PHP 扩展
如果你需要其他 PHP 扩展,可以在 Dockerfile 中添加它们。例如,安装 gd 扩展:
dockerfile
RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd
然后重建和启动容器:
docker-compose up -d --build
配置 HTTPS
如果需要使用 HTTPS,可以在 Nginx 中添加 SSL 支持。以下是步骤:
生成自签名证书或使用 Let's Encrypt。
修改 Nginx 配置文件 nginx/conf.d/default.conf,添加 SSL 支持:
nginx
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
将证书文件添加到 Nginx 容器中:
创建 nginx/ssl 目录,并放置你的证书文件 nginx.crt 和 nginx.key。
更新 Docker Compose 配置:
将证书目录挂载到 Nginx 容器:
yaml
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/ssl:/etc/nginx/ssl
- ./www:/var/www/html
- ./logs/nginx:/var/log/nginx
添加 Redis 缓存
如果你需要 Redis 缓存,可以在 docker-compose.yml 中添加 Redis 服务,并在 PHP 中配置 Redis 扩展。
添加 Redis 服务:
yaml
redis:
image: redis:latest
container_name: redis
安装 PHP Redis 扩展:
在 php/Dockerfile 中添加:
dockerfile
RUN pecl install redis \
&& docker-php-ext-enable redis
修改 PHP 配置以使用 Redis。
数据备份
使用 docker exec 或 cron 作业定期备份 MySQL 数据。
创建一个备份目录:
mkdir mysql_backup
创建备份脚本 backup.sh:
#!/bin/
docker exec mysql /usr/bin/mysqldump -u user --password=user_password mydb > mysql_backup/backup.sql
使脚本可执行:
chmod +x backup.sh
可以使用 cron 作业定期执行备份:
crontab -e
添加以下行,每天执行备份,具体备份时间自己设定,下面每天凌晨2点备份
0 2 * * * /path/to/lnmp-docker/backup.sh
监控和日志分析
使用工具如 Prometheus、Grafana 和 ELK Stack 进行监控和分析日志。
Prometheus 和 Grafana:用于实时监控和可视化。
ELK Stack:用于日志分析(Elasticsearch, Logstash, Kibana)。
在Docker中搭建LNMP 环境提供详细步骤。你可以根据项目需求对环境进行进一步的自定义和优化。通过Docker容器化,整个部署和管理过程将变得更加简洁和高效,需要了解更多相关技术问题,可以访问华纳云帮助中心。