Typecho 官方提供了相关的Dockerfile和Docker镜像,部署的时候有一些坑,所以特地在此处记录下。

1.镜像选择

官方的Dockerfile仓库,Readme文档中使用的是nightly版本的镜像,使用这个镜像后,会导致一个十分奇怪的问题,就是在部署完成后,在后台页面的设置中,任意修改一项配置,点击保存,所有的设置内容都会被清空

因此,这个地方要注意,不要使用仓库文档中的命令直接运行,正如标题所指出的,这里要选择1.2.0版本相关的镜像。

这里我以 joyqi/typecho:1.2.0-php8.0-fpm-alpine 为例。

2.编写Nginx配置文件

在Docker环境中的nginx和php-fpm的配合,与直接在本机上使用略微有点不同,需要注意权限和目录的问题。

首先,需要为Nginx镜像增加www-data用户,与php-fpm的运行用户保持一致。

FROM nginx:alpine
RUN set -x ; \
  addgroup -g 82 -S www-data ; \
  adduser -u 82 -D -S -G www-data www-data && exit 0 ; exit 1
RUN mkdir -p /var/www/html
RUN chown -R www-data:www-data /var/www/html
COPY . /etc/nginx/

其次是,nginx配置文件中,关于php解析部分略微有些不同,我的配置如下:

...
    location ~ .*\.php(\/.*)*$ {
        fastcgi_pass typecho:9000; #此处为typecho镜像中php-fpm的访问地址
        set $path_info "";
        set $real_script_name $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
            set $real_script_name $1;
            set $path_info $2;
        }
        fastcgi_param SCRIPT_NAME $real_script_name;
        fastcgi_param PATH_INFO $path_info;
        include      nginxconfig.io/php_fastcgi.conf;
    }
...

php_fastcgi.conf

# 404
try_files                     $fastcgi_script_name =404;

# default fastcgi_params
include                       fastcgi_params;

# fastcgi settings
fastcgi_index                 index.php;
fastcgi_buffers               8 16k;
fastcgi_buffer_size           32k;

# fastcgi params
fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;

最后要注意,typecho镜像中,工作目录是/app,在挂载目录的时候,需要保持这个工作目录在nginx和typecho的镜像中绝对路径一致,否则仍会出现一些权限问题。

完整的docker-compose.yaml文件:

version: "3.8"
services:
    nginx:
        build:
            context: "./nginx"
            dockerfile: "Dockerfile"
        ports:
            - "80:80"
            - "443:443"
        volumes:
            # 启用SSL
            # - "./acme.sh:/etc/nginx/certs"
            - "./typecho:/app"
        environment:
            - TZ=Asia/Hong_Kong
            - ENV=production
        links:
            - typecho
        restart: always
    typecho:
        image: joyqi/typecho:1.2.0-php8.0-fpm-alpine
        volumes: 
            - ./typecho:/app
        restart: always
        environment: 
            - TIMEZONE=Asia/Hong_Kong
            - MEMORY_LIMIT=128M
            - MAX_POST_BODY=50M
            - TYPECHO_DB_ADAPTER=Pdo_Mysql
            - TYPECHO_DB_HOST=mysql
            - TYPECHO_DB_PORT=3306
            - TYPECHO_DB_USER=root
            - TYPECHO_DB_PASSWORD=123456
            - TYPECHO_DB_DATABASE=blog
            - TYPECHO_SITE_URL=https://www.icac.io