docker 部署 typecho 博客

教程文档:https://blog.laoda.de/archives/docker-compose-install-typecho
typecho 博客_后台地址:http://localhost:8223

一 、创建必要的文件

1 、创建 mysql.env

1
2
3
4
5
6
7
8
mkdir -p /mnt/mydisk/home/typecho && \
touch /mnt/mydisk/home/typecho/mysql.env && \
cat > /mnt/mydisk/home/typecho/mysql.env <<'EOF'
MYSQL_ROOT_PASSWORD=root_pass
MYSQL_DATABASE=typecho
MYSQL_USER=username
MYSQL_PASSWORD=password
EOF

2 、创建 php/Dockerfile

1
2
3
4
5
6
7
8
9
mkdir -p /mnt/mydisk/home/typecho/php && \
touch /mnt/mydisk/home/typecho/php/Dockerfile && \
cat > /mnt/mydisk/home/typecho/php/Dockerfile <<'EOF'
FROM php:7.3.29-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
EOF

3 、创建 nginx/default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mkdir -p /mnt/mydisk/home/typecho/nginx && \
touch /mnt/mydisk/home/typecho/nginx/default.conf && \
cat > /mnt/mydisk/home/typecho/nginx/default.conf <<'EOF'
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;
}
}
EOF

二 、下载typecho源码

需要科学网络,不然就非常慢。

1
2
3
4
mkdir -p /mnt/mydisk/home/typecho/typecho && \
cd /mnt/mydisk/home/typecho/typecho && \
wget https://github.com/typecho/typecho/releases/download/v1.2.1/typecho.zip && \
unzip typecho.zip

uploads目录添加权限(附件目录)

1
chmod -R 777 /mnt/mydisk/home/typecho/typecho/usr/uploads

三 、创建 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
mkdir -p /mnt/mydisk/home/typecho && \
cd /mnt/mydisk/home/typecho && \
touch docker-compose.yml && \
cat > docker-compose.yml <<'EOF'
services:
nginx:
image: nginx
ports:
- "8223:80" # 左边可以改成任意没使用的端口
restart: always
environment:
- TZ=Asia/Shanghai
volumes:
- ./typecho:/var/www/html
- ./nginx:/etc/nginx/conf.d
- ./logs:/var/log/nginx
depends_on:
- php
networks:
- web

php:
build: php
restart: always
expose:
- "9000" # 不暴露公网,故没有写9000:9000
volumes:
- ./typecho:/var/www/html
environment:
- TZ=Asia/Shanghai
depends_on:
- mysql
networks:
- web

mysql:
image: mysql:5.7
restart: always
environment:
- TZ=Asia/Shanghai
expose:
- "3306" # 不暴露公网,故没有写3306: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:
EOF

docker-compose up -d

2 、拉取并运行

1
cd /mnt/mydisk/home/typecho && docker-compose up -d

3 、停‮并止‬删除

1
cd /mnt/mydisk/home/typecho && docker-compose down

4 、拉取镜像

1
docker pull nginx:latest

四 、容器维护命令

1 、查‮所看‬有运行‮器容‬的名称

1
docker ps -a --format "{{.Names}}"

2 、停止 typecho 容器

1
docker stop typecho 

3 、启动 typecho 容器

1
docker start typecho

4 、重启 typecho 容器

1
docker restart typecho

5 、进入 typecho 容器

1
2
3
## Ctrl+D 退出容器
## docker exec -it typecho sh
docker exec -it typecho bash

五 、创建 config.inc.php 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
mkdir -p /mnt/mydisk/home/typecho/typecho && touch /mnt/mydisk/home/typecho/typecho/config.inc.php && cat > /mnt/mydisk/home/typecho/typecho/config.inc.php <<'EOF'
<?php
// 站点根路径
define('__TYPECHO_ROOT_DIR__', dirname(__FILE__));

// 插件目录(相对路径)
define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins');

// 主题目录(相对路径)
define('__TYPECHO_THEME_DIR__', '/usr/themes');

// 管理目录(相对路径)
define('__TYPECHO_ADMIN_DIR__', '/jkadmin/');

// 后台主题左上角头像地址
define('__TYPECHO_GRAVATAR_PREFIX__', 'https://img1.baidu.com/it/u=184448109,1805815777&fm=253&fmt=auto?w=200&h=200');

// 注册自动加载
require_once __TYPECHO_ROOT_DIR__ . '/var/Typecho/Common.php';

// 初始化
\Typecho\Common::init();

// 配置数据库
$db = new \Typecho\Db('Pdo_Mysql', 'typecho_');
$db->addServer(array (
'host' => 'mysql',
'port' => 3306,
'user' => 'username',
'password' => 'password',
'charset' => 'utf8mb4',
'database' => 'typecho',
'engine' => 'InnoDB',
'sslCa' => '',
'sslVerify' => true,
), \Typecho\Db::READ | \Typecho\Db::WRITE);
\Typecho\Db::set($db);
EOF

六 、进入后台-配置数据库

后台地址:http://localhost:8223

初始化配置

  1. 数据库适配器:Pdo驱动Mysql适配器
  2. 数据库前缀:typecho_
  3. 数据库地址:mysql
  4. 数据库用户名:username
  5. 数据库密码:password
  6. 数据库名:typecho

七 、Typecho修改默认后台登陆地址路劲对后台登陆地址进行隐藏

在根目录下找到config.inc.php文件
/* 后台路径(相对路径) / define('__TYPECHO_ADMIN_DIR__', '/admin/');
把这个/admin/路径改成自己想要的路径就行了

八 、地址重写功能

九 、Typecho 升级 php 版本

1、首先停‮并止‬删除容器

1
cd /mnt/mydisk/home/typecho && docker-compose down

2、修改 php/Dockerfile 文件

  • 将你的 PHP 配置从 7.3.29-fpm 升级到 7.4-fpm,你需要修改 Dockerfile,并将基础镜像替换为 php:7.4-fpm。
1
2
3
4
5
6
FROM php:7.3.29-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

修改为

1
2
3
4
5
FROM php:7.4-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

3、拉取 php:7.4-fpm 镜像

1
docker pull php:7.4-fpm

4、拉取并运行

  • 重新创建并启动容器,会自动重新构建 PHP 服务的镜像(构建时最好开代理-要不然巨慢)
1
cd /mnt/mydisk/home/typecho && docker-compose up -d

5、手动重新构建 PHP 服务的镜像

  • 在项目根目录下运行以下命令,重新构建 PHP 服务的镜像(构建时最好开代理-要不然巨慢)
1
docker-compose build php

Nginx 配置

后台地址:https://typecho.example.com:666

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
mkdir -pm 755 /etc/nginx/conf.d && \
touch /etc/nginx/conf.d/typecho.conf && \
cat <<'EOF' | sed '1!{/^[[:space:]]*#/d;/^[[:space:]]*$/d}' > /etc/nginx/conf.d/typecho.conf
## nginx 反向代理: typecho 博客
server {
## 监听666端口,并启用SSL
listen 666 ssl;
listen [::]:666 ssl;

## 替换为你的域名
server_name typecho.example.com;

## 指定 SSL 证书文件和私钥文件的路径
ssl_certificate /etc/nginx/keyfile/cert.pem;
ssl_certificate_key /etc/nginx/keyfile/key.pem;
## 设置支持的SSL‮议协‬版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 启用服‮器务‬端加密套件优先
ssl_prefer_server_ciphers on;
## 设置加密套件,优先用‮强高‬度加密算法,并排‮匿除‬名加‮套密‬件和MD5散列算法
ssl_ciphers HIGH:!aNULL:!MD5;

location / {
## 指定反向代理的服务地址
proxy_pass http://10.10.10.251:8223;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_redirect off;
## 开启缓存
proxy_buffering on;
## 使用 HTTP/1.1 协议通信
proxy_http_version 1.1;
}
## 错误处理
charset utf-8; ## 添加这行来指定编码
error_page 404 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}
}
EOF

sudo systemctl restart nginx