通过 Docker Compose 部署 WordPress

教程

由于懒得安装 LNMP 环境,而且想尝试部署 WordPress 的不同方法,于是写了这篇教程。

环境安装

安装 Docker

为了方便,推荐使用官方脚本安装。此脚本适用于常用 Linux 发行版。

curl -fsSL https://get.docker.com | sudo sh

如果你的服务器在国内,推荐使用 DaoCloud 的 Docker 加速下载服务来安装,并配置其提供的 Docker Hub 加速器。

安装 Docker

curl -sSL https://get.daocloud.io/docker | sh

配置 Docker Hub 加速器

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

配置 Docker Rootless(可选)

默认情况下,Docker 只能通过 root 用户运行,普通用户通常要加 sudo。如果觉得麻烦,可以启用 Docker 的 rootless 模式。使用普通用户执行下面这条命令即可安装:

dockerd-rootless-setuptool.sh install

安装 Docker Compose

提示

2024.7 更新:新版 Docker 自带 Docker Compose,无需额外安装,此步可跳过。下文中 docker-compose 命令均改为 docker compose,即把中间的连字符改为空格。

下载二进制文件

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

赋予执行权限

sudo chmod +x /usr/local/bin/docker-compose

设置容器

创建项目

  1. 新建项目目录,这里以 ~/my_wordpress 为例。
    mkdir ~/my_wordpress
  2. 进入项目目录
    cd ~/my_wordpress
  3. 编写配置文件
    • 编辑文件
      nano docker-compose.yml
    • 填入以下配置:
      version: "3.9"

      services:
      db:
      image: mysql:5.7
      volumes:
      - db_data:/var/lib/mysql
      restart: always
      environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

      wordpress:
      depends_on:
      - db
      image: wordpress:latest
      volumes:
      - wordpress_data:/var/www/html
      ports:
      - "8080:80"
      restart: always
      environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
      volumes:
      db_data: {}
      wordpress_data: {}
    • 这里用到了 mysql:5.7wordpress:latest 两个 Docker 镜像,WordPress 镜像依赖于 MySQL 镜像。
    • restart: always 参数表明容器服务宕机后会自动重启。
    • MYSQL_ROOT_PASSWORD 为数据库的 root 密码,MYSQL_PASSWORD 为数据库的普通用户密码,请自行修改,对应的 WORDPRESS_DB_PASSWORD 也要同时修改。MYSQL_USER 为数据库普通用户的用户名,如果有需要也可以修改,对应的 WORDPRESS_DB_USER 也要同时修改。
    • 8080:80 的意思是把宿主机的 8080 端口映射到容器内部的 80 端口。如需通过其他端口访问,只需修改前面的 8080。比如,我要通过 8088 端口访问 WordPress,填写 8088:80即可。由于 Caddy 会占用 80443 端口,请将不要映射到这些端口。
    • 执行 Ctrl + O 保存文件,回车,再执行 Ctrl + X 退出。

启动容器

~/my_wordpress 目录中执行以下命令启动 WordPress:

sudo docker-compose up -d

构建完成后就可以通过 http://ip:port 来访问 WordPress(请将 ip 替换为 VPS 的 IP,port 替换为你使用的端口,如果是 80 端口则可以省略)。如果提示 Error establishing a database connection,说明配置尚未完成,等待 1~2 分钟,刷新网页即可进入安装界面。

配置 SSL

原方法过于复杂,目前已找到较好的替代方案,步骤如下。

首先安装 Caddy,这里以 Ubuntu/Debian 为例,其他系统请参考官方文档

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

编辑 Caddyfile

sudo nano /etc/caddy/Caddyfile

删除或注释所有内容,填入以下内容:

example.com {
tls i@example.com
encode gzip
reverse_proxy localhost:8080
}

请把其中的 example.com 改为 WordPress 博客将使用的域名,i@example.com 改为你的邮箱,用于签发 SSL 证书。
8080 为 WordPress 的公网访问端口

启动 Caddy

sudo systemctl start caddy
展开查看原方法 由于本人对 Apache2 不熟悉,且网上很多教程所介绍的方法已不适用,本章的撰写花费了较多时间。

进入容器

sudo docker-compose exec wordpress bash

注意:本章中后续命令都要在容器中执行!

安装 cron 及 nano

apt update && apt install -y cron nano

安装 acme.sh 用于签发 SSL 证书(请把 my@example.com 改为你的邮件地址)

curl  https://get.acme.sh | sh -s email=my@example.com

将域名解析至 VPS 的 IP,然后执行以下命令签发证书(请把 example.com 改为你的域名)

bash ~/.acme.sh/acme.sh --issue -d example.com --apache  --tlsport 56789

启用模块

a2enmod rewrite
a2enmod ssl

创建证书目录

mkdir -p /etc/apache2/ssl

复制证书(请把 example.com 改为你的域名)

bash ~/.acme.sh/acme.sh --install-cert -d example.com \
--cert-file /etc/apache2/ssl/cert.pem \
--key-file /etc/apache2/ssl/key.pem \
--fullchain-file /etc/apache2/ssl/fullchain.pem \
--reloadcmd "service apache2 force-reload"

创建站点(将以下全部内容粘贴进终端执行):

cat > wordpress.conf << EOF
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@localhost
ServerName yourdomain.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/cert.pem
SSLCertificateKeyFile /etc/apache2/ssl/key.pem
SSLCACertificateFile /etc/apache2/ssl/fullchain.pem
</VirtualHost>
</IfModule>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName yourdomain.com
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]
</VirtualHost>
EOF

启用站点

a2ensite wordpress
service apache2 restart

编辑 /var/www/html/.htaccess,在顶部加入以下内容:

# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
# END SSL Redirect

最后一步,访问域名,进入 WordPress 后台,打开 「设置」-「常规选项」,并把 WordPress地址站点地址 中的 http 改为 https,并保存。

至此,SSL 配置已完成。

常用命令

以下命令必须在 docker-compose.yml 所在目录执行(本文是 ~/my_wordpress

  • 查看 WordPress 运行日志:
    sudo docker-compose logs
  • 关闭 WordPress 服务:
    sudo docker-compose stop
  • 再次启动 WordPress 服务:
    sudo docker-compose start
  • 完全删除 WordPress 服务及其 Docker 镜像:
    sudo docker-compose down --volumes --rmi all

博客加速

AHdark 大佬为广大网友提供了免费优质的 CDN 加速服务,可以极大得加快博客访问速度。配套的 Source Global CDN 插件可以在 「插件」 - 「添加插件」 中搜索安装并启用。

参考资料

  1. Install Docker Engine | Docker Documentation
  2. Install Docker Compose | Docker Documentation
  3. Quickstart: Compose and WordPress | Docker Documentation
  4. 说明 · acmesh-official/acme.sh Wiki
  5. Deploy ssl certs to apache server · acmesh-official/acme.sh Wiki
  6. 【杂谈】免费SSL证书那点事
  7. Apache2 - Wordpress HTTP 站点跳转 HTTPS
  8. 如何有效地提高WordPress博客的访问速度
  9. DaoCloud | Docker 极速下载

本文作者:Tony

本文链接: https://blog.iamsjy.com/2022/03/29/deploy-wordpress-with-docker-compose/

文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。

评论