使用Docker Compose在本地环境中构建WP-CLI+WordPress+数据库+数据专用容器

前提作为我的工作内容,我主要负责创建和运营网站的原创主题以及开发和运营插件。在这些工作中,我使用本地环境来运行WordPress,因为WordPress具有将域名写入发布时的图像URL等特性,所以我会调整设置,使得本地环境和域名相同。这样做可以更方便地进行自动部署。我并没有进行数据库的同步,只是从生产环境手动导出并下载数据库。(个人而言,我不会遇到太多麻烦,只会在需要时进行下载。)

另外,本次创建的网站域名将作为example.com进行进展,但请根据各位的环境适时进行更改。
关于该域名,可以从域名注册机构获得用于生产的实际域名,也可以自行设置虚构的域名,任何设置都可以。
※如果不太清楚,请设置一个不太可能存在的随机数字的域名,以降低可能产生影响的风险,这样会更加安心。
例如)weoriuewqryoiuv6786234kiuywerkhjqwerhiasudyfqweryui197j.com

通过使用这个环境,我感受到了许多好处。可以通过更改PHP和MySQL的版本来轻松进行测试。
可以轻松地进行插件测试、WordPress版本的测试,以及版本的升级和降级。
可以在Docker、Linux、nginx、apache等与服务器相关的事实标准环境中进行开发。
由于是事实标准,很多人都具备共享的经验和知识。
在团队开发等情况下,可以轻松共享并重现相同的环境。
可以作为学习Docker、Linux、nginx、apache等与服务器相关内容的机会。
与传统的虚拟机环境相比,数据量轻、启动速度快。(即使保守估计,感官上也有数倍的差距)

可能的缺点需要具备有关服务器的知识,如Docker、Linux、nginx、apache等,因此对于开发人员或设计师来说,引入时的学习成本可能较高。因此,如果没有先备知识,可能会导致黑盒化,遇到问题时容易陷入困境。

容器布置(本地环境)以下是中文的同义句:

利用nginx作为代理服务器,在多个网站之间共用一个容器。

使用WP-CLI容器和WordPress容器。

使用MySQL容器。

使用数据专用容器。

以下是根据每个网站创建的WP-CLI容器的配置。由于当前有多个运行中的网站,使用的插件或WordPress核心版本可能不同,因此我们将它们分开以便可以对其进行逐个验证。如果我们从当前配置提高一些抽象程度并根据URL切换网站,可能也是可行的,但我认为这样做会导致运营上的混乱(导致环境之间的耦合),所以我们维持目前的配置。

利用环境构建本地环境(仅在此处进行,基于MacOS的前提条件)

GitHub
GitHubAction

生产服务器

创建nginx代理容器配置文件。代理服务器的作用正如其名,它代替浏览器与服务器(在这里是WordPress容器)进行通信。

在这里,我们将浏览器的访问暂时发送到代理。为此,我们将编辑本地PC(主机操作系统)的hosts文件(/private/etc/hosts)。这样一来,当我们平时访问example.com时,通信将被定向到本地PC内的nginx代理,而不是example.com的生产服务器。
请将以下内容添加到hosts文件的末尾。

0.0.0.0 example.com

当您保存并访问 example.com 时,将会查看本地电脑内的代理。
若要像原先一样直接访问生产环境,请将上述内容注释掉并保存。

# 0.0.0.0 example.com

首先,在任意位置创建一个目录,并用喜欢的名字命名来存放代理容器。
然后,在该目录下创建以下文件。

docker-compose.yml 可以被翻译为”容器部署.yml”

version: "3.7"
services:
  proxy:
    image: jwilder/nginx-proxy
    container_name: proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./nginx:/etc/nginx
      - ./certs:/etc/nginx/certs:ro
    restart: always
    logging:
      options:
        max-size: 5m
        max-file: "10"
volumes:
  shared-volume:
    name: shared
networks:
  default:
    name: shared

请参考以下文章了解有关YML的详细信息。

 

使用这个配置,代理容器已经设置完毕。

创建WP-CLI,WordPress,MySQL容器配置文件。首先,在任意位置以喜欢的名称创建用于存放网站本地环境的目录。
然后,在该目录下创建以下文件。

docker-compose.yml的含义是Docker组合.yml文件。

version: "3.7"
services:

  wpcli:
    image: wordpress:cli
    container_name: wpcli
    volumes:
      - example-wp:/var/www/html
      - ./tmp:/tmp
    command: chown xfs:xfs /tmp/wpcli-entrypoint.sh &&
             sh /tmp/wpcli-entrypoint.sh mysql exampleuser examplepass
    user: root
    networks:
      - default
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: wordpress

  mysql:
    platform: linux/x86_64
    image: mysql:5.7.37
    volumes:
      - example-dbdatavolume:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
    restart: always
    networks:
      - default
    logging:
      options:
        max-size: 5m
        max-file: "10"

  wordpressimage:
    image: wordpress:latest
    volumes:
      - example-wp:/var/www/html #デフォルトで作成されるvolumeをわかりやすくするための設定
      - ./tmp:/tmp
      - ./etc/vhost-example.conf:/etc/apache2/conf.d/vhost-example.conf
      - ./etcphp/php.ini:/usr/local/etc/php/php.ini
      - ./wp-content:/var/www/html/wp-content
    container_name: example-wp-ct
    environment:
      VIRTUAL_HOST: example.com
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: wordpress
      CERT_NAME: default
    depends_on:
      mysql:
        condition: service_started
    restart: always
    tty: true
    networks:
      - default
    logging:
      options:
        max-size: 5m
        max-file: "10"

volumes:
  example-wp:
  example-dbdatavolume:
    external: true #事前にデータ専用コンテナを作成(compose管理外のコンテナを探す指定)

networks:
  default:
    name: shared

#volumeの構成
#shared用に1つ、これは複数サイト共用。
#wp用に1つ。サイトごとに1つ生成される。
#データ専用コンテナ1つ。サイトごとに1つ生成。

这个设置与之前在代理中指定的设置基本相同,只是在docker-compose.yml文件中写入。虽然有点长,但基本上做的事情是同时控制WP-CLI(一个可以用命令简单地进行WordPress升级、插件升级等操作的工具)、WordPress本身和MySQL服务器的容器的启动顺序。关于顺序选择的原因如下:MySQL的启动时间最长。在使用WP-CLI安装WordPress时,如果MySQL没有启动,会出现错误。因此,需要控制启动顺序。详细内容请参考后述关于tmp文件夹的章节中所创建的Shell脚本。

在这个docker-compose.yml文件中,有一些没有使用代理的项目,我稍微进行补充说明。

WordPress容器在此元素中,我们创建了一个WordPress容器。

卷要素 sù)

volumes:
    - example-wp:/var/www/html #デフォルトで作成されるvolumeをわかりやすくするための設定
    - ./tmp:/tmp
    - ./etc/vhost-example.conf:/etc/apache2/conf.d/vhost-example.conf
    - ./etcphp/php.ini:/usr/local/etc/php/php.ini
    - ./wp-content:/var/www/html/wp-content

卷是Docker在进行文件管理时使用的机制。主要用于将数据保存在主机操作系统(例如我自己使用的MacOS)的目录中,可以从Docker中保存数据,也可以从主机操作系统中读取数据。

在生成容器后,Volume会一起被创建,这里给它取名为exapmle-wp。(为了方便管理,我给它起名字,否则会以随机方式生成)
/var/www/html是Docker容器内的路径,将整个目录完整地带到宿主机上进行保存。
如果在宿主操作系统中存在名为exapmle-wp的Volume,则从第二次开始,会将该宿主操作系统内的目录加载到容器内使用。
这就是所谓的Volume的挂载方法。

在`./tmp`和`/tmp`下,基本上是在主机操作系统上创建目录并将其中的文件加载到Docker内部。
通过这样做,即使删除容器,数据也不会消失,因为数据保存在主机操作系统上。
而这三种方法都属于绑定挂载(短语法)。
在Volume挂载中,Docker会自动在主机操作系统内创建目录,
而在绑定挂载中,用户需要自己创建目录并进行管理。
本次配置了`yml`文件和同级目录下的`tmp`、`etc`、`etcphp`、`wp-content`目录。

临时目录我在这里放置了Shell脚本文件。
当启动Docker容器时,执行该脚本并使用WP-CLI命令自动化进行WordPress安装工作。

等等文件夹这里指定了用于apache的虚拟主机文件。
通过使用虚拟主机,可以在指定的域名上通过apache显示指定的目录。

等等 PHP 目录由于在使用php的Xdebug时需要编辑php.ini文件,因此我们进行了安装。
另外,如果您想将WordPress的文件上传数据限制提高到2M以上,也可以在php.ini文件中进行设置。
如果不需要的话,您可以删除它。

网站内容这是WordPress的目录,包括插件、主题和上传文件等。在我的情况下,我开发插件和主题,所以我将它们全部绑定挂载。我也在这个目录下管理git。有些人可能只有插件目录或主题目录。

环境要素环境是指服务器内可用的变量的概念,可将其视为环境变量。

environment:
    VIRTUAL_HOST: example.com
    WORDPRESS_DB_HOST: mysql
    WORDPRESS_DB_USER: exampleuser
    WORDPRESS_DB_PASSWORD: examplepass
    WORDPRESS_DB_NAME: wordpress
    CERT_NAME: default

虚拟主机请提供本次项目的URL链接。
此链接将由前面提到的代理服务器来访问。

WordPress数据库主机。设置DB服务器的主机名。

WordPress数据库用户设置DB的用户名。

WORDPRESS_DB_PASSWORD 口令设置数据库的密码。

WordPress 数据库名称设置数据库的名称。

WORDPRESS_DB是WordPress官方图像中设置的变量。

 

证书名称SSL证书的配置

网络要素这个是指定属于顶层网络元素中名为”default”的共享网络中,意思是这个网络的容器基本上会自动连接到相同网络内的容器,然后后面提到的WP-CLI和MySQL容器也能够通过连接到相同的网络来进行通信。

networks:
    - default

WP-CLI容器在这个要素中,我们正在创建WP-CLI容器。

卷要素 ​suǒ)

volumes:
    - example-wp:/var/www/html

example-wp 是指在 WordPress 容器中指定的卷。这意味着它将在主机操作系统上创建的卷目录(example-wp)加载到 WP-CLI 容器的 /var/www/html 目录中并使用。换句话说,这是在两个容器中共享一个主机操作系统上的目录。在这里,WordPress 文件被展开在 html 目录下。而在 WP-CLI 中,您可以通过安装过程生成 wp-config.php 等文件,并在其中写入数据库信息,以便能够通过命令行进行设置。

临时目录

- ./tmp:/tmp

在tmp目录下,放置您自己创建的shell脚本。
这里将放置以下的shell脚本。

#!/bin/ash

set -e

host="$1"
shift
user="$1"
shift
password="$1"
shift
cmd="$@"

echo "Waiting for mysql"
until mysql -h"$host" -u"$user" -p"$password" &> /dev/null
do
       >&2 echo -n "."
       sleep 1
done

>&2 echo "MySQL is up - executing command"
#ここまでがmysqlコンテナが立ち上がるのを待つためのスクリプト

if [ ! -e '/check' ]; then
    touch /check
    cd /var/www/html
    rm /var/www/html/wp-config.php
    wp config create --allow-root --dbname=wordpress --dbuser=exampleuser --dbpass=examplepass --dbhost=mysql --dbprefix=wp_
    sed -i -e "98a \$_SERVER['HTTPS'] = 'on';" wp-config.php
    chown www-data:www-data /var/www/html/wp-config.php
    wp core install --allow-root --url="example.com" --title="example-title" --admin_user="xxxxxxxxxxxxxxx" --admin_password="xxxxxxxxxxxxxxxxxx" --admin_email="example-docker@gmail.com" --path="/var/www/html"
    wp rewrite structure --allow-root "%postname%" --url="example.com" --path="/var/www/html"
    chown -R www-data:www-data /var/www/html/wp-content/
    wp option update --allow-root home 'https://example.com'
    wp option update --allow-root siteurl 'https://example.com'
    tail -f /var/log/serverlog
else
    # 2回目以降
    tailf /var/log/serverlog
fi

大致的流程如下:
从第一行开始到第2行的”echo “MySQL is up – executing command””这行是用来等待MySQL容器启动的脚本。
如果MySQL容器未启动的情况下使用WP-CLI执行WordPress安装等操作,会尝试从WordPress容器操作MySQL容器,从而导致错误。

之后,只需在第一次(WordPress未配置)时进行WordPress的配置。
这通常是通过浏览器进行安装设置,但我用WP-CLI命令行工具进行自动化处理该操作。
此外,还进行了wp-config.php中HTTPS的设置以及永久链接的更改等操作。

请在复制粘贴上述Shell脚本时,根据需要更改域名、管理员用户名和密码等信息。

命令的要点在Docker启动时,可以通过以下方式指定要执行的命令,可以是命令格式或者指定要执行的shell脚本文件。

command: chown xfs:xfs /tmp/wpcli-entrypoint.sh &&
         sh /tmp/wpcli-entrypoint.sh mysql exampleuser examplepass

首先,我将绑定挂载的shell脚本文件的权限与WordPress容器中的wp根目录下的执行用户www-data进行了匹配。
WordPress容器的发行版是Debian,用户www-data的uid和gid均为33。
而WP-CLI容器的发行版是Alpine,用户xfs的uid和gid也都是33。
在匹配权限后,我执行了上述的shell脚本。
mysql exampleuser examplepass是我向shell脚本传递的值,
在shell脚本内被读取并赋值给变量后将会被使用。

用户元素这里指定了在WP-CLI容器中使用的Alpine Linux发行版是由哪个用户来执行的,该描述将使其在xfs上执行。

user: xfs

网络要素这是对使用WordPress容器所述的相同指示。
正在指定所属的网络。

networks:
    - default

环境要素这也是使用WordPress容器指定的相同内容。
有时也需要使用WP-CLI来操作MySQL,所以这是必需的。

    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: wordpress

MySQL容器mysql:
在这里创建了一个MySQL容器。

平台的要素
在使用M1芯片的Mac上,需要有平台元素。如果CPU是intel的话,就要删除它。

    platform: linux/x86_64

数量在这里指定的是稍后提及的数据专用容器的卷。目前还没有卷本身。
通过将数据库容器和用于存储数据的容器(数据专用容器)分开,可以更容易地进行数据库版本差异测试和更改数据库本身进行测试等操作。

volumes:
    - example-dbdatavolume:/var/lib/mysql

数据专用容器数据专用容器是一个轻量级的命令集和软件包,被称为busybox。使用以下命令可以启动容器并同时进入容器内部。
通过执行此命令还会创建一个名为example-dbdatavolume的卷。

docker run -i -t --name example-dbdatacontainer --mount source=example-dbdatavolume,target=/var/lib/mysql busybox

闲话少谈,如果使用ls -la命令查看根目录的结构,你会发现容器的目录结构与Linux几乎完全相同。
由于在这里我们没有特别的操作需要进行,因此你可以使用以下命令退出容器。

exit

如果能够设置到这一步,那么准备工作就完成了。

启动容器那么让我们启动容器吧。

启动代理容器首先,在终端上打开并切换到主机操作系统上创建的代理容器目录。
然后使用以下命令启动容器。

docker compose up -d

这样代理服务器就启动了。

命令行界面+应用程序+数据库容器启动然后,切换到在本地环境创建的目录,并执行以下命令。

docker compose up -d

现在CLI+应用程序+数据库容器已经启动了。
我想数据专用容器可能已经处于Exited状态,但它会正常运行。

使用浏览器进行访问我会检查之前设置的hosts文件配置,并在浏览器中尝试使用设置的地址(例如example.com)进行访问。
虽然会有证书警告,但这次我们是访问自己创建的环境(0.0.0.0),所以会直接点击访问链接(只有点击按钮或链接才会显示)。
如果成功显示WordPress,就表示完成了。

只需一个选项,在中文中进行合理地语义重新编排:
要进入管理界面我要访问example.com/wp-admin。
用户名和密码将使用在Shell脚本的wp core install行中指定的那组输入。

自动化安装插件等,如果要创建多个相似的网站。按照本次的步骤进行,我认为会在作为主机操作系统本地环境创建的目录中自动创建wp-content目录。
这是WordPress容器的以下行。

    - ./wp-content:/var/www/html/wp-content

如果在主机操作系统上没有指定的目录,则会将容器内的目录复制到主机操作系统中。换句话说,将复制WordPress初始设置的wp-content目录。

如果您经常使用插件或基本主题,您可以事先将wp-content目录放在主机操作系统上,然后它会被复制到Docker容器中。

一旦下载插件等就可以跳过。
通过在WP-CLI的Shell脚本中添加命令,
也可以实现插件更新等的自动化。

如果Docker容器无法启动有时候容器无法启动。原因可能多种多样,但是首先尝试改变启动方式,这样可以看到进程。

docker compose up

如果去掉选项d,日志将以实时方式显示,而不是在后台显示,这样非常方便。

只要在终端打开一个新标签页,就可以正常使用docker命令了。

如果想要分享环境基本上,我们可以将本次创建的两个目录分别是代理目录和CLI+WP+DB目录复制到另一台电脑上,并通过docker compose up进行移动。如果使用docker run以相同方式创建数据专用容器,我认为可以进行共享。

結語最近我购买了M1Mac,并且重新审视了我的环境。由于我可以将WP-CLI容器整合进来,因此我进行了总结。(以前我是自己编写了Shell脚本)如果您能指出我使用方法错误的地方、难以理解的地方或者还有其他可以更加高效的地方,我将非常高兴。

bannerAds