在Alpine 搭建 WordPress

在 Alpine 容器中手动搭建 WordPress 全攻略(小白友好版 + 带序号架构流程图)

这篇指南专为刚接触 Docker 和 Linux 的小白 设计。我们会逐词逐句解释每条命令是干什么的、为什么要这样写,并用生动的比喻帮助你理解。我们还加入了带步骤序号的架构流程图和实现原理,让你彻底明白 WordPress 是如何在容器中跑起来的。跟着操作,你就能在自己的电脑/服务器上跑起一个属于自己的 WordPress 网站!


🧭 整体架构与请求流程(带步骤序号)

下面这张图清晰地标出了从用户浏览器到容器内各组件的完整请求步骤 (数字序号表示先后顺序):

📌 步骤说明

步骤 动作 说明
1 用户浏览器 → 宿主机 :8080 用户在地址栏输入 http://服务器IP:8080
2 宿主机 → 容器 :80 Docker 的端口映射把请求转发到容器内部的 80 端口
3a Nginx → 静态文件 如果请求的是图片、CSS 等静态资源,Nginx 直接读取文件并返回
3b Nginx → PHP-FPM 如果请求的是 .php 文件(比如 index.php),Nginx 把请求转给 PHP-FPM 处理
4 PHP-FPM → MariaDB WordPress 执行过程中需要读取或保存数据(文章、用户等),PHP 连接数据库
5 MariaDB → PHP-FPM 数据库返回查询结果(比如文章列表)
6 PHP-FPM → Nginx PHP 执行完毕,生成完整的 HTML 页面,返回给 Nginx
7 容器 → 宿主机 Nginx 把响应发送回 Docker 宿主机
8 宿主机 → 用户浏览器 宿主机把响应返回给用户的浏览器,用户看到完整的 WordPress 页面

💡 核心流程总结

用户 → 宿主机 → 容器 → Nginx → (如果是 PHP) → PHP-FPM → 数据库 → PHP-FPM → Nginx → 宿主机 → 用户。

静态文件请求则跳过 PHP-FPM 和数据库,由 Nginx 直接返回。


📦 第一部分:准备工作 ------ 安装 Docker

什么是 Docker?

Docker 就像是一个"集装箱系统"。你可以把网站、数据库、应用程序全部装进一个独立的"集装箱"(容器)里,这个箱子可以在任何安装有 Docker 的电脑上运行,不用担心环境不一致的问题。

在 openEuler 24.03 上安装 Docker

打开你的终端(如果是 Windows 请使用 WSL2 或 PowerShell,但本指南基于 Linux)。一条一条复制下面的命令,按回车执行。

bash 复制代码
# 1. 更新系统软件包列表(让系统知道有哪些新软件可用)
sudo dnf update -y
  • sudo:以管理员(root)身份执行,因为安装软件需要权限。
  • dnf:openEuler 使用的软件包管理器,类似手机上的"应用商店"。
  • update:刷新软件列表。
  • -y:自动回答"yes",不用手动确认。
bash 复制代码
# 2. 安装一些必要的工具,帮助 Docker 正常安装
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
  • yum-utils:提供一些管理软件仓库的工具。
  • device-mapper-persistent-datalvm2:Docker 存储数据需要用到的底层驱动。
bash 复制代码
# 3. 添加 Docker 官方软件源(告诉系统去哪里下载 Docker)
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • yum-config-manager:管理软件源配置。
  • --add-repo:添加一个新的软件源地址。
bash 复制代码
# 4. 修正软件源中的版本号(因为 openEuler 兼容 CentOS 8)
sudo sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
  • sed:一个文本替换工具。
  • -i:直接修改文件内容。
  • s/旧/新/g:把文件里所有的 $releasever 替换成 8,确保能正确下载。
bash 复制代码
# 5. 正式安装 Docker
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  • docker-ce:Docker 社区版(免费)。
  • docker-ce-cli:Docker 命令行工具。
  • containerd.io:容器运行时。
  • docker-compose-plugin:用于管理多个容器的工具(稍后会用到)。
bash 复制代码
# 6. 启动 Docker 服务
sudo systemctl start docker
  • systemctl:管理系统服务的命令。
  • start docker:让 Docker 后台进程运行起来。
bash 复制代码
# 7. 设置 Docker 开机自动启动(免得每次重启电脑都要手动启动)
sudo systemctl enable docker
bash 复制代码
# 8. 验证 Docker 是否安装成功
sudo docker run hello-world
  • docker run:运行一个容器。
  • hello-world:一个测试镜像。如果看到一段欢迎文字,说明 Docker 正常工作。

至此,你已经拥有了 Docker 这个"集装箱码头",可以开始装货了!


🚀 第二部分:启动一个 Alpine 容器并进入它的"内部世界"

什么是 Alpine?

Alpine 是一个极其轻量级的 Linux 发行版,整个系统只有 5MB 左右。它就像一个小小的"毛坯房",非常适合用来自己搭建环境。

bash 复制代码
docker run -it --name my-wordpress alpine:latest /bin/sh
  • docker run:创建并启动一个新容器。
  • -it:两个参数的合体:
    • -i(interactive):保持输入流打开,让你可以敲命令。
    • -t(tty):分配一个虚拟终端,让你看到输出。
    • 合起来就是"交互式终端"。
  • --name my-wordpress:给这个容器起个名字叫 my-wordpress,方便后续管理。
  • alpine:latest:使用 Alpine 的最新版本镜像。: 后面是标签(tag),latest 表示最新版。
  • /bin/sh:容器启动后执行的第一个程序。/bin/sh 是一个 shell(命令解释器),让你可以输入命令。

执行后,你的命令行提示符会变成 / #,说明你已经进入容器内部了。你可以把它想象成 ssh 进了一台全新的微型服务器。


🧰 第三部分:安装 WordPress 需要的软件包

现在我们在容器内部(提示符是 / #),需要安装:

  • Nginx:Web 服务器,负责接收浏览器请求并返回网页。
  • PHP:动态脚本语言,WordPress 就是用 PHP 写的。
  • MariaDB:数据库,存储文章、用户、评论等数据。
  • wget、unzip:下载和解压工具。
bash 复制代码
# 1. 更新 Alpine 的软件包列表(相当于刷新应用商店)
apk update
  • apk:Alpine 的软件包管理器,类似 Ubuntu 的 apt
bash 复制代码
# 2. 安装所有需要的软件(一行命令搞定)
apk add --no-cache nginx php83 php83-fpm php83-mysqli php83-session php83-json \
    php83-mbstring php83-tokenizer php83-gd php83-curl php83-xml \
    mariadb mariadb-client wget unzip
  • apk add:安装软件包。
  • --no-cache:不缓存下载的包,减小镜像体积。
  • nginx:Web 服务器。
  • php83:PHP 8.3 的核心。
  • php83-fpm:PHP FastCGI 进程管理器,负责处理 PHP 脚本。
  • php83-mysqli:让 PHP 能连接 MySQL/MariaDB 数据库。
  • php83-sessionphp83-json 等:各种 PHP 扩展。
  • mariadb:数据库服务器。
  • mariadb-client:数据库客户端工具(比如 mysql 命令)。
  • wget:从网络下载文件的工具。
  • unzip:解压 ZIP 文件。

💡 为什么用 php83 而不是 php82?

因为 Alpine v3.23 仓库里提供的是 PHP 8.3,包名以 php83 开头。


🗄️ 第四部分:初始化数据库(建仓库和账房先生)

数据库就像一个大仓库,WordPress 的文章、用户等都存在里面。我们需要先建好仓库,再给 WordPress 分配一个专用账户。

bash 复制代码
# 1. 创建 MySQL 运行时需要的目录(存放进程 ID 和 socket 文件)
mkdir -p /run/mysqld
  • mkdir -p:创建目录,-p 表示如果父目录不存在就一起创建。
bash 复制代码
# 2. 把这个目录的所有权交给 mysql 用户
chown mysql:mysql /run/mysqld
  • chown:修改文件/目录的所有者。格式:chown 用户:组 目标
bash 复制代码
# 3. 初始化数据库文件(建立系统表)
mysql_install_db --user=mysql --datadir=/var/lib/mysql
  • mysql_install_db:初始化 MariaDB 的数据目录。
  • --user=mysql:用 mysql 用户身份运行。
  • --datadir:指定数据存储目录。
bash 复制代码
# 4. 以后台模式启动 MariaDB
mysqld_safe --user=mysql &
  • mysqld_safe:一个启动脚本,会自动重启崩溃的数据库。
  • &:把这个命令放到后台运行,不阻塞当前终端。
bash 复制代码
# 5. 等待 3 秒,让数据库完全启动
sleep 3
bash 复制代码
# 6. 设置数据库超级用户 root 的密码(这里用 example,正式环境必须改!)
mysqladmin -u root password 'example'
  • mysqladmin:数据库管理工具。
  • -u root:指定 root 用户。
  • password 'example':把密码设为 example。
bash 复制代码
# 7. 创建一个名叫 wordpress 的数据库,以及一个用户 wpuser,并授权
mysql -u root -p'example' <<EOF
CREATE DATABASE wordpress;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'wppass';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EOF
  • mysql -u root -p'example':用 root 身份登录数据库。
  • <<EOF ... EOF:这是一个"内联输入"的写法,把中间的多行命令直接传给 mysql。
  • CREATE DATABASE wordpress;:创建数据库。
  • CREATE USER ...:创建用户并设置密码。
  • GRANT ALL PRIVILEGES ...:让该用户拥有 wordpress 数据库的所有权限。
  • FLUSH PRIVILEGES;:刷新权限表,使改动生效。

🎯 结果 :现在数据库里有一个空数据库叫 wordpress,用户 wpuser 密码 wppass 可以访问它。


📥 第五部分:下载并配置 WordPress

bash 复制代码
# 1. 创建网站根目录(所有网页文件放在这里)
mkdir -p /var/www/localhost
cd /var/www/localhost
  • /var/www 是传统的网站目录。
  • localhost 表示本机站点。
bash 复制代码
# 2. 下载 WordPress 最新版压缩包
wget https://wordpress.org/latest.zip

如果下载很慢,可以换成国内镜像:wget https://cn.wordpress.org/latest.zip

bash 复制代码
# 3. 解压
unzip latest.zip
bash 复制代码
# 4. 删除压缩包,节省空间
rm latest.zip
bash 复制代码
# 5. 修改文件夹所有者,让 nginx 用户可以读取和写入
chown -R nginx:nginx wordpress
  • -R:递归,包括子目录和文件。
  • nginx:nginx:用户和组都是 nginx。
bash 复制代码
# 6. 进入 WordPress 目录
cd wordpress
bash 复制代码
# 7. 复制默认配置文件
cp wp-config-sample.php wp-config.php
bash 复制代码
# 8. 修改配置文件里的数据库连接信息(用 sed 命令替换文本)
sed -i "s/database_name_here/wordpress/" wp-config.php
sed -i "s/username_here/wpuser/" wp-config.php
sed -i "s/password_here/wppass/" wp-config.php
sed -i "s/localhost/localhost/" wp-config.php
  • sed -i "s/旧/新/":把文件中第一个出现的"旧"替换成"新"。
  • 这四个命令分别替换了:数据库名、用户名、密码、主机地址。
bash 复制代码
# 9. (可选)添加安全密钥,增强 cookie 安全
apk add curl   # 如果之前没装 curl,先安装
curl -s https://api.wordpress.org/secret-key/1.1/salt/ >> wp-config.php
  • curl -s:静默下载文件内容。
  • >>:把输出追加到文件末尾。

⚙️ 第六部分:配置 Nginx 和 PHP-FPM

什么是 Nginx 配置?

Nginx 是一个"门卫",当浏览器请求 http://你的网站 时,Nginx 决定:

  • 如果是图片、CSS 等静态文件,直接返回。
  • 如果是 PHP 文件(如 index.php),则转交给 PHP-FPM 处理。
bash 复制代码
# 1. 用 cat 命令创建一个配置文件(覆盖默认的)
cat > /etc/nginx/http.d/default.conf <<'EOF'
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /var/www/localhost/wordpress;
    index index.php index.html;

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

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}
EOF
  • cat > 文件 <<'EOF' ... EOF:把中间的内容写入文件。
  • server { ... }:定义一个虚拟主机。
  • listen 80:监听 80 端口(HTTP 默认端口)。
  • root:网站文件的根目录。
  • index:默认首页文件,先找 index.php,再找 index.html
  • location /:处理所有根路径的请求。
  • try_files:尝试按顺序查找文件,如果找不到就重写到 index.php(这是 WordPress 伪静态规则)。
  • location ~ \.php$:匹配以 .php 结尾的请求。
  • fastcgi_pass 127.0.0.1:9000:把 PHP 请求转发给本机 9000 端口(PHP-FPM 监听的地址)。
  • include fastcgi.conf:包含一些标准参数。
bash 复制代码
# 2. 修改 PHP-FPM 的配置,让它监听 9000 端口,并让进程用户改为 nginx
sed -i 's/^listen = 127.0.0.1:9000/; listen = 127.0.0.1:9000/' /etc/php83/php-fpm.d/www.conf
echo "listen = 127.0.0.1:9000" >> /etc/php83/php-fpm.d/www.conf
  • 第一句:把原来的 listen = 127.0.0.1:9000 注释掉(在行首加 ;)。
  • 第二句:在文件末尾新增一行 listen = 127.0.0.1:9000
bash 复制代码
sed -i 's/^user = nobody/user = nginx/' /etc/php83/php-fpm.d/www.conf
sed -i 's/^group = nobody/group = nginx/' /etc/php83/php-fpm.d/www.conf
  • 把运行 PHP 的用户和组从 nobody 改为 nginx,这样 PHP 创建的文件才能被 Nginx 正常访问。

🚦 第七部分:启动所有服务

bash 复制代码
# 1. 启动 PHP-FPM(前台模式)
php-fpm83 -F &
  • -F:前台运行,方便看日志。
  • &:放到后台。
bash 复制代码
# 2. 启动 Nginx(前台模式)
nginx -g 'daemon off;' &
  • -g 'daemon off;':让 Nginx 也以前台方式运行。
  • &:后台。
bash 复制代码
# 3. 保持容器不退出(关键步骤!)
tail -f /dev/null
  • tail -f:持续输出文件末尾内容。
  • /dev/null:一个特殊的"黑洞"设备,永远为空。
  • 这个命令会永远阻塞在那里,使得容器不会因为启动完服务就自动退出。

现在所有服务都已启动! 你可以看到类似这样的输出:

复制代码
[17-Apr-2026 13:36:34] NOTICE: fpm is running, pid 8
[17-Apr-2026 13:36:34] NOTICE: ready to handle connections

🌐 第八部分:让外部访问你的 WordPress

目前容器里的服务只能容器内部访问,我们需要把容器的 80 端口映射到宿主机的某个端口(比如 8080)。

步骤:

  1. 退出容器但不停止它 :按键盘 Ctrl + P 再按 Ctrl + Q。你会回到宿主机终端,但容器仍在后台运行。

  2. 查看容器 ID

    bash 复制代码
    docker ps -a

    输出类似:

    复制代码
    CONTAINER ID   IMAGE           COMMAND       CREATED        STATUS        PORTS     NAMES
    7b9a2500e000   alpine:latest   "/bin/sh"     2 hours ago    Up 2 hours              my-wordpress

    记下 CONTAINER ID 的前几位(如 7b9a2500e000)。

  3. 把当前容器保存为一个新镜像

    bash 复制代码
    docker commit my-wordpress my-wordpress:alpine
    • docker commit:把容器保存为镜像。
    • my-wordpress:源容器名。
    • my-wordpress:alpine:新镜像名和标签。
  4. 停止并删除原容器(因为原容器没有映射端口):

    bash 复制代码
    docker stop my-wordpress
    docker rm my-wordpress
  5. 用新镜像重新运行,并映射端口

    bash 复制代码
    docker run -d --name wordpress-running -p 8080:80 my-wordpress:alpine \
      /bin/sh -c "mysqld_safe --user=mysql & php-fpm83 -F & nginx -g 'daemon off;' & tail -f /dev/null"
    • -d:后台运行(detach)。
    • --name wordpress-running:给新容器起名。
    • -p 8080:80:把宿主机的 8080 端口映射到容器的 80 端口。这样你访问 http://宿主机IP:8080 就相当于访问容器内的 80 端口。
    • 后面的长字符串是启动命令,和之前一样。
  6. 获取宿主机 IP

    bash 复制代码
    ip addr show | grep inet

    或者简单点:hostname -I

  7. 打开浏览器 ,输入 http://你的宿主机IP:8080。如果是在本机(比如你用 Linux 桌面),可以用 http://localhost:8080。你应该能看到 WordPress 的安装欢迎页面!

完成 WordPress 安装

  • 选择语言(例如"简体中文")。
  • 点击"Continue"。
  • 填写:
    • 站点标题(随便写,比如"我的第一个博客")
    • 用户名(比如 admin
    • 密码(建议用自动生成的强密码,记下来)
    • 电子邮箱
  • 点击"安装 WordPress"。
  • 安装完成后,用刚才的用户名密码登录后台(http://你的IP:8080/wp-admin)。

🎉 恭喜!你已经成功在 Docker 容器里跑起了 WordPress!


💾 第九部分:数据持久化(防止丢失数据)

问题 :当前容器如果被删除,所有文章、图片、数据库都会丢失。
解决方案:把重要数据目录挂载到宿主机硬盘上。

bash 复制代码
# 1. 在宿主机上创建两个目录
mkdir -p /data/wordpress/mysql
mkdir -p /data/wordpress/wp-content

# 2. 把当前容器里的数据复制出来
docker cp wordpress-running:/var/lib/mysql/. /data/wordpress/mysql/
docker cp wordpress-running:/var/www/localhost/wordpress/wp-content/. /data/wordpress/wp-content/

# 3. 停止并删除当前容器
docker stop wordpress-running
docker rm wordpress-running

# 4. 重新运行容器,挂载这两个目录(-v 参数)
docker run -d --name wordpress-prod -p 8080:80 \
  -v /data/wordpress/mysql:/var/lib/mysql \
  -v /data/wordpress/wp-content:/var/www/localhost/wordpress/wp-content \
  my-wordpress:alpine \
  /bin/sh -c "mysqld_safe --user=mysql & php-fpm83 -F & nginx -g 'daemon off;' & tail -f /dev/null"
  • -v 宿主机目录:容器内目录:把宿主机的目录挂载到容器内部,容器内对这个目录的读写实际上就是读写宿主机硬盘。

现在即使容器被删除,数据依然保存在 /data/wordpress/ 下。以后重建容器时,挂载同样的目录即可恢复数据。


🚀 第十部分:一键部署脚本(懒人福音)

如果你觉得手动敲这么多命令太麻烦,下面这个脚本可以帮你全自动完成所有步骤,包括安装 Docker、搭建环境、启动容器。

📜 脚本内容

将以下代码保存为 install_wordpress.sh

bash 复制代码
#!/bin/bash
# ============================================
# 一键部署 WordPress 到 Alpine Docker 容器
# 小白友好版 - 自动安装 Docker、自动配置环境
# 使用方法: chmod +x install_wordpress.sh && sudo ./install_wordpress.sh
# ============================================

set -e  # 遇到任何错误立即停止脚本

# 定义一些颜色,让输出更好看
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}   WordPress 一键部署脚本 (Alpine)   ${NC}"
echo -e "${GREEN}========================================${NC}"

# ------------------ 检查并安装 Docker ------------------
if ! command -v docker &> /dev/null; then
    echo -e "${RED}Docker 未安装,正在自动安装...${NC}"
    sudo dnf update -y
    sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo sed -i 's/$releasever/8/g' /etc/yum.repos.d/docker-ce.repo
    sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    sudo systemctl start docker
    sudo systemctl enable docker
    echo -e "${GREEN}Docker 安装完成。${NC}"
else
    echo -e "${GREEN}Docker 已安装,跳过安装步骤。${NC}"
fi

# ------------------ 用户输入端口 ------------------
read -p "请输入要映射的宿主机端口 (默认 8080): " HOST_PORT
HOST_PORT=${HOST_PORT:-8080}

# ------------------ 生成随机数据库密码 ------------------
DB_ROOT_PASS=$(openssl rand -base64 12 | tr -d "=+/" | cut -c1-16)
DB_WP_PASS=$(openssl rand -base64 12 | tr -d "=+/" | cut -c1-16)

echo -e "${YELLOW}数据库 root 密码: ${DB_ROOT_PASS}${NC}"
echo -e "${YELLOW}WordPress 数据库用户 wpuser 密码: ${DB_WP_PASS}${NC}"
echo -e "${YELLOW}请保存好这些密码!${NC}"

# ------------------ 创建临时目录 ------------------
TEMP_DIR=$(mktemp -d)
cd $TEMP_DIR

# ------------------ 编写 Dockerfile ------------------
cat > Dockerfile <<'EOF'
FROM alpine:latest
RUN apk update && apk add --no-cache \
    nginx php83 php83-fpm php83-mysqli php83-session php83-json \
    php83-mbstring php83-tokenizer php83-gd php83-curl php83-xml \
    mariadb mariadb-client wget unzip
RUN mkdir -p /run/mysqld /var/www/localhost && chown mysql:mysql /run/mysqld
WORKDIR /var/www/localhost
RUN wget https://wordpress.org/latest.zip && unzip latest.zip && rm latest.zip && chown -R nginx:nginx wordpress
COPY start.sh /start.sh
RUN chmod +x /start.sh
EXPOSE 80
CMD ["/start.sh"]
EOF

# ------------------ 编写启动脚本 start.sh ------------------
cat > start.sh <<'EOF'
#!/bin/sh
# 初始化数据库(仅首次运行)
if [ ! -d "/var/lib/mysql/mysql" ]; then
    mysql_install_db --user=mysql --datadir=/var/lib/mysql > /dev/null 2>&1
fi
# 启动 MariaDB
mysqld_safe --user=mysql &
sleep 5
# 设置密码和创建数据库(仅首次)
if [ ! -f "/var/lib/mysql/.wp_initialized" ]; then
    mysqladmin -u root password "${DB_ROOT_PASS}"
    mysql -u root -p"${DB_ROOT_PASS}" <<EOSQL
CREATE DATABASE IF NOT EXISTS wordpress;
CREATE USER IF NOT EXISTS 'wpuser'@'localhost' IDENTIFIED BY '${DB_WP_PASS}';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EOSQL
    touch /var/lib/mysql/.wp_initialized
fi
# 配置 wp-config.php
cd /var/www/localhost/wordpress
if [ ! -f wp-config.php ]; then
    cp wp-config-sample.php wp-config.php
    sed -i "s/database_name_here/wordpress/" wp-config.php
    sed -i "s/username_here/wpuser/" wp-config.php
    sed -i "s/password_here/${DB_WP_PASS}/" wp-config.php
    sed -i "s/localhost/localhost/" wp-config.php
    curl -s https://api.wordpress.org/secret-key/1.1/salt/ >> wp-config.php
fi
# 配置 Nginx
cat > /etc/nginx/http.d/default.conf <<'NGINXCONF'
server {
    listen 80 default_server;
    root /var/www/localhost/wordpress;
    index index.php;
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi.conf;
    }
}
NGINXCONF
# 配置 PHP-FPM
sed -i 's/^listen = 127.0.0.1:9000/; listen = 127.0.0.1:9000/' /etc/php83/php-fpm.d/www.conf
echo "listen = 127.0.0.1:9000" >> /etc/php83/php-fpm.d/www.conf
sed -i 's/^user = nobody/user = nginx/' /etc/php83/php-fpm.d/www.conf
sed -i 's/^group = nobody/group = nginx/' /etc/php83/php-fpm.d/www.conf
# 启动服务
php-fpm83 -F &
nginx -g 'daemon off;' &
# 保持容器运行
tail -f /dev/null
EOF

# 把密码变量注入 start.sh
sed -i "s/\${DB_ROOT_PASS}/${DB_ROOT_PASS}/g" start.sh
sed -i "s/\${DB_WP_PASS}/${DB_WP_PASS}/g" start.sh

# ------------------ 构建 Docker 镜像 ------------------
echo -e "${GREEN}正在构建 Docker 镜像...(可能需要几分钟)${NC}"
docker build -t my-wordpress:auto .

# ------------------ 运行容器 ------------------
echo -e "${GREEN}正在启动容器,映射端口 ${HOST_PORT}:80 ...${NC}"
docker run -d --name wordpress-auto -p ${HOST_PORT}:80 my-wordpress:auto

# ------------------ 输出访问信息 ------------------
# 获取宿主机 IP
SERVER_IP=$(ip route get 1 | awk '{print $NF;exit}')
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}部署完成!${NC}"
echo -e "访问地址: ${GREEN}http://${SERVER_IP}:${HOST_PORT}${NC}"
echo -e "WordPress 后台: ${GREEN}http://${SERVER_IP}:${HOST_PORT}/wp-admin${NC}"
echo -e "数据库 root 密码: ${YELLOW}${DB_ROOT_PASS}${NC}"
echo -e "数据库 wpuser 密码: ${YELLOW}${DB_WP_PASS}${NC}"
echo -e "${GREEN}========================================${NC}"
echo -e "${YELLOW}提示: 容器名为 wordpress-auto,常用命令:${NC}"
echo -e "  查看日志: docker logs wordpress-auto"
echo -e "  停止容器: docker stop wordpress-auto"
echo -e "  启动容器: docker start wordpress-auto"
echo -e "  进入容器: docker exec -it wordpress-auto /bin/sh"
echo -e "${YELLOW}如需持久化数据,请参考文档中的"数据持久化"部分。${NC}"

# 清理临时目录
rm -rf $TEMP_DIR

🔧 如何使用一键脚本

  1. 在宿主机上创建脚本文件

    bash 复制代码
    vi install_wordpress.sh

    i 进入编辑模式,把上面的脚本内容完整复制 进去,然后按 ESC,输入 :wq 保存退出。

  2. 赋予执行权限

    bash 复制代码
    chmod +x install_wordpress.sh
  3. 运行脚本(需要管理员权限)

    bash 复制代码
    sudo ./install_wordpress.sh
  4. 按提示输入端口(例如直接回车使用默认 8080,或输入其他如 8888)

  5. 等待几分钟,脚本会自动完成所有工作。最后会输出访问地址和数据库密码。

  6. 打开浏览器,访问显示的地址,就能看到 WordPress 安装界面。填写站点标题、管理员用户名密码即可完成安装。

🎉 一键脚本让你彻底告别繁琐的手动配置,再也不用担心敲错命令了!


🔧 常见问题 & 小贴士

❓ 浏览器打不开页面?

  • 检查防火墙

    bash 复制代码
    sudo firewall-cmd --add-port=8080/tcp --permanent && sudo firewall-cmd --reload
  • 检查容器是否运行docker ps 应该显示 Up

  • 在容器内测试

    bash 复制代码
    docker exec -it wordpress-auto curl -L http://localhost

    如果能返回 HTML,说明服务正常,问题在宿主机网络/防火墙。

❓ 如何修改数据库密码?

bash 复制代码
# 进入容器
docker exec -it wordpress-auto /bin/sh
# 修改 root 密码
mysqladmin -u root -p'旧密码' password '新密码'
# 修改 wpuser 密码
mysql -u root -p'新密码' -e "ALTER USER 'wpuser'@'localhost' IDENTIFIED BY '新新密码';"

然后修改 /var/www/localhost/wordpress/wp-config.php 里的 DB_PASSWORD 为新密码。

❓ 如何备份网站?

  • 备份数据库docker exec wordpress-auto mysqldump -u root -p'密码' wordpress > backup.sql
  • 备份文件docker cp wordpress-auto:/var/www/localhost/wordpress/wp-content ./wp-content-backup

❓ 如何升级 WordPress?

  • 进入容器:docker exec -it wordpress-auto /bin/sh
  • 切换到目录:cd /var/www/localhost/wordpress
  • 下载新版:wget https://wordpress.org/latest.zip
  • 解压覆盖(注意不要覆盖 wp-config.phpwp-content 目录)。

🎉 结语

你从头到尾学习了:

  • Docker 的基本概念和安装
  • 如何进入 Alpine 容器并安装软件
  • 如何手动配置 Nginx、PHP、MariaDB
  • 如何让外部访问容器内的服务
  • 如何用一键脚本省去所有麻烦
  • 最重要的是:理解了整个请求的流转路径和各个组件的作用(带步骤序号的流程图)

现在,你已经是一个 Docker + WordPress 的小能手了! 去创建你的精彩内容吧 🚀

st/wordpress/wp-config.php里的DB_PASSWORD` 为新密码。

❓ 如何备份网站?

  • 备份数据库docker exec wordpress-auto mysqldump -u root -p'密码' wordpress > backup.sql
  • 备份文件docker cp wordpress-auto:/var/www/localhost/wordpress/wp-content ./wp-content-backup

❓ 如何升级 WordPress?

  • 进入容器:docker exec -it wordpress-auto /bin/sh
  • 切换到目录:cd /var/www/localhost/wordpress
  • 下载新版:wget https://wordpress.org/latest.zip
  • 解压覆盖(注意不要覆盖 wp-config.phpwp-content 目录)。

🎉 结语

你从头到尾学习了:

  • Docker 的基本概念和安装
  • 如何进入 Alpine 容器并安装软件
  • 如何手动配置 Nginx、PHP、MariaDB
  • 如何让外部访问容器内的服务
  • 如何用一键脚本省去所有麻烦
  • 最重要的是:理解了整个请求的流转路径和各个组件的作用(带步骤序号的流程图)

现在,你已经是一个 Docker + WordPress 的小能手了! 去创建你的精彩内容吧 🚀

如果还有任何疑问,欢迎随时交流~

相关推荐
m0_640309301 小时前
如何大幅提升 Google Sheets 数据库更新脚本的执行效率
jvm·数据库·python
杨浦老苏1 小时前
开源数据库备份工具Databasus
数据库·docker·备份·群晖
倔强的小石头_1 小时前
在外需要访问公司内网文件服务器?Serv-U + 内网穿透 把 SFTP 端口穿透到公网
运维·服务器
Greyson11 小时前
CSS如何实现单选按钮自定义样式_利用伪元素隐藏默认UI
jvm·数据库·python
黑牛儿1 小时前
AI Agent\+PHP实现智能接口限流,避开算力成本陷阱(结合今日AI热点)
开发语言·人工智能·php
2401_835956811 小时前
Go语言怎么防SQL注入_Go语言SQL注入防护教程【深入】
jvm·数据库·python
杨云龙UP2 小时前
CentOS7.9及以上环境部署TDengine TSDB-OSS实战指南:安装、配置、建库、建超级表与验证_20250418
大数据·linux·运维·数据库·centos·时序数据库·tdengine
m0_514520572 小时前
宝塔面板怎样实现数据库的多地异地自动备份_结合阿里云OSS与定时任务插件
jvm·数据库·python
北漂Zachary2 小时前
四大编程语言终极对决
java·linux·数据库