白驹过隙,这篇文章距今已有一年以上的历史。技术发展日新月异,文中的观点或代码很可能过时或失效,请自行甄别:)

缘起

由于上周企鹅云学生机超级大促销,恰逢千万云和在香港的云主机都快要到期,果断薅了6年多的低配主机,由于涉及到博客的迁移,为了让以后的更加省事儿和方便,决定将typecho搭建的博客全部用docker进行部署。在这里记录下,方便后期。

安装docker

docker官网很详细,安装教程见https://docs.docker.com/install/,选择具体的平台一步一步进行安装即可

不过由于大家都懂的原因,国内的云服务器如果不采用镜像的话,从docker官方仓库拉取仓库那是相当地。。。慢,更改一下docker镜像仓库。把docker国内官方镜像https://registry.docker-cn.com加入配置即可,这里以Ubuntu为例,假设按照官方教程安装后,只需要修改/etc/docker/daemon.json文件并添加上registry-mirrors键值,如下:

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

安装docker-compose

因为typecho需要nginx(或者apache,caddy等webserver),phpmysql才能运行,因此我们需要至少3个镜像,为了方便管理,我们这里采用docker-compose来进行管理,由于docker-compose在Ubuntu下默认并未安装,因此需要安装docker-compose,官方安装教程见https://docs.docker.com/compose/install/

构建php镜像

由于官方的PHP镜像中没有安装pdo_mysql扩展,因此我们需要自行构建一个带有pdo_mysql的PHP镜像,使用Dockerfile如下进行构建:

FROM php:7.2.3-fpm
MAINTANER scofield<mail@pjf.name>

RUN apt-get update
RUN docker-php-ext-install pdo_mysql

执行命令docker build -t scofieldpeng/php:7.2.3-fpm进行构建,构建完毕后执行docker images|grep scofieldpeng/php:7.2.3-fpm如果不为空即为构建成功

启动和运行typecho

一切就绪后,我们准备下面文件:

# app文件夹下
- docker-compose.yml
- mysql(mysql文件夹,用来存放mysql数据,方便后期导出)
- mysql.env(mysql镜像的环境)
- typecho.conf(nginx配置文件)
- typecho(typecho的安装文件,github下下载即可,注意最新的正式版有安装问题,直接从master分支下拉取)

其中mysql.env文件内容为:

# MySQL的root用户默认密码,这里自行更改
MYSQL_ROOT_PASSWORD=123456
# MySQL镜像创建时自动创建的数据库名称
MYSQL_DATABASE=typecho
# MySQL镜像创建时自动创建的用户名
MYSQL_USER=typecho
# MySQL镜像创建时自动创建的用户密码
MYSQL_PASSWORD=123456

typecho.conf的内容为:

server {
    listen 0.0.0.0:80;
    server_name xxx(这里写自己博客的域名,例如pjf.name);
    root /app;
    index index.php;

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

    location ~ .*\.php(\/.*)*$ {
       include        fastcgi_params;
       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;
       fastcgi_index  index.php;

       fastcgi_pass   php-fpm:9000;
    }
}

然后是docker-compose.yml文件的内容:

version: '2'
services:
  nginx:
    image: nginx:1.13.9-alpine
    ports:
      - "80:80"
    restart: always
    volumes:
      - ./typecho:/app
      - ./typecho.conf:/etc/nginx/conf.d/default.conf
      - logs:/var/log/nginx
    links:
      - php-fpm
    depends_on:
      - php-fpm
  php-fpm:
    image: scofieldpeng/php:7.2.3-fpm
    restart: always
    volumes:
      - ./typecho:/app
    links:
      - db
    depends_on:
      - db
  db:
    image: mysql:5.7.21
    restart: always
    ports:
      - 127.0.0.1:13306:3306
    volumes:
      - ./mysql:/var/lib/mysql
      - logs:/var/logs/mysql
    env_file:
      - mysql.env
volumes:
  logs:

然后执行docker-compose up -d,然后浏览器输入域名或者服务器IP即可进行访问

迁移

如果要迁移,直接将整个文件夹迁移到新的服务器,然后执行docker-compose up -d即可快速进行迁移