云服务器

首先一般搭建动态博客都会有一个云服务器,国内的话供应商一般是阿里云或者腾讯云,我这里使用的是腾讯云,基本的操作逻辑大同小异。

下面是我服务器的配置信息。

安装 Docker

yum 换源

首先将 yum 进行换源处理,以获得更快的下载速度。备份 CentOS-Base.repo 文件,以便更改配置文件出错恢复默认。

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

之后下载新的 CentOS-Base.repo/etc/yum.repos.d

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo

根据自己服务器的版本下载相应的配置文件,比如机器的操作系统是 CentOS7,就把下载链接最后的部分改为 CentOS-7.repo

下载成功后运行 yum makecache 生成缓存即可,这样使用 yum 下载软件包时访问的就是阿里的镜像,速度会快很多。

安装 Docker

在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库,之后就可以从仓库安装和更新 Docker。

先安装所需的软件包,yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-datalvm2

yum install -y yum-utils device-mapper-persistent-data lvm2

使用以下命令来设置稳定的仓库,国内的阿里源会加快下载速度。

sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装最新版本的 Docker Engine-Communitycontainerd

yum install -y docker-ce docker-ce-cli containerd.io

安装后输入 serivce docker status 查看 Docker 运行状态,如下所示即正常运行。

Docker 换源

修改镜像配置文件。

vim /etc/docker/daemon.json

添加国内源。

{
    "registry-mirrors": [
       "https://docker.mirrors.ustc.edu.cn",
       "http://hub-mirror.c.163.com",
       "https://registry.docker-cn.com"
    ]
}

使用 service docker restart 命令重启 Docker 服务后生效。

安装 Typecho 依赖环境

所有容器依赖的一些数据都放在 /data 目录下,包括数据库、网站源码、Nginx 的 conf 等,目的是为了以后迁移方便,直接将 /data 拷贝到新服务器就可以。

安装数据库 MySQL

使用 Docker 安装 MySQL5.7,注意密码项的自定义修改。

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --mount type=bind,source=/data/mysql,target=/var/lib/mysql --restart=always --name mysql5.7 mysql:5.7

--mount 命令也可以用 -v /data/mysql:/var/lib/mysql 代替,官方更推荐使用 --mount,详情请看官网

对于 docker run 命令的部分参数说明:

  • -d 代表 daemon,即后台运行。
  • -p 是映射容器的3306端口到宿主机的3306端口,规则是:-p IP:host_port:container_port
  • -e 是设置 MySQL 的密码。
  • --mount 是让容器的/var/lib/mysql 映射到宿主机的 /data/mysql 目录中。
  • --restart=always 是为了在 Docker 重启时,容器能够自动启动。

安装 Nginx

docker run -p 80:80 -p 443:443 --mount type=bind,source=/data/nginx/conf.d,target=/etc/nginx/conf.d --mount type=bind,source=/data/solution,target=/data/solution --restart=always -d --name nginx nginx
  • --mount type=bind,source=/data/nginx/conf.d,target=/etc/nginx/conf.d 是为了将 Nginx 的配置目录映射到宿主机的目录中,这样当 Nginx 容器被销毁时,依然能保留配置。
  • /data/solution 用于存放网站项目,也是为了数据与容器分离。
  • -d 这里同时映射了80和443端口。

安装 PHP

可以在 PHP 的官方镜像源找到最新版本的 PHP,在实际使用中,我们可能还需要装一些 PHP 的扩展,而官方源中支持已经帮我们安装了一些扩展的 PHP 镜像,如 php:<version>-fpm,其中的 <version> 指的是 PHP 版本,具体可以从官方镜像源找到。

docker run --name php-fpm -p 9000:9000 --mount type=bind,source=/data/solution,target=/data/solution --restart=always -d php:7.4-fpm

这里也将网站根目录 /data/solution 映射到 PHP 容器中,为了 PHP 能正确读取 Nginx 中的 root 配置项。

由于 Typecho 需要用到 pdo_mysql 扩展,因此要在 php-fpm 上安装这个扩展。

# 进入到`php-fpm`容器内部
docker exec -it php-fpm bash
# 安装扩展
docker-php-ext-install pdo_mysql
# 查看是否已经成功安装
php -m
# 退出容器
exit

安装后重启 php-fpmpdo_mysql 则安装成功。

docker restart php-fpm

自定义 Bridge 网络

执行命令看一下,现在机器上已经运行着 Nginx、PHP、MySQL 三个服务,现在需要让它们之间能够相互通信,这里使用自定义 Bridge 网络的方法。

实际上启动容器时,Docker 会将容器绑定到默认的 Bridge 网络中,使用 docker network inspect bridge 命令打印此时默认的网络:

[
    {
        "Name": "typecho",
        "Id": "d9d06a7e7410e75183eb09019bb895a12a01d2f7405f80e09d40811c578ff396",
        "Created": "2021-06-11T13:10:53.453912588+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "2d4b9daf908252e40b8cca8e772e9dece8c1c36a467f2846fc0786d4964817cd": {
                "Name": "mysql5.7",
                "EndpointID": "8afe4a42884234acda9c8b996faed20d98015e6c919455edaf0d24f63bc22764",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            },
            "8cd032a4eeff30e7a54d81b6f92449160b243c793ba9d1a239cb4587896f2721": {
                "Name": "php-fpm",
                "EndpointID": "211aa7e5ab248aee84cc7875b76842037e1c597eb3f5b546b3705ac971c52c0a",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "ff4b411e355f1000552b892601164499a0c077fdd4a8eb22bb8c5e92f0757d83": {
                "Name": "nginx",
                "EndpointID": "e10b908ac0e0f6bd872a0b23d7ff30f58845700b7fe48568325d73ad38ba1747",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

可以看到 MySQL、php-fpm、Nginx 在默认 Bridge 中的 IP 分别是 172.18.0.2172.18.0.4172.18.0.3, 可以通过容器在宿主机中的 IP 来访问对应的服务,比如 php-fpm 想要访问 MySQL,可以在 php-fpm 容器中通过 172.18.0.2:3306 来访问。

这种方式只能使用 IP 来访问对应的容器的服务,而 IP 可能会变化的,因此是不推荐使用在生产环境的。而用户自定义的 Bridge 网络,不仅支持 IP 访问,还支持直接使用容器名称访问。

创建一个自定义 Bridge 网络,假设名称是 typecho

docker network create typecho

通过 docker network connect ${网络名} ${容器名} 来将容器绑定到 typecho 网络上。

docker network connect typecho mysql5.7
docker network connect typecho php-fpm
docker network connect typecho nginx

现在三个容器已经绑定到自定义的 Bridge 网络上了。例如,在 Nginx 容器中,就可以直接通过 php-fpm 的名字来调用 PHP 的服务了。

安装 Typecho

进入 MySQL 容器创建数据库 typecho

docker exec -it mysql5.7 bash
mysql -uroot -p 
输入密码
create database typecho;

进入 Typecho 官方下载页面,发现分为稳定版开发版两种,按照一般的软件安装思路,当然是选择稳定版,但是 Typecho 的稳定版在2017年后就没有更新了,会遇到许多问题,比如我之前的安装中就遇到了此类错误 ,随后切换至开发版后问题解决。

复制开发版的下载链接,下载到服务器的 /data 目录下并解压到 /solution 目录下。

wget https://nightly.link/typecho/typecho/workflows/Typecho-dev-Ci/master/typecho_build.zip 

unzip typecho_build.zip -d ./solution/typecho

然后配置 Nginx 使得网站可以正常访问。注意其中 Nginx 要访问 php-fpm,在配置文件中可通过名字访问其 Docker 容器。

server {
    listen 80;
    server_name localhost;
    root   /data/solution/typecho;   # 这里是网站的存放路径
  index  index.php;

    # 下面直接照写
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    
    location ~ \.php$ {
        include fastcgi.conf;
        include fastcgi_params;
        fastcgi_pass php-fpm:9000;
    }
    
}

配置成功后重启 Nginx 容器,访问服务器的 IP 地址,开始配置 Typecho 博客系统。

数据库适配器选择安装好的 pdo-mysql ,因为已经配置了自定义 Bridge 网络,数据库地址填入容器名即可访问数据库。

完成配置信息后会显示如下界面,需要复制文本框中的内容,然后创建 config.inc.php 文件粘贴进去。

vim /data/solution/typecho/config.inc.php

最终会显示安装成功页面,并可以查看默认的用户名和密码。

下面两个链接分别是博客页面和后台控制面板。

Typecho 博客系统至此安装完成。


  1. Centos8使用docker迁移typecho博客
  2. 将CentOS的yum源更换为国内镜像源
  3. CentOS Docker 安装
  4. Typecho 环境配置和博客搭建