温馨提示×

Linux LNMP如何进行容器化部署

小樊
34
2025-12-08 03:13:44
栏目: 智能运维

Linux LNMP容器化部署实操指南

一 准备与规划

  • 安装基础工具:确保已安装 DockerDocker Compose,可执行 docker --versiondocker-compose --version 验证。
  • 选择版本:按需选择组件版本,例如 Nginx 最新稳定版MySQL 5.7/8.0PHP 7.4/8.x
  • 目录规划:建议统一项目目录,如 lnmp-docker/,并按服务拆分子目录:nginx/conf.dwwwrootmysql/dataphp/conf.d
  • 网络规划:为服务创建自定义桥接网络(如 lnmp_net),便于容器间用服务名互通,避免端口直连带来的耦合与安全风险。
  • 数据持久化:为 MySQL 数据目录Nginx 日志目录 挂载卷,确保数据不随容器销毁而丢失。
    以上做法可显著提升环境一致性与可维护性,并便于后续扩展与升级。

二 方案一 Docker Compose快速部署

  • 目录与文件结构
    lnmp-docker/
    ├─ docker-compose.yml
    ├─ nginx/
    │  └─ conf.d/
    │     └─ default.conf
    ├─ wwwroot/
    │  └─ index.php
    └─ php/
       └─ Dockerfile
    
  • 核心配置
    • docker-compose.yml
      version: "3.8"
      services:
        nginx:
          image: nginx:latest
          container_name: nginx
          ports:
            - "80:80"
            - "443:443"
          volumes:
            - ./wwwroot:/var/www/html:ro
            - ./nginx/conf.d:/etc/nginx/conf.d:ro
            - ./logs/nginx:/var/log/nginx
          networks:
            - lnmp_net
          depends_on:
            - php
            - mysql
      
        php:
          build: ./php
          container_name: php
          volumes:
            - ./wwwroot:/var/www/html
            - ./php/conf.d:/usr/local/etc/php/conf.d
          networks:
            - lnmp_net
      
        mysql:
          image: mysql:8.0
          container_name: mysql
          environment:
            MYSQL_ROOT_PASSWORD: StrongRootPass!
            MYSQL_DATABASE: appdb
            MYSQL_USER: appuser
            MYSQL_PASSWORD: AppPass!23
          volumes:
            - ./mysql/data:/var/lib/mysql
          ports:
            - "3306:3306"
          networks:
            - lnmp_net
          healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u$$MYSQL_USER", "-p$$MYSQL_PASSWORD"]
            interval: 10s
            timeout: 5s
            retries: 5
      
      networks:
        lnmp_net:
          driver: bridge
      
    • php/Dockerfile(按需安装常用扩展)
      FROM php:8.2-fpm
      RUN docker-php-ext-install pdo_mysql mysqli \
          && docker-php-ext-enable opcache
      # 可选:安装 Composer
      # RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
      
    • 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$ {
              include fastcgi_params;
              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              fastcgi_pass php:9000;
          }
      
          location ~ /\.ht {
              deny all;
          }
      }
      
    • wwwroot/index.php(连通性自检)
      <?php
      phpinfo();
      
  • 启动与验证
    • 启动:docker-compose up -d --build
    • 查看日志:docker-compose logs -f
    • 访问测试:浏览器打开 http://服务器IP/ 应看到 PHP Info 页面
    • 数据库连通性:在容器内测试 docker-compose exec php mysql -h mysql -u appuser -pAppPass!23 appdb -e "select 1"
      该方案结构清晰、易于维护,适合开发、测试与生产的一致化交付。

三 方案二 多容器手工编排

  • 创建自定义网络
    • docker network create --subnet 172.16.10.0/24 lnmp_net
  • 启动 MySQL
    • docker run -d --name mysql --network lnmp_net -p 3306:3306 -e MYSQL_ROOT_PASSWORD=StrongRootPass! -e MYSQL_DATABASE=appdb -e MYSQL_USER=appuser -e MYSQL_PASSWORD=AppPass!23 -v ./mysql/data:/var/lib/mysql mysql:8.0
  • 启动 PHP-FPM
    • docker run -d --name php --network lnmp_net -v ./wwwroot:/var/www/html php:8.2-fpm
  • 启动 Nginx
    • docker run -d --name nginx --network lnmp_net -p 80:80 -p 443:443 -v ./wwwroot:/var/www/html:ro -v ./nginx/conf.d:/etc/nginx/conf.d:ro -v ./logs/nginx:/var/log/nginx nginx:latest
  • 配置要点
    • Nginx 的 fastcgi_pass 使用服务名 php:9000 进行容器间通信
    • 代码与日志目录均通过卷挂载,便于开发与排障
      该方式更直观地展示容器互联与卷挂载机制,适合理解底层原理与小规模部署。

四 常见问题与排查

  • Nginx 报 File not found
    • 确认 root 指向与容器内代码路径一致(如 /var/www/html
    • 确认 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 已设置
    • 确认 PHP-FPM 容器已运行且监听 9000
  • PHP 连接 MySQL 失败
    • 使用服务名 mysql 连接(而非 127.0.0.1),确保同网络
    • 检查用户名、密码、库名与授权主机(如 % 或容器网段)
    • 查看 MySQL 容器日志:docker logs mysql
  • 容器状态异常或频繁重启
    • 查看日志:docker logs <容器名>;检查卷权限与目录存在
    • 对 MySQL 增加健康检查与重启策略,提升稳定性
  • 升级与回滚
    • Docker Compose 中更新镜像标签并 docker-compose up -d 完成滚动更新
    • 使用 Docker Swarmdocker service update --image php:8.3-fpm php 实现蓝绿/金丝雀发布,异常可 rollback
      以上问题在生产中最常见,按服务名通信、正确设置 SCRIPT_FILENAME 与卷挂载通常即可解决。

0