本文使用的硬件、软件环境如下:

  • Centos:7.9.2009
  • Docker:23.0.1
  • Docker Compose:v2.6.0
  • Typecho:1.2.0

Docker镜像版本如下:

  • nginx:1.22-alpine
  • mysql:5.7
  • php:7.4-fpm

简介

Typecho本身是一个轻量级博客系统,部署服务器上也占用不了多少资源,为什么我要选择使用docker来部署呢?主要原因有以下几点:

  • docker容器与服务器主机,docker容器之间隔离,不会影响服务器主机上的其他应用或配置
  • 部署、迁移很方便

Typecho项目开源地址:https://github.com/typecho/typecho

Typecho官网地址:https://typecho.org/

安装Docker和Docker Compose

Docker

安装必要的相关软件

sudo yum -y install gcc gcc-c++ yum-utils

设置yum镜像仓库

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国内服务器

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo          #境外服务器

更新yum软件包索引

sudo yum update -y  #更新yum软件包

sudo yum makecache fast #更新yum缓存

安装docker

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

启动docker

sudo systemctl start docker

查看docker状态

sudo systemctl status docker

查看docker版本信息

sudo docker version

设置docker开机自启

sudo systemctl enable docker

设置镜像加速器地址

sudo mkdir -p /etc/docker/daemon.json   #境外服务器不需要设置此项

然后将以下内容粘贴到daemon.json文件中,保存后退出

{
  "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}

注意:Docker仅支持CentOS7及以上版本,Linux内核3.8及以上版本,,安装Docker前请检查CentOS版本和Linux内核版本,使用cat /etc/redhat-release命令查看CentOS版本,使用uname -r命令查看Linux内核版本

Docker Compose

下载docker-compose到指定目录下

sudo curl -SL https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

添加可执行权限

sudo chmod +x /usr/local/bin/docker-compose

创建软链接

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

查看docker-compose版本

sudo docker-compose --version

准备工作目录

为了方便管理,我们创建一个目录作为搭建typecho博客系统所有数据的根目录,并在下面创建对应的子目录。这里我选择/var/www/elonlo.top作为typecho根目录,可以根据自己情况自行修改。

创建后的目录树结构如下:

├── docker-compose.yml
├── mysql
│   ├── my.cnf
│   ├── logs
│   └── mysql.env
├── nginx
│   ├── conf.d
│   │   └── typecho.conf
│   └── nginx.conf
├── php
│   └── Dockerfile
└── typecho

修改mysqllogs目录权限

sudo chmod 777 /var/www/elonlo.top/mysql/logs

配置文件

各配置文件参考内容如下:

docker-compose.yml

version: "3"
services:
  web:
    image: nginx:1.22-alpine
    container_name: typecho-nginx
    ports:
      - "17200:80"
    restart: unless-stopped
    volumes:
      - $PWD/typecho:/var/www/html
      - $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf
      - $PWD/nginx/conf.d:/etc/nginx/conf.d
      - $PWD/nginx/logs:/var/log/nginx
    depends_on:
      - php
    networks:
      - typecho_network

  php:
    build:
      context: $PWD/php
      dockerfile: Dockerfile
    restart: unless-stopped
    container_name: typecho-php
    ports:
      - "17201:9000"
    volumes:
      - $PWD/typecho:/var/www/html
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - db
    networks:
      - typecho_network

  db:
    image: mysql:5.7
    container_name: typecho-mysql
    restart: unless-stopped
    ports:
      - "17202:3306"
    env_file:
      - $PWD/mysql/mysql.env
    volumes:
      - $PWD/mysql/data:/var/lib/mysql
      - $PWD/mysql/logs:/var/log/mysql
      - $PWD/mysql/conf.d:/etc/mysql/conf.d
      - $PWD/mysql/my.cnf:/etc/mysql/my.cnf
    networks:
      - typecho_network 

networks:
  typecho_network: {}

mysql.env

# root用户密码,自行修改
MYSQL_ROOT_PASSWORD=xxx 
# 创建容器时创建并使用指定的数据库
MYSQL_DATABASE=blog
# 创建普通用户
MYSQL_USER=typecho
# 普通用户密码,自行修改
MYSQL_PASSWORD=xxx
# 指定数据库所在时区
TZ=Asia/Shanghai

my.cnf

[client]
port = 3306 # 客户端连接MySQL的端口号

default-character-set = utf8mb4 # 客户端连接MySQL时默认使用的字符集

[mysql]
no-auto-rehash  # 禁用自动重哈希功能

[mysqld]
port = 3306 # MySQL监听的端口号

bind-address = 0.0.0.0  # 绑定的IP地址,0.0.0.0表示所有可用的IP地址

character-set-server = utf8mb4  # 服务器端使用的默认字符集
collation-server = utf8mb4_unicode_ci   # 服务器端使用字符集校对规则

skip-name-resolve   # 禁用DNS反向解析,加速连接建立速度

max_connections = 200   # 最大连接数

# SQL模式,可以根据需求进行调整
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

log-error=/var/log/mysql/error.log  # 错误日志文件路径

pid-file=/var/run/mysqld/mysqld.pid # MySQL进程ID文件路径

nginx.conf

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # 将Nginx代理的所有请求实体的大小限制为20m
    client_max_body_size 20m;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    include /etc/nginx/conf.d/*.conf;
}

typecho.conf

server {
    listen          80;
    server_name     localhost;
    root            /var/www/html;
    index           index.php index.html index.htm;
    access_log      /var/log/nginx/typecho_access.log main;
    #charset koi8-r;

    # 地址重写
    if (-f $request_filename/index.html){
        rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename/index.php){
        rewrite (.*) $1/index.php;
    }
    if (!-e $request_filename){
        rewrite (.*) /index.php;
    }

    location ~ .*\.php(\/.*)*$ {
        fastcgi_pass   php:9000;
        fastcgi_index  index.php;
        fastcgi_param  PATH_INFO $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param  SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }      
}

Dockerfile

FROM php:7.4-fpm
MAINTAINER [email protected]
RUN apt-get update && docker-php-ext-install pdo_mysql && echo "output_buffering = 4096" > /usr/local/etc/php/conf.d/php.ini

然后将下载的typecho压缩包解压后复制到当前typecho目录下,最后,完整的目录树结构如下:

├── docker-compose.yml
├── mysql
│   ├── my.cnf
│   ├── logs
│   └── mysql.env
├── nginx
│   ├── conf.d
│   │   └── typecho.conf
│   └── nginx.conf
├── php
│   └── Dockerfile
└── typecho
    ├── admin
    ├── changelog.txt
    ├── CODE_OF_CONDUCT.md
    ├── index.php
    ├── install
    ├── install.php
    ├── LICENSE.txt
    ├── README.md
    ├── tools
    ├── usr
    └── var

注意:如果你的服务器是云服务器,请在防火墙下放行17200、17201、17202端口,并在云服务器后台控制面板中安全组放行上述端口。

创建并启动容器

Typecho根目录(即/var/www/elonlo.top)下执行以下命令创建容器

sudo docker-compose up -d

创建后使用以下命令查看容器是否启动成功,如下图所示表示启动成功

sudo docker ps

image-20230729101807368

安装Typecho

初始化

浏览器访问yourip:17200会跳转到http://your:17200/install.php,此时会看到以下界面

blog-image-20230514101841124

如出现提示上传目录无法写入, 请手动将安装目录下的 /usr/uploads 目录的权限设置为可写然后继续升级,请修改目录对应的权限,命令如下:

sudo chmod 777 /var/www/elonlo.top/typecho/usr

配置数据库

blog-image-20230514105629947

blog-image-20230514104907728

修改后台配置

blog-image-20230514110240683

安装成功

blog-image-20230514110457323

网盘文件

考虑到某些小伙伴可能访问Github速度慢,故提供了docker-compose可执行文件和typecho压缩包

注意:因网盘上传文件名后缀限制,故将docker-compose文件改名为docker-compose.txt上传,下载后请去掉.txt后缀

参考资料

使用Docker-compose部署个人博客Typecho