本文使用的硬件、软件环境如下:
- Centos:7.9.2009
- Docker:23.0.1
- Docker Compose:v2.6.0
- Typecho:1.2.0
Docker镜像版本如下:
- nginx:1.22-alpine
- mysql:5.7
- php:7.4-fpm
简介
Typecho
本身是一个轻量级博客系统,部署服务器上也占用不了多少资源,为什么我要选择使用docker来部署呢?主要原因有以下几点:
- docker容器与服务器主机,docker容器之间隔离,不会影响服务器主机上的其他应用或配置
- 部署、迁移很方便
Typecho项目开源地址:https://github.com/typecho/typecho
Typecho官网地址:https://typecho.org/
安装Docker和Docker Compose
Docker
安装必要的相关软件
sudo yum -y install gcc gcc-c++ yum-utils
设置yum镜像仓库
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #国内服务器
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo #境外服务器
更新yum软件包索引
sudo yum update -y #更新yum软件包
sudo yum makecache fast #更新yum缓存
安装docker
sudo yum -y install docker-ce docker-ce-cli containerd.io
启动docker
sudo systemctl start docker
查看docker状态
sudo systemctl status docker
查看docker版本信息
sudo docker version
设置docker开机自启
sudo systemctl enable docker
设置镜像加速器地址
sudo mkdir -p /etc/docker/daemon.json #境外服务器不需要设置此项
然后将以下内容粘贴到daemon.json文件中,保存后退出
{
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
注意:Docker仅支持CentOS7及以上版本,Linux内核3.8及以上版本,,安装Docker前请检查CentOS版本和Linux内核版本,使用cat /etc/redhat-release
命令查看CentOS版本,使用uname -r
命令查看Linux内核版本
Docker Compose
下载docker-compose到指定目录下
sudo curl -SL https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
创建软链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
查看docker-compose版本
sudo docker-compose --version
准备工作目录
为了方便管理,我们创建一个目录作为搭建typecho博客系统所有数据的根目录,并在下面创建对应的子目录。这里我选择/var/www/elonlo.top作为typecho根目录,可以根据自己情况自行修改。
创建后的目录树结构如下:
├── docker-compose.yml
├── mysql
│ ├── my.cnf
│ ├── logs
│ └── mysql.env
├── nginx
│ ├── conf.d
│ │ └── typecho.conf
│ └── nginx.conf
├── php
│ └── Dockerfile
└── typecho
修改mysql
的logs
目录权限
sudo chmod 777 /var/www/elonlo.top/mysql/logs
配置文件
各配置文件参考内容如下:
docker-compose.yml
version: "3"
services:
web:
image: nginx:1.22-alpine
container_name: typecho-nginx
ports:
- "17200:80"
restart: unless-stopped
volumes:
- $PWD/typecho:/var/www/html
- $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf
- $PWD/nginx/conf.d:/etc/nginx/conf.d
- $PWD/nginx/logs:/var/log/nginx
depends_on:
- php
networks:
- typecho_network
php:
build:
context: $PWD/php
dockerfile: Dockerfile
restart: unless-stopped
container_name: typecho-php
ports:
- "17201:9000"
volumes:
- $PWD/typecho:/var/www/html
environment:
- TZ=Asia/Shanghai
depends_on:
- db
networks:
- typecho_network
db:
image: mysql:5.7
container_name: typecho-mysql
restart: unless-stopped
ports:
- "17202:3306"
env_file:
- $PWD/mysql/mysql.env
volumes:
- $PWD/mysql/data:/var/lib/mysql
- $PWD/mysql/logs:/var/log/mysql
- $PWD/mysql/conf.d:/etc/mysql/conf.d
- $PWD/mysql/my.cnf:/etc/mysql/my.cnf
networks:
- typecho_network
networks:
typecho_network: {}
mysql.env
# root用户密码,自行修改
MYSQL_ROOT_PASSWORD=xxx
# 创建容器时创建并使用指定的数据库
MYSQL_DATABASE=blog
# 创建普通用户
MYSQL_USER=typecho
# 普通用户密码,自行修改
MYSQL_PASSWORD=xxx
# 指定数据库所在时区
TZ=Asia/Shanghai
my.cnf
[client]
port = 3306 # 客户端连接MySQL的端口号
default-character-set = utf8mb4 # 客户端连接MySQL时默认使用的字符集
[mysql]
no-auto-rehash # 禁用自动重哈希功能
[mysqld]
port = 3306 # MySQL监听的端口号
bind-address = 0.0.0.0 # 绑定的IP地址,0.0.0.0表示所有可用的IP地址
character-set-server = utf8mb4 # 服务器端使用的默认字符集
collation-server = utf8mb4_unicode_ci # 服务器端使用字符集校对规则
skip-name-resolve # 禁用DNS反向解析,加速连接建立速度
max_connections = 200 # 最大连接数
# SQL模式,可以根据需求进行调整
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
log-error=/var/log/mysql/error.log # 错误日志文件路径
pid-file=/var/run/mysqld/mysqld.pid # MySQL进程ID文件路径
nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 将Nginx代理的所有请求实体的大小限制为20m
client_max_body_size 20m;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
include /etc/nginx/conf.d/*.conf;
}
typecho.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html index.htm;
access_log /var/log/nginx/typecho_access.log main;
#charset koi8-r;
# 地址重写
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-e $request_filename){
rewrite (.*) /index.php;
}
location ~ .*\.php(\/.*)*$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Dockerfile
FROM php:7.4-fpm
MAINTAINER [email protected]
RUN apt-get update && docker-php-ext-install pdo_mysql && echo "output_buffering = 4096" > /usr/local/etc/php/conf.d/php.ini
然后将下载的typecho
压缩包解压后复制到当前typecho
目录下,最后,完整的目录树结构如下:
├── docker-compose.yml
├── mysql
│ ├── my.cnf
│ ├── logs
│ └── mysql.env
├── nginx
│ ├── conf.d
│ │ └── typecho.conf
│ └── nginx.conf
├── php
│ └── Dockerfile
└── typecho
├── admin
├── changelog.txt
├── CODE_OF_CONDUCT.md
├── index.php
├── install
├── install.php
├── LICENSE.txt
├── README.md
├── tools
├── usr
└── var
注意:如果你的服务器是云服务器,请在防火墙下放行17200、17201、17202端口,并在云服务器后台控制面板中安全组放行上述端口。
创建并启动容器
在Typecho根目录(即/var/www/elonlo.top)
下执行以下命令创建容器
sudo docker-compose up -d
创建后使用以下命令查看容器是否启动成功,如下图所示表示启动成功
sudo docker ps
安装Typecho
初始化
浏览器访问yourip:17200
会跳转到http://your:17200/install.php
,此时会看到以下界面
如出现提示上传目录无法写入, 请手动将安装目录下的 /usr/uploads 目录的权限设置为可写然后继续升级
,请修改目录对应的权限,命令如下:
sudo chmod 777 /var/www/elonlo.top/typecho/usr
配置数据库
修改后台配置
安装成功
网盘文件
考虑到某些小伙伴可能访问Github速度慢,故提供了docker-compose
可执行文件和typecho
压缩包
- docker-compose:https://elon.lanzouf.com/ifKdF0wpbbid?password=fxmx
- typecho:https://elon.lanzouf.com/ij9sx0w6ju9c?password=2yqq
注意:因网盘上传文件名后缀限制,故将docker-compose文件改名为docker-compose.txt上传,下载后请去掉.txt后缀