Ubuntu22.04使用Docker搭建typecho博客

技术 · 01-10 · 845 人浏览

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

提前上传,后面上传主题就可以根据本地路径进行上传到对应的位置了。

4 启动typecho博客

  • 先进入blog

    cd dockerdata/blog
  • 启动npm

    docker-compose up -d
    • 其中php安装可能有点久,需要等待一会
  • 查看进程

    docker-compose ps
  • 查看是否成功
  • 浏览器访问ip:8080

image-20231231154112685

  • 上传目录无法写入, 请手动将安装目录下的 /usr/uploads 目录的权限设置为可写然后继续升级


  - 直接给typecho权限

  ![image-20210226104203984](https://cdn.jsdelivr.net/gh/akitten-cn/pic@main/image/289fca7e9da25a60372ea5909ee80b99.png)

数据库地址需填入mysql镜像的名称(与`docker-compose.yml`中的配置相对应),应该设置为`db`,数据库名与 `mysql.env` 中创建的数据库名一致


typecho Linux Ubuntu Docker
Theme Jasmine by Kent Liao