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-alpine1.2 创建工作目录
mkdir -p /mydata/lnmp/{nginx,php,www,mysql}
cd /mydata/lnmp1.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_password2.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
EOF3.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-alpine3.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;
}
EOF4.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;
}
}
EOF4.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.gz5.2 设置目录权限
chown -R 1000:1000 /mydata/lnmp/www
chmod -R 755 /mydata/lnmp/www5.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 nginx7.2 停止所有容器
docker stop nginx php-fpm mysql7.3 重启所有容器
docker restart mysql php-fpm nginx7.4 删除所有容器(谨慎)
docker rm -f nginx php-fpm mysql7.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-fpmQ2: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 核心文件十、各容器参数详解
原创
Docker 版 LNMP + WordPress
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法