从零开始使用docker搭建wordpress博客

  • 之前已经写了一个建站日记了Ubuntu 16.04 & Docker 搭建 WordPress,不过之前的版本有点像记流水账一样,现在有时间想重新组织语言,记录一下wordpress博客的搭建流程。
  • 这篇文章适用于那些不希望无脑搭建博客,但又希望以最简单的方式明明白白搭一个博客的读者取用。

本博客是由Wordpress搭建而成,如果你感兴趣的话,可以在博客中四处逛逛,看看这是不是可以解决你的需求的东西。实际上,Wordpress不仅仅可以搭建个人博客,而且还可以设计为公司主页,产品展示页面。接下来,我将从原理上介绍搭建Wordpress的流程。

WordPress博客的组成部分

PHP编写的后端逻辑

WordPress博客是一个使用PHP编写而成的博客系统,Wordpress使用PHP这个世界上最好的语言实现了网站的内部逻辑,诸如用户登录,插件管理等功能。至于PHP为什么是世界上最好的语言,有图为证↓。

至于PHP本身在Wordpress里面好用的一点,就是我们可以比较方便得修改它。比如这篇文章末尾的转载标签,就是通过手工修改PHP代码实现的(当然这里的手工也是通过博客页面上面的工具实现的),即使你不会PHP,只要知道在PHP语言中 <?php ... ?> 这个代码块内部实现的是程序逻辑,而代码块外面是我们需要显示的HTML代码就好了,也就是说,我们将希望修改的内容放在 <?php ... ?> 外面,就可以很轻松在程序母版上实现内容的添加。

搭载在Nginx服务器上

在PHP语言实现的站点逻辑的更上一层,是可以搭载该逻辑的服务器,由于服务器独立于实现逻辑(PHP程序和Nginx服务器的关系有点像C++语言和Linux系统一样)。主流的服务器有Nginx和Apache,在这里,我们使用Nginx,服务器本身的功能是监听端口,响应请求。

对于一个没有经过特殊设置的Wordpress博客系统,Nginx服务器将监听80端口(也就是我们使用HTTP访问IP没有指定端口时的默认端口)。网页访问者在该端口上的任何请求都会由Nginx解析,并调用指定的PHP程序渲染出我们希望的页面。

Mysql数据库储存网站数据

在结构上和Nginx服务端并列的,是数据库。数据库是一个为了实现数据的查询和储存设计出来的高性能系统,其功能也仅仅限于提供数据的储存于查询接口。诸如注册用户列表,文章内容等都是存在于数据库中的。Wordpress使用了Mysql数据库,这是一个基于表的关系型数据库,就效率上来说比其他数据库会好一些。

正在执行的一个PHP代码,在特定时候需要访问网站的数据(例如处理用户登录时,需要从数据库拉取指定用户的密码用以检验。)。这时,PHP程序将访问数据库,查询指定用户名对应的密码。

一个未经特殊设置的Mysql数据库,监听端口3306,而本机的其他程序,可以通过向该端口发送消息来与数据库交互。

多模块结合工作

在一般的情况下,打在了PHP网页逻辑的Nginx服务器是一个单一模块,Mysql是另一个模块。Nginx服务器在运行时会时不时地向3306端口发送请求以实现对数据库的查询。

两个模块力求尽可能的独立,这样,倘若因为错误的插件安装,你的网站逻辑部分崩了,你只需要重装Nginx-PHP模块,而不会丢失任何的用户数据。同理,对于数据库的修改也不会影响网站本身。

Docker是什么

Docker的原理

WordPress包含两个模块,他们各自的卸载与重装都不会对另一个模块产生影响。当你的服务器上不仅仅有Wordpress,还部署了其他的网站(这个情况实际上非常常见,谁也不能保证你的服务器永远只有一个博客),情况就不一样了。比如多个网站依赖于不同版本的服务端,或者网站各自的模块重装会互相影响等等…..

这时,我们就开始想Linux下面是否有类似于Python中的Anaconda一样的虚拟环境。倘若将这些模块装在互不影响的虚拟环境中,就可以实现相互独立了。或者说,有没有一个像虚拟机一样的东西,将Wordpress需要的两个模块分别运行在不同的虚拟机中,并使用一定的机制将它们关联在一起?这不,还真是有这么样一个虚拟环境,那就是Docker。

Docker在Linux中充当了虚拟机的角色,但是比虚拟机拥有更高的效率。也许是机智的Linux设计者早就预料好了有今天的需求,Linux的诸多设计使得在Docker这样的虚拟环境成为可能。在Docker中,一个虚拟环境的进程可以和主机进程并行运行(没有一个虚拟机一样的机器做翻译),并且从进程内部看,好像在一个与外界隔离的虚拟机中运行一样。

为了尝试说明Docker的原理,你只要知道下面的事实就好了——

  • Linux中有一个chroot指令,这条指令可以将接下来派生进程的根目录设置为主机的某一个目录,考虑如果有一个目录下有完备的/bin、/etc等Linux必备文件(本身Linux的就有Everything is Files的说法),那么我们使用了chroot将一个进程根目录设置为这个目录,那么看起来,这个进程接下来的运行就好像在一个全新的系统中运行一样!
  • 机智的Linux设计者还提供了其他东西,来解决诸如IP地址冲突,端口冲突的问题,总之,一个“虚拟机”中的进程可以实际运行在主机中而不干扰主机的任何工作。
  • Linux有文件映射与可持久化的机制,可以在一个固定文件版本的基础上,通过增量的方式快速构造另一个只有少量修改的文件版本(比如我有一个Ubuntu系统,我可以同时构造出一个安装了Wordpress的Ubuntu系统和安装了Mysql的Ubuntu系统,而总共占据了1个Ubuntu系统多一点的空间)。

确定了解了上述事实后,我们就很容易理解Docker究竟在干什么了——

Docker中存在两个概念,镜像与容器,镜像是一系列静态的文件打包,比如Ubuntu镜像,里面包含了所有Ubuntu运行需要的文件(也就是我们平常所看到的新的Ubuntu系统从根目录向下的所有文件);而容器则可以理解为可以运行、停止镜像,比如运行着的Ubuntu容器,在镜像的基础上,由于容器自身的运行,其内部的一些文件必然发生改变,Docker以花费极少的空间,用可持久化的方式追踪这些文件。而镜像和容器的关系是:一个镜像可以派生出多个容器,容器在运行并修改了自身后,又可以由特定docker命令固化为镜像。倘若之后读者成功建立了Docker容器,不妨到 /var/lib/docker/aufs/mnt 目录看看,你就知道容器是什么东西了。

在使用Docker建立出的纯净的系统中,我们可以从零开始搭建自己想要搭建的东西,自然而然就会有人建立一些常用环境的镜像并开源。这些镜像都收录于DockerHub中。比较著名的是Ubuntu镜像Mysql镜像以及WordPress镜像。当然,如果将整个系统镜像上传打包实际上是不妥的,用户并不能知晓这个镜像是如何制造出来的,故存在一个称之为Dockerfile的文件可以将生成这些镜像的方法“开源”,Dockerfile内部指名了这个镜像是基于什么镜像,并在该镜像基础上执行了哪些Bash命令得到的。比如我们需要基于Ubuntu镜像生成Mysql镜像可以理解为在Ubuntu镜像的文件系统中执行一条Mysql安装语句(当然,实际的实现可能会复杂一些)得到的新的文件系统。

使用Docker搭建一个博客

下面将介绍如何使用docker的原生命令建立一个Wordpress,该方法也可以在Wordpress的DockerHub镜像页面找到。不过这个方法可以被下一节中的Docker-Compose方法取代——

首先,我们先拉取我们需要的wordpress,以及mysql镜像

这里已经可以看到Docker镜像的文件系统的分层性质了,每一个十六进制的Tag都表示一个文件系统的版本。在生成mysql镜像的时候复用了wordpress镜像的一部分文件。这些文件就是这两个镜像所共有的Linux内核。

在DockerHub的Mysql页面,我们可以找到生成Mysql的容器的命令——

这里,输出结果 5f99a8d32f88f047da392fc764a5bf247a2b07440416a13942fb02891c0ce550 是新建出的容器ID,之后可以使用 docker ps 查看。在这一个步骤,我们建立了名为some-mysql的数据库容器,其密码为my-secret-pw,是基于mysql镜像建立的。

同理,在DockerHub的Wordpress页面,我们可以找到生成Wordpress容器的命令——

这里,我们新建了一个名为some-wordpress的Wordpress容器,依赖于名为wordpress的镜像。单独讲解一下–link参数的意义:由于两个容器互不干扰,可以理解为两个独立的主机,那么他们的通讯方法之一就是使用IP+端口通讯,那么这个参数的意义就是将some-mysql容器的IP地址储存在新建的some-wordpress容器的hosts文件中的一个名为mysql的项中,换句话说,之后再some-wordpress中,访问mysql:3306就能够访问到some-mysql的主机3306端口,进而建立起不同容器的通讯。而-p参数则代表将容器内部的80端口暴露为主机的8080端口。

更多细节有,docker常用的命令还有:

  • docker build :自己写一个Dockerfile,并让docker依照该Dockerfile新建一个镜像
  • docker ps -A :同时打印出由于各种错误导致停止的容器,而非正在运行的容器
  • docker stop :停止容器
  • docker restart :运行一个之前停止的容器

倘若之前的步骤没有任何问题的话,使用 docker ps 可以看到刚刚建立的两个进程正在运行。而如果有问题的话,也可以使用 docker ps -A 看到已经停止运行的容器,并用 docker logs <Container ID> 查看运行日志。

而访问主机的127.0.0.1:8080可以进入Wordpress的初始欢迎页面——

剩余部分就可以自由发挥啦~

Docker-Compose

Docker-Compose是一个可以将之前执行的一系列安装命令自动化的脚本。安装Compose可以按照官方文档的指示安装,由于这个依赖于平台,就不细讲了,如Linux可使用如下命令安装。

安装一个Wordpress使用Docker-Compose只需要在一个自定义的目录中,写一个如下的 Wordpress/docker-compose.yml 文件——

实际上,这个文件中的每一行,都是用来提供之前命令中需要的参数,而与上一节的内容对应,读者应该很容易了解每一行都在干什么——

  • 第一行是新建容器标识,仅仅用于内部的解析使用
  • 第二行是容器基于的镜像名称
  • 第三行、第四行表示内部端口和外部端口的映射
  • 第五行表示一些内部的设置,比如数据库密码等
  • 第六行用于连接mysql容器
  • 第七行是容器名
  • 后面mysql的部分相似

接着,使用 docker-compose -f Wordpress/docker-compose.yml up -d 命令启动。这一个命令可以得到上一节的相同结果。

更多细节是,docker-compose的up参数可以替换为stop、rm等命令。

注意事项

在本文中,我们将内部wordpress的80端口映射到了外部的8022端口,读者倘若希望仅仅建立博客的话,应该映射到外部80端口(因为80端口是HTTP请求的默认端口)。我这样做的原因是我的服务器上面搭载了不同的网站,而这些网站需要通过判断用户访问的域名来决定究竟将请求分发到那个处理容器中,因此在我的处理中,我还有一个外部的nginx服务器,用于域名的分发,将mhy12345.xyz这个域名下的所有访问都映射到8022端口上去,进而被容器截获。

原创文章地址:【从零开始使用docker搭建wordpress博客】,转载时请注明出处mhy12345.xyz

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.