一直以来,typecho 以其简单、美观、主题资源丰富,深受我的喜欢。但是作为一个后端LNMP环境,部署起来相对复杂,虽然有很多一件安装脚本可以使用,但是也往往会花费你一个下午。

迁移到docker是一个很好的方式,免去了基础环境的配置。docker-compose能够轻松的部署和运行,这里简单的记录一下本次迁移的过程。

构建文件目录

$ tree -L 2
. 
├── docker-compose.yml
├── logs
├── mysql
│   └──backup
│           └── blog_lyneee_com.sql
├── mysql.env
├── nginx
│   └── default.conf
└── typecho
    ├── admin
    ├── config.inc.php
    ├── index.php
    ├── install
    ├── install.php
    ├── LICENSE.txt
    ├── usr
    └── var

配置

docker-compose.yml

docker-compose.yml 涉及到了三个镜像

version: "3"

services:
  nginx:
    image: nginx:1.19.10
    ports:
      - "80:80"
    restart: always
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./typecho:/var/www/html
      - ./nginx:/etc/nginx/conf.d
      - ./logs:/var/log/nginx
    depends_on:
      - php
    networks:
      - web

  php:
    image: aschenmaker/typecho-php:v0.0.1
    restart: always
    expose:
      - "9000"
    volumes:
      - ./typecho:/var/www/html
    environment:
      - TZ=Asia/Shanghai
    depends_on:
      - mysql
    networks:
      - web

  mysql:
    image: mysql:5.7
    restart: always
    environment:
      - TZ=Asia/Shanghai
    expose:
      - "3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/logs:/var/log/mysql
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/backup:/tmp/backup
    env_file:
      - mysql.env
    networks:
      - web

networks:
  web:

typecho

需要将原宿主机下的typecho目录复制到 ./typecho下,改版本升级到了php7,而typecho的数据库驱动进行修改。Pdo_Mysql

/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 'typecho_'); # 特别是这里
$db->addServer(array (
  'host' => 'mysql',
  'user' => 'username',
  'password' => 'password',
  'charset' => 'utf8mb4',
  'port' => '3306',
  'database' => 'typecho',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

mysql

配置mysql的账号密码,需要和typecho配置一致

$ cat mysql.env
MYSQL_ROOT_PASSWORD=passwords
MYSQL_DATABASE=typecho
MYSQL_USER=username
MYSQL_PASSWORD=password

导出数据

从原mysql dump数据文件,放置与路径 ./mysql/backup 中。

$ mysqldump -uroot -p --databases typecho >/tmp/blog_lyneee_com.sql

进入容器对mysql数据进行恢复。

$ docker exec -it <mysql-container-name> /bin/bash

root@221fd5088501:/# mysql -u root -p
mysql>use typecho
mysql>source /tmp/backup/blog_lyneee_com.sql

nginx

$ cat nginx/default.conf
server {
    listen 80 default_server;
    root /var/www/html;
    index index.php;

    access_log /var/log/nginx/typecho_access.log main;
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php$1 last;
    }
    location / {
        index index.html index.htm index.php;

        if (!-e $request_filename) {
            rewrite . /index.php last;
        }
    }

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

up

最后使用docker-compose up -d 博客迁移完毕。可以使用systemd unit对该服务进行管理。

systemd

systemd能够方便我们对服务设置开机启动以及空值。这里配置systemd。如果你是ubuntu那么在路径/lib/systemd/system/下生成typecho.service,如果是centos则在/usr/lib/systemd/system/下。

[Unit]
Description= typecho blog service
Requires=docker.service
After=docker.service

[Service]
Restart=always
User=root
Group=docker
WorkingDirectory=<your docker compose file path> # 此处替换成你的docker-compose文件路径
# Shutdown container (if running) when unit is started
ExecStartPre=/usr/local/bin/docker-compose -f docker-compose.yml down
# Pre pull the images before container started
ExecStartPre=-/usr/local/bin/docker-compose pull --quiet
# Start container when unit is started
ExecStart=/usr/local/bin/docker-compose -f docker-compose.yml up
# Stop container when unit is stopped
ExecStop=/usr/local/bin/docker-compose -f docker-compose.yml down

ExecReload=/usr/local/bin/docker-compose pull --quiet
ExecReload=/usr/local/bin/docker-compose up -d

# Add a longer TimeoutStartSec for images pulling
TimeoutStartSec=600

Restart=on-failure

[Install]
WantedBy=multi-user.target

最后,启用对应的service

sudo systemctl enable typecho.service
# 查看对应的状态

sudo systemctl status typecho.service
最后修改:2022 年 01 月 13 日
如果觉得我的文章对你有用,请随意赞赏