Ubuntu22.04使用Docker搭建typecho博客
1. 安装Docker
详见:
2. 需要用到的镜像
- nginx
- php:8.2-fpm
- mysql:5.7
3. 配置
新建 blog
文件夹,其目录结构如下:
.
├── docker-compose.yml
├── logs
├── mysql
├── mysql.env
├── nginx
│ └── default.conf
├── php
│ └── Dockerfile
└── typecho
3.1 配置 docker-compose.yml
version: "3.8"
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
restart: always
environment:
- TZ=Asia/Shanghai
volumes:
- ./typecho:/var/www/html
- ./nginx:/etc/nginx/conf.d
- ./logs:/var/log/nginx
depends_on:
- php
php:
build: php
restart: always
expose:
- "9000"
volumes:
- ./typecho:/var/www/html
environment:
- TZ=Asia/Shanghai
depends_on:
- db
db:
image: mysql:5.7
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./logs:/var/log/mysql
- ./mysql/conf:/etc/mysql/conf.d
env_file:
- mysql.env
其中:
version
指定docker-compose
版本image
指定镜像名称build
指定Dockerfile
上下文目录ports
指定端口映射container_name
指定容器名字volumes
指定文件挂载映射depends_on
指定服务启动时的先后顺序,指定的服务会先于当前服务启动expose
定义容器内部服务间的网络访问端口
3.2 MySQL配置
mysql配置信息mysql.env
,参考内容如下:
# MySQL的root用户默认密码,这里自行更改
MYSQL_ROOT_PASSWORD=password
# MySQL镜像创建时自动创建的数据库名称
MYSQL_DATABASE=typecho
# MySQL镜像创建时自动创建的用户名
MYSQL_USER=user
# MySQL镜像创建时自动创建的用户密码
MYSQL_PASSWORD=password
# 时区
TZ=Asia/Shanghai
在mysql/conf
目录下配置一个msql.cnf
,来设置数据库编码格式,防止中文显示为?的问题
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
[client]
default-character-set=utf8
3.3 PHP-fpm配置
- 在
php
下新建Dockerfile
FROM php:8.2-fpm
RUN apt-get update \
&& docker-php-ext-install pdo_mysql \
&& echo "output_buffering = 4096" > /usr/local/etc/php/conf.d/php.ini \
&& echo "date.timezone = PRC" >> /usr/local/etc/php/conf.d/php.ini
其中 php 目录为 php-fpm 的 Dockerfile,在官方镜像的基础上,添加了 PDO_MYSQL(如果使用 MySQL 作为 Typecho 的数据库,则需安装此扩展),并设置 buffer 为 4kb,即一个内存页。同时设置了时区为RPC,来源于issue: https://github.com/typecho/typecho/issues/1090
3.4 nginx 配置
- 在
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;
}
}
nginx
的配置要注意的是需要有rewrite
规则,如果需要指定域名的话,需要写server_name
字段,其实啥也不用改。这里我并没有指定443端口,因为博客的 ssl 是要放在在 cdn 那里做的就是cloudflare那里。
3.5 typecho
- 需要下载
typecho
包放到typecho
目录下 - 下载 - Typecho
提前上传,后面上传主题就可以根据本地路径进行上传到对应的位置了。
4 启动typecho博客
先进入blog
cd dockerdata/blog
启动npm
docker-compose up -d
- 其中php安装可能有点久,需要等待一会
查看进程
docker-compose ps
- 查看是否成功
- 浏览器访问
ip:8080
上传目录无法写入, 请手动将安装目录下的 /usr/uploads 目录的权限设置为可写然后继续升级
- 直接给typecho权限
![image-20210226104203984](https://cdn.jsdelivr.net/gh/akitten-cn/pic@main/image/289fca7e9da25a60372ea5909ee80b99.png)
数据库地址需填入mysql镜像的名称(与`docker-compose.yml`中的配置相对应),应该设置为`db`,数据库名与 `mysql.env` 中创建的数据库名一致