文件结构创建
我们先找一个文件夹用于存放网站的文件结构,我这里直接选择在用户目录下创建了一个 typehco 文件夹,你也可以选择其他存放位置。具体如何创建文件夹这种 Linux 基础知识我就不讲了。
这里我使用的目录结构如下:
typecho:d
+-- mysql:d
| +-- conf:d
| +-- data:d
| `-- logs:d
+-- nginx:d
| `-- default.conf
+-- php:d
| `-- Dockerfile
+-- www:d
+-- docker-compose.yml
`-- mysql.env
注:其中带有 :d
后缀表示这是一个文件夹,你不需要在创建文件夹的时候添加 :d
后缀。
mysql 文件夹用来存放 MySQL 的数据;nginx 文件夹用来存放 Nginx 的配置文件;php 文件夹用来存放一个 Dockerfile,我们需要用这个 Dockerfile 来对官方的 php 镜像进行一点特殊定制;www 文件夹用来存放网页,在我们的教程里当然是指 Typecho 网站代码。
配置文件编写
Docker Compose 配置
使用编辑器打开我们的 typecho/docker-compose.yml
,写入如下内容:
version: '3'
services:
nginx:
image: nginx:1.22.1-alpine
ports:
- '80:80'
restart: always
volumes:
- ./www:/var/www/html
- ./nginx:/etc/nginx/conf.d
depends_on:
- php
networks:
- typecho
php:
build:
context: ./php
dockerfile: Dockerfile
restart: always
volumes:
- ./www:/var/www/html
environment:
- TZ=Asia/Shanghai
depends_on:
- mysql
networks:
- typecho
mysql:
image: mysql:8.0.31
restart: always
ports:
- '3306:3306'
env_file:
- mysql.env
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/logs:/var/log/mysql
- ./mysql/conf:/etc/mysql/conf.d
networks:
- typecho
networks:
typecho:
driver: bridge
Docker Compose 配置文件没什么好改的地方,大家直接 Ctrl CV 即可,当然推荐搜索学习一下 docker-compose.yml 如何编写以及各个字段代表的意思。
注:.yml
文件是大小写敏感,且缩进敏感的文件,请使用空格而不是 Tab 进行缩进,推荐每一个缩进层级使用 2 个空格。
MySQL 配置
使用编辑器打开我们的 typecho/mysql.env
,写入如下内容:
MYSQL_ROOT_PASSWORD={你的 MySQL 密码}
MYSQL_DATABASE=typecho
TZ=Asia/Shanghaii
这里你只需要把 MYSQL_ROOT_PASSWORD
字段设置为你的 MySQL 密码。
Nginx 配置
使用编辑器打开我们的 typecho/nginx/default.conf
,写入如下内容:
server {
listen 80;
server_name {你的域名};
root /var/www/html;
index index.php;
access_log /var/log/nginx/access.log main;
if (!-e $request_filename) {
rewrite ^/ /index.php last;
}
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;
}
}
这里你需要把 server_name
字段改成你的域名,或者直接使用 localhost
。
定制 PHP 的 Dockerfile
使用编辑器打开我们的 typecho/php/Dockerfile
,写入如下内容:
FROM php:8.2.1-fpm-alpine3.17
MAINTAINER {你的名字}
RUN apk update && docker-php-ext-install pdo_mysql && echo "output_buffering = 4096" > /usr/local/etc/php/conf.d/php.ini
这里可以简单解释一下各命令的作用:
FROM
表示该镜像使用的上一级镜像,我们这里设置为 php:8.2.1-fpm-alpine3.17
,因为我们需要基于这个镜像进行定制。
MAINTAINER
表示镜像的维护者,填你的名字即可。
RUN
表示该镜像启动的时候要执行的命令。
我们这里首先更新该镜像的软件包,因为 Alpine 使用 APK 作为软件包管理器,所以我们使用的是 apk update
命令。
然后执行 docker-php-ext-install pdo_mysql
,来给我们的 PHP 安装 PDO 的 MySQL 扩展。
最后执行的命令会在 PHP 初始配置中添加 output_buffering
字段,这会让 PHP 自动创建一个输出缓冲,提高 PHP 执行的灵活性。
拉取 Typecho 代码
我们进入 typecho/www
文件夹,我们需要在这里放置 Typecho 的源代码。
进入 Typecho 的 Github 页面 https://github.com/typecho/typecho,在页面中间找到绿色的 Code 按钮,点击之后选择 Local 标签,你会看见一个叫 “Download ZIP” 的按钮。复制这个按钮的链接,你就能得到 Typecho 的源代码文件链接,它长这样:https://github.com/typecho/typecho/archive/refs/heads/master.zip
我们使用 wget
来下载:
wget https://github.com/typecho/typecho/archive/refs/heads/master.zip
下载完成后,你可以得到一个 master.zip
文件,我们需要使用 unzip
命令解压它。我的服务器刚好没有 unzip
命令,那么我使用如下命令安装:
sudo yum install unzip
然后我们解压这个文件,得到一个叫 typecho-master 的文件夹:
unzip master.zip
这个文件夹里头就是我们要的所有 Typecho 代码,但是我们不需要这个文件夹外壳,我们需要把文件夹内部的所有文件移动到外面:
mv typecho-master/* .
最后我们把 master.zip
和 typecho-master 删掉:
rm master.zip
rm -rf typecho-master
这样一来,你的 typecho/www
文件夹结构应该是这样的:
www:d
+-- admin:d
| `...
+-- install:d
| `...
+-- tools:d
| `...
+-- usr:d
| `...
+-- var:d
| `...
+-- index.php
+-- install.php
`...
我们可以把一些没用的文件清理掉:
rm CODE_OF_CONDUCT.md CONTRIBUTING.md LICENSE.txt README.md changelog.txt
最终我们的 www 文件夹就非常清爽了:
www:d
+-- admin:d
| `...
+-- install:d
| `...
+-- tools:d
| `...
+-- usr:d
| `...
+-- var:d
| `...
+-- index.php
`-- install.php
启动
回到我们的 typecho 目录,执行以下命令启动:
sudo docker-compose up -d
然后输入如下命令检查系统是否正常启动,如果正常启动,那么你应该能看见以 “typecho_” 开头的 3 个容器正在运行,且他们的 STATUS 都是 UP:
sudo docker ps
如果启动发生的问题,你需要使用如下命令停止所有的容器:
sudo docker-compose stop
或者查看某个容器的运行日志:
sudo docker logs {容器名}
或者删除容器:
sudo docker-compose down
或者重启容器:
sudo docker-compose restart
基本上活用以上几个命令,外加使用搜索引擎进行关键字搜索就可以帮你解决大部分启动失败了。我就因为配置文件的名字写错了结果重启了好多回。
验收测试
访问你的域名,如果你能看见 Typecho 安装程序的页面,那么你就成功了!
等等等等,先别急着走程序,我们还有几个东西需要回到服务器上设置。
www 目录的权限
由于在 Docker 中的 PHP-fpm 使用的操作用户是 www-data,而我们 www 目录的默认权限是 0775,即对于所有者和组成员允许完全控制,对于其他用户没有写权限,因此 www-data 是没有写权限的。
而在 Typecho 安装过程中,需要在网站根目录写入一个叫 config.inc.php
的配置文件,这种情况下写入会失败,同时 Typecho 也会告诉你无法写入,你需要拷贝安装程序生成好的一串代码,然后手动写入到 config.inc.php
中。
当然你可以直接照做,动动手指也没几下,也可以把 www 目录权限修改成其他用户可写,让安装程序自动帮你完成相关工作:
sudo chmod o+w www/
注:如果你选择修改权限,强烈建议在安装完成后把权限改回去,以减少安全风险,使用如下代码:
sudo chmod o-w www/
上传目录不可写
理由基本同上,因为上传目录中一般就是一些附件,基本上不会有什么可执行的代码(如果你自己作死除外),所以我们可以创建上传目录,然后直接把读写权限开放给其他用户。
安装
回到 Typecho 安装程序,现在的安装程序已经比之前好了很多了,你几乎只需要进行填表的工作。
在初始化配置中,我们推荐使用 “Pdo 驱动 Mysql 适配器”,毕竟我们花这么多功夫给 PHP 装了个 PDO 的 MySQL 驱动,不用白不用。
数据库前缀不需要、没必要改,数据库地址需要改成 mysql
,即我们在 docker-compose.yml 中定义 MySQL 服务的名称。
数据库用户名是 root
,密码填你在 mysql.env 中设置的密码,数据库名就是 typecho
。
高级选项不用管,都不需要改。
之后就是按照安装程序的指导来就行了。
小结
下一章我们谈谈给我们的网站添加自动备份系统。