首页 Docker教程 「Docker教程」「Wordpress教程」使用 Docker 部署 Wordpress

「Docker教程」「Wordpress教程」使用 Docker 部署 Wordpress

在部署 Wordpress 前我们要考虑一个问题,就是 PHP 的扩展,比如说我希望在我的 Wordpress 上使用 Memcached,那么我们就不能直接使用 Wordpress 默认的镜像,因为默认的镜像并没有安装相应的 PHP 扩展。

这时我们就可以使用 Dockerfile 来构建一个自定义镜像,在构建过程中就可以安装自己需要的 PHP 扩展,如 Memcached、Redis、Brotli 等等。

接下来我们就开始一步一步的使用 Docker 来部署自己的 Wordpress 站点吧。

部署 Wordpress

正式部署前先说明,由于我曾测试 Memcached 与 Redis,所以 PHP 扩展里我都安装了相应的扩展。正常使用的话可以只安装其中一个,当然了,你要是和我一样都安装了也是可以的。

构建自定义镜像

创建一个目录用作存储与 Wordpress 相关的所有文档并进入该文件夹

mkdir -p ~/docker/wordpress && cd ~/docker/wordpress

创建 Dockerfile 文件

vim Dockerfile

拷贝以下内容

FROM wordpress:php8.3

RUN apt update && apt install -y libmemcached-dev zlib1g-dev libssl-dev libbrotli-dev openssh-client libssh2-1-dev \
    && pecl install memcached \
    && pecl install memcache \
    && pecl install redis \
    && pecl install brotli \
    && pecl install ssh2 \
    && docker-php-ext-enable memcached memcache redis brotli ssh2

注:我在安装 Memcached 扩展时踩了不少的坑,构建镜像时一直报错。原因是 Debian 版本的原因导致的,在 Debian Bookworm 上 libmemcached-dev 这个库从 1.0.18 升级到 1.1.4 。但由于某种原因 1.1.4 似乎无法正确安装,因此 pecl 找不到正确的头文件。解决办法就是多安装 libssl-dev 这个库。

使用命令进行构建一个全新的镜像。

docker build -t wp .

当构建结束后我们就可以查看本地的镜像库里是否存在刚才构建的库。

root@US-DC2:~/docker/wordpress# docker images
REPOSITORY                      TAG       IMAGE ID       CREATED          SIZE
wp                              latest    fac03aa93d2a   15 seconds ago   798MB

自定义 PHP 配置参数

主要是解锁上传文件的最大大小,这里请根据自己的实际需求来设定。

~/docker/wordpress 目录下新建一个 custom-config.ini 文件

vim custom-config.ini

将以下配置复制进去后保存退出即可。

upload_max_filesize = 128M
post_max_size = 128M

注:自定义 PHP 配置可以在构建镜像时就将其完成,但是为了方便灵活处理,我个人觉得还是在运行容器时才以文件绑定到容器内比较合适。

Docker Compose

~/docker/wordpress 目录下新建一个 docker-compose.yml 文件

vim docker-compose.yml

将以下内容复制进去后保存退出即可。

version: '3.8'

services:

  wordpress:
    image: wp
    container_name: wordpress
    restart: unless-stopped
    ports:
      - 801:80
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - ./html:/var/www/html
      - ./custom-config.ini:/usr/local/etc/php/conf.d/custom-config.ini
    depends_on:
      - memcached
      # - redis
    networks:
      - web

  mysql:
    image: mysql:latest
    container_name: mysql
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
      MYSQL_ROOT_PASSWORD: rootpasswd
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/config:/etc/mysql/conf.d
    networks:
      - web

  memcached:
    image: memcached:latest
    container_name: memcached
    restart: unless-stopped
    command: memcached -m 128 -c 64
    networks:
      - web

  # phpmyadmin:
  #   image: phpmyadmin:latest
  #   container_name: phpmyadmin
  #   restart: unless-stopped
  #   ports:
  #     - 802:80
  #   environment:
  #     PMA_HOST: mysql
  #   networks:
  #     - web

  # redis:
  #   image: redis:latest
  #   container_name: redis
  #   restart: unless-stopped
  #   ports:
  #     - 6379:6379
  #   volumes:
  #     - ./redis:/data
  #   command: ["redis-server", "--requirepass", "redispasswd"]
  #   networks:
  #     - web

networks:
  web:
    name: web

注:

  • 在 wordpress 这个容器上,我们使用了刚刚自己构建的镜像wp
  • 根据实际情况修改对应的账号、密码、端口等等;
  • Volumes 为绑定的文件/卷,举例:./html:/var/www/html 冒号前的目录有宿主机上的路径,./html 则表示存放 docker-compose.yml 文件的目录下的 html 文件夹。冒号后的路径则为容器内部的目录;
  • 演示使用了 Memcached,如果你想使用 Redis 的话,将 Redis 相对应的注释删除并注释 Memcached 相对应的部分;
  • 在 Memcached 这个容器里我使用 memcached -m 128 -c 64 这个命令,当我们 Wordpress 站点的数据与访问增大时,请修改相应的值;
  • phpmyadmin 这个容器是启动一个 Mysql 的 web 管理器,可根据需求来决定是否启动。若要启动,将此块对应的注释删除即可。

启动容器

使用 Docker Compose 一定要确保当前路径是在项目文件夹里,也就是存放 docker-compose.yml 这个文件夹,然后运行以下命令

docker compose up -d

关闭 Docker Compose

docker compose down

查看已启动的容器

docker ps -a

进入 wordpress 容器内部并查看 PHP 扩展是否安装成功

root@US-DC2:~/docker/wordpress# docker exec -it wordpress /bin/bash
root@73e8b6fe128f:/var/www/html# php -m
[PHP Modules]
bcmath
brotli
Core
ctype
curl
date
dom
exif
fileinfo
filter
gd
hash
iconv
imagick
intl
json
libxml
mbstring
memcache
memcached
mysqli
mysqlnd
openssl
pcre
PDO
pdo_sqlite
Phar
posix
random
readline
redis
Reflection
session
SimpleXML
sodium
SPL
sqlite3
ssh2
standard
tokenizer
xml
xmlreader
xmlwriter
Zend OPcache
zip
zlib

[Zend Modules]
Zend OPcache

可以看到相应的 Memcached 与 Redis 等扩展均已成功安装。

注:容器启动成功后会在 ~/docker/wordpress 目录下新建 htmlmysql 这两个目录用来持久保存 Wordpress 的数据,方便迁移与备份。

代理 Wordpress

通过 Nginx Proxy Manager 可以非常简单的代理刚才启动的 Wordpress 容器。

注:

  • Forward Hostname / IP : 如果是代理 Docker 里的容器时,这一栏选择 Docker 的内网 IP 比较适合,查看 Docker 的内网 IP 可以使用 ip addr | grep docker 这个命令。当然了,你直接使用服务器 IP 也是可以的;
  • Forward Port : 这里填入刚刚在 Wordpress 容器上映射出来的 801 端口;
  • Cache Assets、Block Common Exploits、Websockets Support : 这三项请根据实际情况进行勾选,如果前端页面有报错或异常可将对应的项取消勾选。我使用的主题就不能勾选 Cache Assets,一勾选主题的 CSS 样式就会加载异常。

总结

以前使用 LNMP 或者宝塔面板来部署 Wordpress,过程相对复杂,更重要的是数据备份与迁移麻烦。现在使用 Docker 来部署,部署过程简单,最重要的是,如果要将数据从旧服务器迁移到新的服务器,只需将 ~/docker/wordpress 这个目录使用 rsync 传输到新服务器上即可。然后在新服务器安装好 Docker 环境,就可以使用一条命令即可重新上线。

或许您会对以下内容感兴趣