如何使用Docker部署WordPress网站

时间:2020-01-09 10:34:19  来源:igfitidea点击:

总览

Docker的优点在于应用程序变得可移植。除此之外,它还允许对整个实例进行版本控制,从而提供一种快速回滚,更新和审核的机制。本教程将通过为它创建映像并进行部署,向我们展示如何使用Docker托管WordPress网站。

在Docker中运行WordPress

在Docker中运行WordPress站点的最简单示例就是下拉官方WordPress映像。

docker pull wordpress

如果我们更喜欢使用特定版本的WordPress,则可以在提取图像时指定。例如,我们可以下拉4.9.5版本。

docker pull wordpress:4.9.5

要从我们下拉的图像中运行WordPress容器,我们运行以下命令。

docker run -d -p 80:80 wordpress:4.9.5

使用docker ps命令验证映像正在运行。输出将显示容器状态,名称和网络信息。

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
41442d5c2e9b        wordpress:4.9.5     "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   awesome_tu

看起来一切正常。我们能够部署一个新的WordPress网站,对其进行配置并发布内容。但是,如果我们想要开箱即用的自定义配置,而不是原始安装,该怎么办?我们将需要根据使用的WordPress创建自己的Docker映像。

创建Dockerfile

  • 创建用于创建新图像的工作区。
mkdir ~/Workspace/Docker/Wordpress
  • 在工作区中创建一个名为Dockerfile的新空文件。
touch ~/Workspace/Docker/Wordpress/Dockerfile
  • 在文本编辑器中打开Dockerfile。
vi ~/Workspace/Docker/Wordpress/Dockerfile
  • 添加以下行。
  • 保存更改并退出文本编辑器。
  • 构建自定义WordPress图像。
docker build  -t myblog/wordpress:1.0.0 ~/Workspace/Docker/Wordpress

运行自定义WordPress Docker容器

让我们基于新的Docker镜像运行一个容器。

  • 根据图像启动一个新的容器。
docker run -d -p 80:80 myblog/wordpress:1.0.0
  • 使用docker ps确认容器正在运行。
docker ps
CONTAINER ID        IMAGE                    COMMAND        CREATED             STATUS              PORTS                NAMES
8a5cb628c0c0        myblog/wordpress:1.0.2   "docker-entrypoint.s…"   15 seconds ago      Up 13 seconds       0.0.0.0:80->80/tcp   nifty_hopper
  • 打开网络浏览器,检查该站点是否可访问。

自定义WordPress图像

我们根据官方的WordPress图片制作了一张新图片。但是,两者之间没有区别。让我们自定义我们的以满足需求。

我们将在预先安装了主题的情况下播种新图像。我们还将添加几个插件。

  • 在Docker映像的工作区中,为主题创建一个新目录。
mkdir -p themes/mytheme
  • 为插件创建一个新目录。
mkdir plugins
  • 将主题提取到themes目录中,或者从存储库中克隆它。
git clone http://github.com/example/mytheme.git themes/mytheme
  • 将每个插件解压缩到plugin目录中。
cd plugins
tar xvf path/to/plugin1.tar.gz
tar xvf path/to/plugin2.tar.gz
  • 使用COPY Dockerfile指令在构建过程中将主题和插件复制到映像中。打开Dockerfile并添加以下行
COPY themes/mytheme /var/www/html/themes/mytheme
COPY plugins/plugin1 /var/www/html/plugins/plugin1
COPY plugins/plugin2 /var/www/html/plugins/plugin2

使主题,插件和上传持久化

将主题,插件和上传内容植入WordPress图像的问题在于对它们的任何更改都不会持久。这是因为Docker容器是短暂的—运行时对其进行的所有更改都将在容器停止时丢失。

通过使用Docker的卷功能,我们可以确保在重新启动容器时保留对某些目录的所有更改。

  • 在文本编辑器中打开Dockerfile。
vi Dockerfile
  • 为主题,插件添加卷。并上传WordPress目录。
VOLUME ["/wp-content/themes/mytheme","/wp-content/plugins","/wp-content/uploads"]
  • 保存更改并退出文本编辑器。
  • 生成WordPress图像的新版本。
docker build -t myapp:0.0.1 .

让我们运行新图像并测试对主题,插件或者上载的所有更改是否持久。

  • 根据最新图像启动一个新的容器。
docker run -d -p 80:80 myapp:0.0.1
  • 验证容器正在运行。
docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                NAMES
8a5cb628c0c0        myblog/wordpress:1.0.2   "docker-entrypoint.s…"   15 seconds ago      Up 13 seconds       0.0.0.0:80->80/tcp   nifty_hopper
  • 在网络浏览器中打开WordPress网站。
  • 安装插件。
  • 上载一些图像。
  • 停止WordPress容器。首先使用docker ps命令标识docker映像ID,然后将其与docker stop命令一起使用。
docker ps
docker stop nifty_hopper
  • 验证该容器不再运行。
docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                NAMES
  • 查看插件,主题的内容,并上载目录。
ls ./plugins
ls ./themes
ls ./uploads

根据图像启动一个新的WordPress容器。

docker run -d -p 80:80 myapp:0.0.1
  • 在网络浏览器中打开WordPress网站。
  • 确认插件和图像仍然可用。

指定安装目标

现在,我们为WordPress网站的某些部分提供了持久存储,这些持久存储需要比容器的生命周期更长的时间。创建所有卷时,会将所有卷写入Docker管理的文件系统上的未指定位置。
要指定我们希望从中挂载卷的文件系统上的位置,可以使用-v标志来指定。

docker run -d -p 80:80 -v themes/mytheme:/var/www/html/wp-content/themes/mytheme -v plugins:/var/www/html/wp-content/plugins -v uploads:/var/www/html/wp-content/uploads myapp:0.0.1
  • 导航到http:// localhost /,在Web浏览器中打开WordPress网站。
  • 确认主题可用。
  • 验证插件可用。
  • 将一些图片上传到WordPress实例。
  • 在命令行中,验证我们上载的目录中是否提供了我们上载的图像。

降低容器的特权

默认情况下,容器将以Root身份运行。这可能会导致意外的安全漏洞,可以通过更改容器运行的用户身份轻易地阻止这些漏洞。

默认情况下,容器将以Root身份运行。这可能会导致意外的安全漏洞,可以通过更改容器运行的用户身份轻易地阻止这些漏洞。

Dockerfile有一条USER指令,可让我们指定具有运行容器所需的最少特权的用户。如果要从文件系统装载卷,则作为成员的用户或者组将需要访问目录。

  • 为WordPress容器创建一个新用户。
useradd wpuser1
  • 授予主题,插件和上载目录的所有权,容器将从中挂载到我们的新用户。
chown -R wpuser1 themes
chown -R wpuser1 plugins
chown -R wpuser1 uploads
  • 将USER指令添加到Dockerfile中。
USER wpuser1

在生产中运行容器

在生产环境中,我们要确保容器始终处于运行状态。例如,我们的WordPress网站应该能够承受容器故障和系统重启。

我们可以通过多种方式实现这一目标。最简单的方法是设置容器的重启策略。可以使用以下策略。

关闭(默认)容器不会自动重新启动
发生故障时发生故障后,容器将自动重新启动。可以通过在末尾添加:来应用限制。例如,将重新启动限制为5次失败,只有在-失败:5.
除非停止除非手动停止,否则容器将始终自动重新启动
始终容器将始终自行重新启动

除非停止,否则一个好的政策应从头开始。除非我们出于管理原因将其停止,否则这始终可以确保容器按计划运行。

我们在容器启动时使用-restart标志和策略来设置策略。以下示例显示了如何将重新启动策略设置为"除非已停止"。

docker run -d -p 80:80 -restart unless-stopped myblog:0.0.1

将所有内容放在一起以运行WordPress的docker命令如下所示

现在,如果我们必须继续记住执行这样一个冗长的命令,则可维护性开始成为问题。我们可以通过引入docker-compose大大简化这一切。

使用Docker Compose

Docker compose是Docker内置的工具,可让我们定义容器的起始条件。

要启动我们的WordPress网站,我们现在只需要记住运行docker-compose即可。运行WordPress网站所需的所有卷和环境变量均已定义为docker-compose.yml文件。

编排

虽然直接直接运行docker命令并设置重启策略或者使用Docker Compose可以很好地进入生产环境中运行容器,但环境的下一个发展应该是引入编排。

Docker最受欢迎的两个编排解决方案是Kubernetes和Docker Swarm。

本主题超出了本教程的范围。设置业务流程层非常复杂,并且仅运行几个容器时不太可能受益。这不是运行博客的成本优化的方法。

但是,如果我们正在运行大量需要高可用性的WordPress网站,那么编排将是非常有益的。