使用Docker搭建Typecho 1.2.0
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