前言

其实以前已经写过,如利用docker-compose拉起Typecho的相关文章(具体配置可跳转:【 Traefik2 快速搭建 Typecho 步骤 】)。当时为了方便,用的镜像分别是:image:mysql:5.7,80x86/typecho:latest,前者数据库,后者是作者高度定制的typecho容器。但随着需求的变化,以前的typecho docker容器镜像变得不可用,因为变化略大,这里作个备份。

当时的需求很简单:

  • 1.能把博客从wordpress过渡到typecho,这个也很容易实现,可参考当时的文章(博客程序 从 Wordpress 转到 Typecho步骤 );
  • 2.不需要太多的配置,能通过修改配置文件部份内容,几分种轻松搭建Typecho

上面提到文章确实解决了这些简单的需求,然而也有其自身的局限性,那就是扩展性极差,想实现新功能或修改点什么相当困难。

80x86/typecho:latest”这个typecho 镜像,玩是挺好玩的一个 docker镜像。

然而他是高度定制的,把typecho cms的站点文件也限制进容器里了,还是以快捷方式的形式移到别的目录。如果你随便映射缩主机文件取代容器内typecho的文件,会一直报错 。

利用docker-compose轻松实现Docker搭建Typecho博客

这就极大的限制了站点不断涌现的新需求。比方说,这个docker镜像的typecho版本太老,最后一次更新是4年前,那版本肯定就是typecho1.x时代的。

现在新增需求:

  • 新搭建的typecho能自由指定 Typecho CMS文件目录,方便更新文件或在根目录添加验证文件(方便google,bing等站的站长所有者验证)。
  • 最好还是 nginx+php现成搭配好的镜像提供lnp服务,外加m即可简单组成lnmp环境 。

准备工作(选择lnmp镜像):

1.数据库选择(M):

经测试: mariadb 或 mysql 皆可。

2.Lnp环境选择(选装有pdo驱动镜像):

经测试,之前选的 trafex/alpine-nginx-php7不能用,原因作者说了,为一把包做小,原生不支持pdo驱动的安装,要安装pdo驱动还得自己进容器折腾一翻。

可选择已经配置好pdo驱动的容器,经测试,这个“【fukoy/nginx-php-fpm】”容器,可直接使用于typecho的搭建,提供其中的nginx+phpfm环境。 这里是作者的github仓库:https://github.com/fukoy/docker-typecho

Docker安装 Typecho的步骤

1.直接拉取仓库文件

进入相应的文件夹,拉取带有Typecho 1.2版本的仓库文件。

mkdir typecho1
cd typecho1
git clone https://github.com/fukoy/docker-typecho.git

仓库的文件结构:

利用docker-compose轻松实现Docker搭建Typecho博客

得到的文件结构如上图,有配置好的nginx配置文件及typecho1.2 的文件

仓库文件简单解释:

  • www -> 放typecho cms文件的位置
  • nginx -> nginx 的配置, 要修改网站配置,可修改~/typecho1/docker-typecho/nginx/conf.d/下的typecho.conf
typecho.conf 配置如下(注意fastcgi_pass的配置),自测
server {
    listen       80;
    root /usr/share/nginx/typecho/;
    index index.php index.html index.htm;

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

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

    location ~ \.php$ {
       # try_files $uri $uri/ /index.php?$query_string;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

}

2.根据情况修改相应文件

#### 2.1 修改 mysql.env 文件

mysql.env如下位置:~/typecho1/docker-typecho/mysql.env

# MySQL的root用户默认密码,这里自行更改
MYSQL_ROOT_PASSWORD=password

# MySQL镜像创建时自动创建的数据库名称
MYSQL_DATABASE=typecho

# MySQL镜像创建时自动创建的用户名
MYSQL_USER=typecho

# MySQL镜像创建时自动创建的用户密码
MYSQL_PASSWORD=password

# 时区
TZ=Asia/Shanghai

一般修改password即可。这文件的作用是给docker-compose文件引用数据库时配置相应的数据库及密码。

2.2 修改docker-compose.yml文件

这个typecho仓库的docker-compose 文件位置:~/typecho1/docker-typecho/docker-compose.yml

A. 原docker-compose.yml

A. 原docker-compose默认内容
version: '3'

services:
  web:
    image: fukoy/nginx-php-fpm:php7.4
    ports:
      - '8090:80' #开放端口8090
    restart: always
    volumes:
      - ./www:/usr/share/nginx/typecho/ #typecho网站文件
      - ./nginx/conf.d:/etc/nginx/conf.d #nginx配置文件夹
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf #nginx配置文件
    depends_on:
      - mysql
    networks:
      - web

  mysql:
    image: mariadb
    restart: always
    expose:
      - '3306' #不开放端口
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/logs:/var/log/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    env_file:
      - mysql.env
    networks:
      - web

networks:
  web:
  • 如果没特殊要求,直接端口访问,可以不修改这个typecho仓库的docker-compose文件,启动后带穿透端口访问即可,也就是上面的web映射端口8090。访问方式:http://dmian.com:8090/。
  • 如果根据以前沿用的配置文件,利用traefik2进行反代,docker-compose文件配置文件要做相应的修改。访问方式:https://www.domain.com/。traefik2自动转换https进行访问。

B. 利用traefik2进行反代相关设置

B.1 traefik反代typecho的docker-compose文件配置
version: '3'

services:
  web:
    image: fukoy/nginx-php-fpm:php7.4
    container_name: server-phpnginx-tp1
    restart: always
    volumes:
      - ./www:/usr/share/nginx/typecho/ #typecho网站文件
      - ./nginx/conf.d:/etc/nginx/conf.d #nginx配置文件夹
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf #nginx配置文件
    depends_on:
      - mysql
    networks:
      - default
      - proxy
      
  mysql:
    image: mariadb
    restart: always
    container_name: server-mysql-tp1
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/logs:/var/log/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    env_file:
      - mysql.env
    networks:
      - default

networks:
  default:
  proxy:
    external: true
B.2 配置Traefik的动态配置文件dynamic.yml
B.2.1 增加 routers
 routers:
    # Roter3:  typecho-1
    typecho-1:
      entryPoints:
        - "websecure"
      service: typecho-service2
      rule: "Host(`youdomain.com`)"
B.2.2 增加 services
  services:
    # service1:  typecho-1-service
    typecho-service2:
      loadBalancer:
        servers:
        -  url: "http://172.18.0.5"

查找容器url,用docker inspect --format='{{.NetworkSettings.Networks.proxy.IPAddress}}' server-phpnginx-tp1 命令。

关于本站沿用的,更多traefik2的相关配置文件,参考: Docker-compose安装Traefik2基本配置文件

启动Typecho docker-compose

准备,并修改好所有文件,启动命令: docker-compose up -d

调试常用的docker-compose命令有:

#docker-compose运行
sudo docker-compose up -d

#docker-compose停止
sudo docker-compose down

#docker-compose重启
sudo docker-compose restart

总结

这配置本质就是拉起了一个lnmp环境,并把网站目录指向了~/typecho1/docker-typecho/www目录,而且这个lnmp环境是预装有mysql_pdo驱动,能很好的支持typecho。

利用treafik2反代,修改相应的容器名及IP,即可实现docker环境下,快速搭建typecho的目的。

当然,拉起其他CMS也是一样的,修改~/typecho1/docker-typecho/nginx/conf.d/中对应的nginx网站配置文件即可。