您好,登录后才能下订单哦!
# 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为例:
wwwrootwp-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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。