Docker 容器化部署 LNMP 环境的完整指南

前言

传统 LNMP(Linux + Nginx + MySQL + PHP)环境的部署过程,对许多新手站长来说是个不小的挑战。编译安装费时费力,apt/yum 安装又面临版本不一致的问题,更别说日后迁移服务器时需要重头再来。Docker 容器化部署可以完美解决这些痛点——环境隔离、一键部署、轻松迁移。

本文将手把手教你用 Docker Compose 搭建一个生产可用的 LNMP 环境,包含 Nginx、PHP 8.1、MySQL 8.0 以及 Redis 缓存服务。

一、准备工作

1.1 安装 Docker 和 Docker Compose

如果你是在全新服务器上操作,先安装 Docker:

# Ubuntu/Debian
curl -fsSL https://get.docker.com | bash -s docker
sudo usermod -aG docker $USER

# 安装 Docker Compose
sudo apt install docker-compose-plugin

# 验证安装
docker --version
docker compose version

1.2 项目目录结构

我们规划如下的目录结构:

~/lnmp-docker/
├── docker-compose.yml
├── nginx/
│   ├── conf.d/
│   │   └── default.conf
│   └── html/
│       └── wordpress/
├── php/
│   └── Dockerfile
├── mysql/
│   └── data/
└── redis/
    └── data/

二、编写 Docker Compose 配置

2.1 docker-compose.yml

version: '3.8'

services:
  nginx:
    image: nginx:stable-alpine
    container_name: lnmp-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/html:/var/www/html
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - php
    networks:
      - lnmp
    restart: always

  php:
    build: ./php
    container_name: lnmp-php
    volumes:
      - ./nginx/html:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/php.ini:ro
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_started
    networks:
      - lnmp
    restart: always

  mysql:
    image: mysql:8.0
    container_name: lnmp-mysql
    ports:
      - "127.0.0.1:3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: your_wp_password
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - lnmp
    restart: always

  redis:
    image: redis:7-alpine
    container_name: lnmp-redis
    volumes:
      - ./redis/data:/data
    networks:
      - lnmp
    restart: always

networks:
  lnmp:
    driver: bridge

2.2 PHP Dockerfile

FROM php:8.1-fpm-alpine

RUN apk add --no-cache     libzip-dev libpng-dev libjpeg-turbo-dev     freetype-dev oniguruma-dev libxml2-dev curl-dev

RUN docker-php-ext-install     pdo_mysql mysqli zip gd mbstring exif bcmath opcache

RUN pecl install redis && docker-php-ext-enable redis

WORKDIR /var/www/html

三、Nginx 站点配置

nginx/conf.d/default.conf 中编写站点配置:

server {
    listen 80;
    server_name yourdomain.com;
    root /var/www/html/wordpress;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

四、启动与验证

cd ~/lnmp-docker
docker compose up -d
docker compose ps
docker compose logs -f

五、生产环境注意事项

  1. 安全加固:MySQL 端口不要暴露到公网,使用 127.0.0.1:3306:3306 绑定本地回环地址
  2. 日志管理:配置 Docker 的 log rotate 策略,避免日志文件撑爆磁盘
  3. 备份策略:数据库文件映射到宿主机目录,定期使用 mysqldump 执行逻辑备份
  4. 镜像版本锁定:生产环境建议使用具体版本号而非 latest 标签
  5. 资源限制:在 docker-compose.yml 中为每个服务设置 CPU 和内存限制

六、迁移到新服务器

Docker 部署的最大优势在于迁移极其简单:把整个 ~/lnmp-docker/ 目录打包,传到新服务器,执行 docker compose up -d 即可恢复完整的运行环境。数据库文件因为做了数据卷映射,迁移后不会丢失数据。

相比传统 LNMP 一键安装包(如 LNMP.org)需要重装配置,Docker 方案在可维护性和可重现性上有着质的提升。

七、总结

Docker 容器化不是锦上添花,而是现代网站部署的基础技能。对于个人站长来说,掌握 Docker Compose 搭建 LNMP 环境不仅节约时间,更重要的是让服务器管理变得可预期、可重现。即使你遭遇服务器故障,也可以在一台新机器上迅速重建整个环境,恢复服务时间从天级别缩短到分钟级别。

Last modification:July 31st, 2026 at 08:15 am

Leave a Comment