您好,登录后才能下订单哦!
# Docker中怎么部署LNMP服务器环境
## 前言
在当今的Web开发领域,LNMP(Linux + Nginx + MySQL + PHP)是一种非常流行的服务器环境组合。随着容器化技术的普及,使用Docker部署LNMP环境可以带来诸多优势:
- **环境隔离**:每个服务运行在独立的容器中
- **快速部署**:通过镜像快速搭建完整环境
- **版本控制**:方便管理不同版本的服务组件
- **资源高效**:相比传统虚拟机更节省资源
本文将详细介绍如何使用Docker部署LNMP环境,包括基础配置、容器编排和优化技巧。
## 一、准备工作
### 1.1 安装Docker和Docker Compose
在开始前,请确保系统已安装以下工具:
```bash
# 安装Docker
curl -fsSL https://get.docker.com | sh
sudo systemctl enable --now docker
# 安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
建议为LNMP项目创建独立目录结构:
mkdir -p lnmp-docker/{nginx,php,mysql,wwwroot}
cd lnmp-docker
创建MySQL配置文件 mysql/my.cnf
:
[mysqld]
user=mysql
default-storage-engine=INNODB
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
在docker-compose.yml
中添加MySQL服务:
services:
mysql:
image: mysql:8.0
container_name: lnmp-mysql
environment:
MYSQL_ROOT_PASSWORD: your_secure_password
MYSQL_DATABASE: app_db
MYSQL_USER: db_user
MYSQL_PASSWORD: user_password
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- "3306:3306"
networks:
- lnmp-network
restart: unless-stopped
创建PHP配置文件 php/php.ini
:
[PHP]
upload_max_filesize = 20M
post_max_size = 20M
memory_limit = 256M
date.timezone = Asia/Shanghai
在docker-compose.yml
中添加PHP-FPM服务:
php:
image: php:8.2-fpm
container_name: lnmp-php
volumes:
- ./wwwroot:/var/www/html
- ./php/php.ini:/usr/local/etc/php/conf.d/custom.ini
networks:
- lnmp-network
depends_on:
- mysql
restart: unless-stopped
创建Nginx配置文件 nginx/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;
}
}
在docker-compose.yml
中添加Nginx服务:
nginx:
image: nginx:alpine
container_name: lnmp-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./wwwroot:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
networks:
- lnmp-network
depends_on:
- php
restart: unless-stopped
在docker-compose.yml
中添加网络定义:
networks:
lnmp-network:
driver: bridge
docker-compose up -d
检查容器是否正常运行:
docker-compose ps
在wwwroot
目录创建测试文件test_db.php
:
<?php
$host = 'mysql';
$user = 'db_user';
$pass = 'user_password';
$db = 'app_db';
try {
$conn = new PDO("mysql:host=$host;dbname=$db", $user, $pass);
echo "MySQL连接成功!";
} catch(PDOException $e) {
echo "连接失败: " . $e->getMessage();
}
?>
访问 http://localhost/test_db.php
测试连接。
对于PHP,可以创建包含扩展的自定义镜像:
# php/Dockerfile
FROM php:8.2-fpm
RUN apt-get update && apt-get install -y \
libzip-dev \
libpng-dev \
&& docker-php-ext-install pdo_mysql zip gd
然后在docker-compose.yml
中修改PHP服务:
php:
build: ./php
# 其余配置保持不变...
在php/php.ini
中添加:
[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
更新nginx/default.conf
中的worker配置:
worker_processes auto;
events {
worker_connections 1024;
multi_accept on;
}
确保MySQL数据卷已配置:
volumes:
- ./mysql/data:/var/lib/mysql
定期备份命令:
docker exec lnmp-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > backup.sql
确保:
- 所有服务使用相同网络
- 使用服务名而非IP进行连接
- 检查depends_on
配置
处理PHP文件写入权限:
docker exec -it lnmp-php chown -R www-data:www-data /var/www/html
使用命令监控资源使用:
docker stats
添加基础认证:
location /admin {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
禁用危险函数:
disable_functions = exec,passthru,shell_exec,system
以WordPress为例:
wwwroot
wp-config.php
中的数据库配置通过Docker部署LNMP环境,我们实现了: - 服务隔离与独立管理 - 快速环境复制与迁移 - 灵活的版本控制 - 资源的高效利用
建议进一步探索: - 使用Docker Swarm或Kubernetes编排集群 - 实现CI/CD自动化部署 - 配置ELK日志收集系统
完整的docker-compose.yml
示例:
version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: lnmp-nginx
ports:
- "80:80"
volumes:
- ./wwwroot:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
networks:
- lnmp-network
depends_on:
- php
restart: unless-stopped
php:
build: ./php
container_name: lnmp-php
volumes:
- ./wwwroot:/var/www/html
- ./php/php.ini:/usr/local/etc/php/conf.d/custom.ini
networks:
- lnmp-network
depends_on:
- mysql
restart: unless-stopped
mysql:
image: mysql:8.0
container_name: lnmp-mysql
environment:
MYSQL_ROOT_PASSWORD: secure_root_password
MYSQL_DATABASE: app_db
MYSQL_USER: db_user
MYSQL_PASSWORD: user_password
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
networks:
- lnmp-network
restart: unless-stopped
networks:
lnmp-network:
driver: bridge
希望本指南能帮助您顺利搭建Docker化的LNMP环境! “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。