如何使用Docker部署WordPress网站
总览
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网站应该能够承受容器故障和系统重启。
我们可以通过多种方式实现这一目标。最简单的方法是设置容器的重启策略。可以使用以下策略。
关闭(默认) | 容器不会自动重新启动 |
发生故障时 | 发生故障后,容器将自动重新启动。可以通过在末尾添加: |
除非停止 | 除非手动停止,否则容器将始终自动重新启动 |
始终 | 容器将始终自行重新启动 |
除非停止,否则一个好的政策应从头开始。除非我们出于管理原因将其停止,否则这始终可以确保容器按计划运行。
我们在容器启动时使用-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网站,那么编排将是非常有益的。