Docker Compose安装WordPress配置

你提到的 文件权限问题 确实可能影响 WordPress 的正常运行,尤其是在 Docker 环境下,Nginx/PHP-FPM 需要对 WordPress 目录有正确的读写权限。以下是详细排查和解决方案:


1. 检查当前文件权限

进入 WordPress 容器,查看 /var/www/html 的权限:

1
docker-compose exec wordpress ls -la /var/www/html

正常情况 应显示:

  • WordPress 核心文件由 rootwww-data 用户拥有。
  • wp-content/uploads 等目录应由 www-data(PHP-FPM 用户)拥有,权限为 755775

2. 常见文件权限问题及修复

问题 1:PHP-FPM(www-data)无法写入文件

错误现象

  • WordPress 无法安装插件/主题。
  • 上传媒体文件时提示“无法创建目录”。
  • 日志中出现 Permission denied

解决方案

1
2
3
4
5
6
7
8
9
# 进入容器
docker-compose exec wordpress bash

# 修改 wp-content 权限(确保 PHP-FPM 可写)
chown -R www-data:www-data /var/www/html/wp-content
chmod -R 775 /var/www/html/wp-content

# 如果使用自定义插件/主题目录(如挂载的 ./wp-content):
chown -R 33:33 ./wp-content # 33 是 www-data 的用户ID

问题 2:Nginx 无法读取文件

错误现象

  • 访问页面返回 403 Forbidden
  • 静态资源(如图片/CSS)加载失败。

解决方案

1
2
docker-compose exec wordpress bash
chmod -R 755 /var/www/html # 确保 Nginx 有读取权限

问题 3:文件所有者错误

如果挂载了本地目录(如 ./wp-content:/var/www/html/wp-content),宿主机用户可能与容器内 www-data 用户冲突。
修复方法

1
2
# 在宿主机执行(确保容器内 www-data 可访问)
sudo chown -R 33:33 ./wp-content # 33 是容器内 www-data 的 UID

3. 预防性配置(在 docker-compose.yml 中修复)

通过设置正确的用户权限避免问题:

1
2
3
4
5
6
7
services:
wordpress:
image: richarvey/nginx-php-fpm
user: "33:33" # 强制以 www-data 用户运行
volumes:
- wordpress_data:/var/www/html
- ./wp-content:/var/www/html/wp-content # 确保宿主机目录 UID 33

4. 验证权限是否生效

1
2
3
4
5
# 检查 PHP-FPM 进程用户
docker-compose exec wordpress ps aux | grep php-fpm

# 检查文件所有者
docker-compose exec wordpress ls -la /var/www/html/wp-content

正确输出

1
2
www-data www-data  # 文件所有者
drwxr-xr-x # 目录权限

5. 高级调试

如果问题仍然存在:

  1. 检查 PHP-FPM 日志
    1
    docker-compose logs wordpress | grep "Permission denied"
  2. 临时提升权限测试
    1
    docker-compose exec wordpress chmod -R 777 /var/www/html  # 仅用于测试,完成后改回安全权限

总结:关键权限设置

目录/文件 推荐权限 所属用户
/var/www/html 755 root
wp-content 775 www-data
wp-content/uploads 777 www-data
wp-config.php 644 root

完成调整后,重启容器:

1
docker-compose restart wordpress

时间: 2025-05-13T22:15:39


👤 用户

docker中使用richarvey/nginx-php-fpm 和mysql 安装wordpress 这么写compose

时间: 2025-05-13T21:34:01


🤖 DeepSeek (deepseek-chat)

以下是一个使用 richarvey/nginx-php-fpm 和 MySQL 安装 WordPress 的 Docker Compose 文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
version: '3'

services:
# MySQL 服务
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
networks:
- wp-network

# WordPress 服务 (Nginx + PHP-FPM)
wordpress:
image: richarvey/nginx-php-fpm:latest
depends_on:
- db
volumes:
- wordpress_data:/var/www/html
ports:
- "80:80"
- "443:443"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
networks:
- wp-network

# 定义网络和卷
volumes:
db_data:
wordpress_data:

networks:
wp-network:
driver: bridge

使用说明:

  1. 将上述内容保存为 docker-compose.yml 文件

  2. 根据需要修改以下环境变量:

    • MYSQL_ROOT_PASSWORD:MySQL root 用户密码
    • MYSQL_USERMYSQL_PASSWORD:WordPress 数据库用户凭据
    • WORDPRESS_DB_* 系列变量应与 MySQL 设置匹配
  3. 启动服务:

    1
    docker-compose up -d
  4. 访问 WordPress:

    • 打开浏览器访问 http://localhost 或你的服务器 IP

注意事项:

  1. richarvey/nginx-php-fpm 镜像已经配置好了 Nginx 和 PHP-FPM,但默认可能没有 WordPress。它会自动从 WordPress.org 下载最新版本。

  2. 如果你想使用自己的 WordPress 代码或主题/插件,可以挂载额外的卷:

    1
    2
    volumes:
    - ./wp-content:/var/www/html/wp-content
  3. 对于生产环境,建议:

    • 使用更安全的密码
    • 添加 SSL 证书(richarvey/nginx-php-fpm 支持 Let’s Encrypt)
    • 考虑使用 MySQL 8.0 或 MariaDB
  4. 如果需要自定义 Nginx 配置,可以创建一个配置文件并挂载:

    1
    2
    volumes:
    - ./nginx.conf:/etc/nginx/conf.d/default.conf

这个配置应该能让你快速启动一个 WordPress 站点。根据你的具体需求,可能还需要进行其他调整。

时间: 2025-05-13T21:34:01


👤 用户

docker-compose 安装

时间: 2025-05-13T21:48:25


🤖 DeepSeek (deepseek-chat)

以下是使用 docker-compose 安装 WordPress(基于 richarvey/nginx-php-fpm + MySQL)的完整步骤:


1. 创建 docker-compose.yml 文件

将以下内容保存为 docker-compose.yml(可根据需求调整参数):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
version: '3.8'

services:
# MySQL 数据库
db:
image: mysql:5.7
container_name: wp_db
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_mysql_root_password # 替换为你的密码
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
networks:
- wp_network

# WordPress (Nginx + PHP-FPM)
wordpress:
image: richarvey/nginx-php-fpm:latest
container_name: wp_web
depends_on:
- db
volumes:
- wordpress_data:/var/www/html
- ./wp-content:/var/www/html/wp-content # 可选:挂载自定义主题/插件
ports:
- "80:80"
-

**时间**: `2025-05-13T21:48:25`

---


## 👤 **用户**

如何安装docker-compose

**时间**: `2025-05-13T21:48:43`

---


## 🤖 **DeepSeek (deepseek-chat)**

要在 Linux 系统上安装 `docker-compose`,您可以按照以下步骤操作。这里提供 **官方推荐方法**(适用于大多数 Linux 发行版,如 Ubuntu/Debian/CentOS 等):

---

### 方法 1:直接从 GitHub 下载二进制文件(推荐)
#### 1. 确保已安装 Docker
```bash
sudo docker --version # 检查 Docker 是否已安装

如果未安装 Docker,请先安装:

1
2
3
4
5
# Ubuntu/Debian
sudo apt update && sudo apt install docker.io

# CentOS/RHEL
sudo yum install docker

2. 下载并安装 docker-compose

1
2
3
4
5
6
7
8
# 下载最新稳定版(替换为 GitHub 上的最新版本号)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋予可执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version # 应输出类似:Docker Compose version v2.24.5

方法 2:通过包管理器安装(可能版本较旧)

Ubuntu/Debian

1
2
3
sudo apt update
sudo apt install docker-compose-plugin # Docker 官方推荐的新插件
docker compose version # 注意:新版本命令是 `docker compose`(不带横线)

CentOS/RHEL

1
2
sudo yum install docker-compose-plugin
docker compose version

常见问题解决

  1. 权限问题:如果提示 Permission denied,请将用户加入 docker 组:

    1
    2
    sudo usermod -aG docker $USER
    newgrp docker # 刷新组权限
  2. 命令不存在:如果 docker-compose 不可用,尝试使用新版本命令:

    1
    docker compose version  # 注意中间没有横线
  3. 下载速度慢:可以使用国内镜像加速:

    1
    curl -L https://get.daocloud.io/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

验证安装

运行以下命令检查是否成功:

1
2
3
docker-compose --version  # 旧版本
# 或
docker compose version # 新版本(推荐)

输出应类似:

1
Docker Compose version v2.24.5

现在您可以正常使用 docker-compose up 等命令了!

时间: 2025-05-13T21:48:43


👤 用户

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “NOTICE: PHP message: PHP Fatal error: Uncaught mysqli_sql_exception: Access denied for user ‘wordpress‘@’172.21.0.3’ (using password: YES) in /var/www/html/wp-includes/wp-db.php:1493”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “Stack trace:”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “#0 /var/www/html/wp-includes/wp-db.php(1493): mysqli_real_connect(Object(mysqli), ‘db’, ‘wordpress’, Object(SensitiveParameterValue), NULL, 3306, NULL, 0)”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “#1 /var/www/html/wp-includes/wp-db.php(649): wpdb->db_connect()”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “#2 /var/www/html/wp-includes/load.php(352): wpdb->__construct(‘wordpress’, ‘your_root_passw…’, ‘wordpress’, ‘db:3306’)”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “#3 /var/www/html/wp-settings.php(79): require_wp_db()”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “#4 /var/www/html/wp-config.php(80): require_once(‘/var/www/html/w…’)”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “#5 /var/www/html/wp-load.php(29): require_once(‘/var/www/html/w…’)”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “#6 /var/www/html/wp-blog-header.php(12): require_once(‘/var/www/html/w…’)”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “#7 /var/www/html/index.php(17): require(‘/var/www/html/w…’)”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “#8 {main}”

[13-May-2025 14:04:00] WARNING: [pool www] child 19 said into stderr: “ thrown in /var/www/html/wp-includes/wp-db.php on line 1493”

192.168.2.191 - - [13/May/2025:14:04:00 +0000] “GET / HTTP/1.1” 500 5 “-“ “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36”

时间: 2025-05-13T22:04:29


🤖 DeepSeek (deepseek-chat)

这个错误表明 WordPress 无法连接到 MySQL 数据库,原因是数据库访问被拒绝(Access denied for user 'wordpress')。以下是完整的解决方案:


错误原因

  1. 数据库凭据不匹配docker-compose.yml 中配置的 MySQL 用户名/密码与 WordPress 使用的凭据不一致
  2. 权限未正确设置:MySQL 用户 wordpress 可能没有访问 wordpress 数据库的权限
  3. 环境变量未生效:WordPress 容器未正确读取数据库配置

解决方案

1. 修改 docker-compose.yml(确保数据库配置一致)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3.8'

services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: your_secure_root_password # 必须修改!
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress_password # 必须修改!
volumes:
- db_data:/var/lib/mysql

wordpress:
image: richarvey/nginx-php-fpm
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress # 必须与 db 服务的 MYSQL_USER 一致
WORDPRESS_DB_PASSWORD: wordpress_password # 必须与 db 服务的 MYSQL_PASSWORD 一致
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
ports:
- "80:80"
volumes:
- wordpress_data:/var/www/html

volumes:
db_data:
wordpress_data:

2. 清理并重建服务

1
2
3
4
5
6
7
8
# 停止并删除旧容器
docker-compose down

# 删除旧数据(谨慎操作!这会清除现有数据库)
docker volume rm your_project_name_db_data

# 重新启动
docker-compose up -d

3. 验证数据库连接

1
2
3
4
5
6
7
# 进入 MySQL 容器
docker-compose exec db mysql -uwordpress -p

# 输入密码后执行
SHOW DATABASES;
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%';
FLUSH PRIVILEGES;

其他排查方法

检查环境变量是否生效

1
docker-compose exec wordpress env | grep WORDPRESS

应显示正确的数据库配置。

手动测试数据库连接

1
2
3
docker-compose exec wordpress bash
# 在容器内执行:
mysql -hdb -uwordpress -pwordpress_password wordpress

检查 MySQL 日志

1
docker-compose logs db | grep -i "access denied"

关键注意事项

  1. 密码安全:不要使用示例中的简单密码,生产环境应使用强密码
  2. 网络配置:确保两个容器在同一个 Docker 网络(默认会自动创建)
  3. 数据持久化volumes 配置确保数据不会丢失

如果问题仍然存在,可能是 WordPress 容器自动生成的 wp-config.php 文件缓存了旧配置,可以手动删除后重建:

1
2
docker-compose exec wordpress rm /var/www/html/wp-config.php
docker-compose restart wordpress

时间: 2025-05-13T22:04:29


👤 用户

会不会是权限的问题?

时间: 2025-05-13T22:14:37


🤖 DeepSeek (deepseek-chat)

是的,这个错误 很可能与 MySQL 用户权限有关。从错误日志 Access denied for user 'wordpress'@'172.21.0.3' 可以看出,虽然用户名和密码正确,但该用户可能没有从 WordPress 容器 IP(172.21.0.3)访问数据库的权限。


根本原因分析

MySQL 默认会限制用户从特定主机连接。即使你在 docker-compose.yml 中正确配置了用户名和密码,如果 MySQL 没有授权该用户从容器网络访问,也会触发权限错误。


解决方案(修复权限问题)

方法 1:在 MySQL 中手动授权(推荐)

  1. 进入 MySQL 容器

    1
    docker-compose exec db mysql -uroot -p

    (输入 MYSQL_ROOT_PASSWORD 中设置的密码)

  2. 执行以下 SQL 命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -- 检查用户权限
    SELECT Host, User FROM mysql.user;

    -- 授权用户从任意主机访问(适用于 Docker 内部网络)
    GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%' IDENTIFIED BY 'wordpress_password';

    -- 刷新权限
    FLUSH PRIVILEGES;

    -- 验证权限
    SHOW GRANTS FOR 'wordpress'@'%';

    关键点

    • 'wordpress'@'%' 中的 % 表示允许从任何主机连接(在 Docker 网络内安全)。
    • 确保密码与 docker-compose.yml 中的 MYSQL_PASSWORD 一致。
  3. 退出 MySQL

    1
    EXIT;
  4. 重启 WordPress 容器

    1
    docker-compose restart wordpress

方法 2:通过环境变量自动初始化权限(更优雅)

修改 docker-compose.yml,让 MySQL 容器启动时自动配置权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress_password
# 关键添加:允许 root 和 wordpress 用户从任意主机连接
MYSQL_ROOT_HOST: '%'
MYSQL_HOST: '%'
command:
- --default-authentication-plugin=mysql_native_password
- --bind-address=0.0.0.0
volumes:
- db_data:/var/lib/mysql

说明

  • MYSQL_ROOT_HOST: '%' 允许 root 用户从任意主机连接。
  • command 部分确保 MySQL 监听所有网络接口。

方法 3:检查 WordPress 的 wp-config.php

如果 WordPress 已经生成了配置文件,但数据库凭据不正确:

  1. 进入 WordPress 容器:
    1
    docker-compose exec wordpress bash
  2. 编辑或删除 wp-config.php
    1
    rm /var/www/html/wp-config.php
  3. 重启容器,让 WordPress 重新生成配置文件:
    1
    docker-compose restart wordpress

验证权限是否修复

  1. 检查 MySQL 用户权限

    1
    docker-compose exec db mysql -uroot -p -e "SHOW GRANTS FOR 'wordpress'@'%';"

    输出应包含:

    1
    GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpress'@'%'
  2. 测试数据库连接

    1
    2
    docker-compose exec wordpress bash
    mysql -hdb -uwordpress -pwordpress_password wordpress

    如果成功进入 MySQL 命令行,说明权限已正确配置。


总结

问题类型 解决方案
用户权限不足 运行 GRANT ALL PRIVILEGES 授权
MySQL 未允许远程连接 修改 docker-compose.yml 添加 MYSQL_ROOT_HOSTcommand
WordPress 缓存旧配置 删除 wp-config.php 并重启容器

完成以上步骤后,WordPress 应该能正常连接到数据库。如果仍有问题,请检查防火墙或 Docker 网络配置。

时间: 2025-05-13T22:14:37


👤 用户

我是说文件权限的问题。

时间: 2025-05-13T22:15:39


🤖 DeepSeek (deepseek-chat)

你提到的 文件权限问题 确实可能影响 WordPress 的正常运行,尤其是在 Docker 环境下,Nginx/PHP-FPM 需要对 WordPress 目录有正确的读写权限。以下是详细排查和解决方案:


1. 检查当前文件权限

进入 WordPress 容器,查看 /var/www/html 的权限:

1
docker-compose exec wordpress ls -la /var/www/html

正常情况 应显示:

  • WordPress 核心文件由 rootwww-data 用户拥有。
  • wp-content/uploads 等目录应由 www-data(PHP-FPM 用户)拥有,权限为 755775

2. 常见文件权限问题及修复

问题 1:PHP-FPM(www-data)无法写入文件

错误现象

  • WordPress 无法安装插件/主题。
  • 上传媒体文件时提示“无法创建目录”。
  • 日志中出现 Permission denied

解决方案

1
2
3
4
5
6
7
8
9
# 进入容器
docker-compose exec wordpress bash

# 修改 wp-content 权限(确保 PHP-FPM 可写)
chown -R www-data:www-data /var/www/html/wp-content
chmod -R 775 /var/www/html/wp-content

# 如果使用自定义插件/主题目录(如挂载的 ./wp-content):
chown -R 33:33 ./wp-content # 33 是 www-data 的用户ID

问题 2:Nginx 无法读取文件

错误现象

  • 访问页面返回 403 Forbidden
  • 静态资源(如图片/CSS)加载失败。

解决方案

1
2
docker-compose exec wordpress bash
chmod -R 755 /var/www/html # 确保 Nginx 有读取权限

问题 3:文件所有者错误

如果挂载了本地目录(如 ./wp-content:/var/www/html/wp-content),宿主机用户可能与容器内 www-data 用户冲突。
修复方法

1
2
# 在宿主机执行(确保容器内 www-data 可访问)
sudo chown -R 33:33 ./wp-content # 33 是容器内 www-data 的 UID

3. 预防性配置(在 docker-compose.yml 中修复)

通过设置正确的用户权限避免问题:

1
2
3
4
5
6
7
services:
wordpress:
image: richarvey/nginx-php-fpm
user: "33:33" # 强制以 www-data 用户运行
volumes:
- wordpress_data:/var/www/html
- ./wp-content:/var/www/html/wp-content # 确保宿主机目录 UID 33

4. 验证权限是否生效

1
2
3
4
5
# 检查 PHP-FPM 进程用户
docker-compose exec wordpress ps aux | grep php-fpm

# 检查文件所有者
docker-compose exec wordpress ls -la /var/www/html/wp-content

正确输出

1
2
www-data www-data  # 文件所有者
drwxr-xr-x # 目录权限

5. 高级调试

如果问题仍然存在:

  1. 检查 PHP-FPM 日志
    1
    docker-compose logs wordpress | grep "Permission denied"
  2. 临时提升权限测试
    1
    docker-compose exec wordpress chmod -R 777 /var/www/html  # 仅用于测试,完成后改回安全权限

总结:关键权限设置

目录/文件 推荐权限 所属用户
/var/www/html 755 root
wp-content 775 www-data
wp-content/uploads 777 www-data
wp-config.php 644 root

完成调整后,重启容器:

1
docker-compose restart wordpress

时间: 2025-05-13T22:15:39



对话统计

  • 消息总数: 12 条
  • 处理状态: 成功转换