Docker 版 LNMP + WordPress 完整搭建笔记

环境说明:

  • 宿主机 IP:192.168.7.7

  • 使用 Docker 网络:lnmp-net

  • 所有容器通过容器名互相通信


一、准备工作

1.1 拉取所需镜像

 docker pull nginx:1.24-alpine
 docker pull php:8.2-fpm-alpine
 docker pull mysql:8.0.39
 docker pull wordpress:6.4-php8.2-fpm-alpine

1.2 创建工作目录

 mkdir -p /mydata/lnmp/{nginx,php,www,mysql}
 cd /mydata/lnmp

1.3 创建 Docker 网络

 docker network create lnmp-net


二、搭建 MySQL 数据库

2.1 启动 MySQL 容器

 docker run -d \
   --name mysql \
   --restart always \
   --network lnmp-net \
   -p 3306:3306 \
   -v /mydata/lnmp/mysql:/var/lib/mysql \
   -e MYSQL_ROOT_PASSWORD=123456 \
   -e MYSQL_DATABASE=wordpress \
   -e MYSQL_USER=wpuser \
   -e MYSQL_PASSWORD=wppass \
   mysql:8.0.39 \
   --character-set-server=utf8mb4 \
   --collation-server=utf8mb4_unicode_ci \
   --default-authentication-plugin=mysql_native_password

2.2 验证 MySQL

 # 如果是首次启动,需要等待数据库初始化完成,可能需要 30-60 秒。
 docker exec -it mysql mysql -uroot -p123456 -e "SHOW DATABASES;"


三、搭建 PHP-FPM

3.1 创建 PHP 配置文件

 cat > /mydata/lnmp/php/php.ini <<'EOF'
 date.timezone = Asia/Shanghai
 upload_max_filesize = 64M
 post_max_size = 64M
 max_execution_time = 300
 memory_limit = 256M
 cgi.fix_pathinfo = 0
 EOF

3.3 启动 PHP-FPM 容器

 docker run -d \
   --name php-fpm \
   --restart always \
   --network lnmp-net \
   -v /mydata/lnmp/www:/var/www/html \
   -v /mydata/lnmp/php/php.ini:/usr/local/etc/php/conf.d/custom.ini \
   php:8.2-fpm-alpine

3.4 在 PHP 容器中安装必要的扩展

 # 进入 PHP 容器安装扩展
 docker exec -it php-fpm sh -c "docker-php-ext-install mysqli pdo_mysql"
 docker restart php-fpm


四、搭建 Nginx

4.1 创建 Nginx 配置文件

 cat > /mydata/lnmp/nginx/nginx.conf <<'EOF'
 user  nginx;
 worker_processes  auto;
 ​
 error_log  /var/log/nginx/error.log warn;
 pid        /var/run/nginx.pid;
 ​
 events {
     worker_connections  1024;
 }
 ​
 http {
     include       /etc/nginx/mime.types;
     default_type  application/octet-stream;
 ​
     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';
 ​
     access_log  /var/log/nginx/access.log  main;
 ​
     sendfile        on;
     tcp_nopush      on;
     tcp_nodelay     on;
     keepalive_timeout  65;
     client_max_body_size 64M;
 ​
     include /etc/nginx/conf.d/*.conf;
 }
 EOF

4.2 创建站点配置文件

 cat > /mydata/lnmp/nginx/default.conf <<'EOF'
 server {
     listen 80;
     server_name localhost;
     root /var/www/html;
     index index.php index.html index.htm;
 ​
     location / {
         try_files $uri $uri/ /index.php?$args;
     }
 ​
     location ~ \.php$ {
         fastcgi_pass php-fpm:9000;
         fastcgi_index index.php;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         include fastcgi_params;
     }
 ​
     location ~ /\.ht {
         deny all;
     }
 }
 EOF

4.3 启动 Nginx 容器

 docker run -d \
   --name nginx \
   --restart always \
   --network lnmp-net \
   -p 80:80 \
   -v /mydata/lnmp/www:/var/www/html \
   -v /mydata/lnmp/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
   -v /mydata/lnmp/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro \
   nginx:1.24-alpine


五、部署 WordPress

5.1 下载 WordPress

 cd /mydata/lnmp/www
 curl -o wordpress.tar.gz https://cn.wordpress.org/wordpress-6.4.3-zh_CN.tar.gz
 tar -xzf wordpress.tar.gz
 mv wordpress/* .
 rm -rf wordpress wordpress.tar.gz

5.2 设置目录权限

 chown -R 1000:1000 /mydata/lnmp/www
 chmod -R 755 /mydata/lnmp/www

5.3 创建 WordPress 配置文件

 cat > /mydata/lnmp/www/wp-config.php <<'EOF'
 <?php
 define('DB_NAME', 'wordpress');
 define('DB_USER', 'wpuser');
 define('DB_PASSWORD', 'wppass');
 define('DB_HOST', 'mysql:3306');
 define('DB_CHARSET', 'utf8mb4');
 define('DB_COLLATE', '');
 ​
 define('AUTH_KEY',         'put your unique phrase here');
 define('SECURE_AUTH_KEY',  'put your unique phrase here');
 define('LOGGED_IN_KEY',    'put your unique phrase here');
 define('NONCE_KEY',        'put your unique phrase here');
 define('AUTH_SALT',        'put your unique phrase here');
 define('SECURE_AUTH_SALT', 'put your unique phrase here');
 define('LOGGED_IN_SALT',   'put your unique phrase here');
 define('NONCE_SALT',       'put your unique phrase here');
 ​
 $table_prefix = 'wp_';
 ​
 define('WP_DEBUG', false);
 ​
 if ( ! defined('ABSPATH') ) {
     define('ABSPATH', __DIR__ . '/');
 }
 require_once ABSPATH . 'wp-settings.php';
 EOF


六、验证部署

6.1 检查所有容器状态

 docker ps | grep -E "nginx|php-fpm|mysql"

6.2 测试 PHP 解析

 echo "<?php phpinfo(); ?>" > /mydata/lnmp/www/info.php

访问 http://192.168.7.7/info.php,应看到 PHP 信息页面。

6.3 访问 WordPress 安装页面

访问 http://192.168.7.7,进入 WordPress 安装向导。


七、一键管理脚本

7.1 启动所有容器

 docker start mysql php-fpm nginx

7.2 停止所有容器

 docker stop nginx php-fpm mysql

7.3 重启所有容器

 docker restart mysql php-fpm nginx

7.4 删除所有容器(谨慎)

 docker rm -f nginx php-fpm mysql

7.5 查看容器日志

 docker logs -f nginx
 docker logs -f php-fpm
 docker logs -f mysql


八、常见问题及解决方案

Q1:Nginx 无法连接 PHP-FPM

原因:Nginx 和 PHP-FPM 不在同一网络。

解决:

 # 确认网络
 docker inspect nginx | grep NetworkMode
 docker inspect php-fpm | grep NetworkMode
 ​
 # 重新连接
 docker network connect lnmp-net nginx
 docker network connect lnmp-net php-fpm
 docker restart nginx php-fpm

Q2:WordPress 无法连接 MySQL

原因:MySQL 容器名解析失败或密码错误。

解决:

 # 测试 PHP 容器能否访问 MySQL
 docker exec -it php-fpm sh -c "nc -zv mysql 3306"
 ​
 # 或进入 PHP 容器测试 MySQL 连接
 docker exec -it php-fpm sh
 mysql -h mysql -uwpuser -pwppass -e "SHOW DATABASES;"

Q3:上传文件大小限制

解决:修改 /mydata/lnmp/php/php.ini 中的 upload_max_filesize 和 post_max_size,然后重启 PHP-FPM。

Q4:WordPress 权限错误

解决:

 # 修改网站目录所有者(PHP-FPM 容器中 www-data 用户 UID=1000)
 chown -R 1000:1000 /mydata/lnmp/www
 chmod -R 755 /mydata/lnmp/www


九、目录结构

 /mydata/lnmp/
 ├── mysql/
 │   └── ...                  # MySQL 数据文件
 ├── nginx/
 │   ├── nginx.conf           # Nginx 主配置文件
 │   └── default.conf         # 站点配置文件
 ├── php/
 │   └── php.ini              # PHP 配置文件
 └── www/
     ├── index.php            # WordPress 入口文件
     ├── wp-config.php        # WordPress 配置文件
     ├── wp-content/          # 主题、插件、上传文件
     ├── wp-admin/            # WordPress 管理后台
     └── wp-includes/         # WordPress 核心文件

十、各容器参数详解

容器

端口映射

挂载

网络

密码/账户

mysql

3306:3306

/mydata/lnmp/mysql:/var/lib/mysql

lnmp-net

root:123456

php-fpm

无(内部通信)

/mydata/lnmp/www:/var/www/html

lnmp-net

-

nginx

80:80

/mydata/lnmp/www:/var/www/html

lnmp-net

-