目前决定将自己的博客迁移到新服务器中,为了方便管理和未来的迁移,这里决定使用 Docker 环境。实际操作类似于搭建一个 LNMP 环境。
1. Docker的安装
本文前接我的上一篇博文:
【记录】依言のDocker折腾记录
参照该文章进行安装即可
2. 安装前的准备
首先创建一下安装的目录:
$ mkdir -p ~/data/docker_data/typecho
cd ~/data/docker_data/typecho
之后再具体处理每一个需要用到的组件
2.1.1 mysql
vim mysql.env
填入下面的内容:
MYSQL_ROOT_PASSWORD=root_pass
MYSQL_DATABASE=typecho
MYSQL_USER=username
MYSQL_PASSWORD=password
这一部分就是之后建立的数据库的信息了。不要照抄,记得改一下,以避免一些不必要的麻烦。
2.1.2 php-fpm
其中 php 目录为 php-fpm 的 Dockerfile,在官方镜像的基础上,添加了 PDO_MYSQL(如果使用 MySQL 作为 Typecho 的数据库,则需安装此扩展),并设置 buffer 为 4kb,即一个内存页。同时设置了时区为RPC,来源于issue: https://github.com/typecho/typecho/issues/1090
cd ~/data/docker_data/typecho
mkdir php
cd php
vim Dockerfile
输入下面的内容:
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
2.1.3 nginx
nginx 的配置要注意的是需要有rewrite 规则(后续typecho后台有一个地址重写功能),如果需要指定域名的话,需要写 server_name 字段。这里我并没有指定443端口,因为我们后面用到了反向代理。
cd ~/data/docker_data/typecho
mkdir nginx
cd nginx
nano 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;
}
}
2.1.4 typecho
最后来处理 typecho 本体。首先下载源码:
cd ~/data/docker_data/typecho/typecho
wget https://github.com/typecho/typecho/releases/download/v1.2.0/typecho.zip
apt install zip -y
unzip typecho.zip
之后创建docker-compose文件。
cd ~/data/docker_data/typecho
vim docker-compose.yml
docker-compose.yml内容如下:
version: "3"
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:
之后端口是否被占用,输入:
lsof -i:8223 #查看8223端口是否被占用,如果被占用,重新自定义一个端口
如果出现:
bash: lsof: command not found
运行:
apt install lsof #安装lsof
如果端口没有被占用,可以运行:
docker-compose up -d
访问:http:服务ip:8223 即可。
注意:
1、不知道服务器IP,可以直接在命令行输入:curl ip.sb,会显示当前服务器的IP。
2、遇到访问不了的情况,请在宝塔面板的防火墙和服务商的后台防火墙里打开对应端口。
下面是 Docker-compose 下 typecho 的更新和卸载方法:
2.2 更新
cd ~t/data/docker_data/typecho # 进入docker-compose所在的文件夹
docker-compose pull # 拉取最新的镜像
docker-compose up -d # 重新更新当前镜像
利用Docker-compose搭建的应用,更新非常容易~
2.3 卸载
sudo -i # 切换到root
cd ~/data/docker_data/typecho # 进入docker-compose所在的文件夹
docker-compose down # 停止容器,此时不会删除映射到本地的数据
cd ~
rm -rf /root/data/docker_data/typecho # 完全删除映射到本地的数据
利用Docker-compose搭建的应用,删除也非常容易~
3. 反向代理
在上文中,我们搭建的博客放在了8223端口上,为了使外网的访问更加方便,博客需要绑定在80端口上才可以。不过为了避免和其他服务的冲突,这里我们使用反向代理的方式来访问我们的博客。
这里我们通过 Nginx proxy manager 这个工具来进行反向代理的配置。首先在本机部署这个工具。
Nginx proxy manager 的安装
首先建立一个文件夹
mkdir -p ~/data/docker_data/npm
cd ~/data/docker_data/npm
这边我们直接用 docker 的方式安装。
vim docker-compose.yml
输入以下内容:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 保持默认即可,不建议修改左侧的80
- '10281:81' # 这里我修改了默认端口
- '443:443' # 保持默认即可,不建议修改左侧的443
volumes:
- ./data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
- ./letsencrypt:/etc/letsencrypt # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中
保存退出。之后检查端口是否被占用(以 81 为例),输入:
lsof -i:81 #查看 81 端口是否被占用,如果被占用,重新自定义一个端口
如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~
最后运行并访问 Nginx Proxy Manager:
cd ~/data/docker_data/npm # 来到 dockercompose 文件所在的文件夹下
docker-compose up -d
理论上我们就可以输入 http://ip:10281 访问了。
默认登陆名和密码:
Email: admin@example.com
Password: changeme
登录后系统会自动让你更改密码,为了安全起见,记得更改密码。
注意:
1、不知道服务器 IP,可以直接在命令行输入:curl ip.sb,会显示当前服务器的 IP。
2、遇到访问不了的情况,请再次检查在宝塔面板的防火墙和服务商的后台防火墙是否打开对应了端口。
最后附上 Nginx Proxy Manager的更新和卸载方法:
更新 Nginx Proxy Manager
cd /root/data/docker_data/npm
docker-compose down
cp -r /root/data/docker_data/npm /root/data/docker_data/npm.archive # 万事先备份,以防万一
docker-compose pull
docker-compose up -d # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。
docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像
提示:
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]
输入 y
利用 Docker 搭建的应用,更新非常容易~
卸载 Nginx Proxy Manager
cd /root/data/docker_data/npm
docker-compose down
rm -rf /root/data/docker_data/npm # 完全删除映射到本地的数据
可以卸载得很干净。
利用Nginx Proxy Manager 进行反向代理
在添加反向代理之前,确保你已经完成了域名解析。之后,登陆Nginx Proxy Manager。
注意:
Nginx Proxy Manager(以下简称NPM)会用到80、443端口,所以本机不能占用(比如原来就有Nginx)
具体步骤为:
1. 点击 Add Proxy Host
2. Domain name 输入自己博客的域名
3. Forward Host Name/IP 输入对应的地址
4. Forward Port 输入刚才的端口
5. Block common exploits 和 Websocket support 依情况勾选
6. 后面也可以勾选 SSL 相关选项来开启 HTTPS。
IP填写:
由于 Nginx Proxy Manager 存在一些 bug,因此这里需要输入:
ip addr show docker0
查看对应的Docker容器内部IP,之后填写看见的ip地址。而直接输入127.0.0.1或是服务器本身的ip都会无法访问。
最后,访问自己的域名,就可以跟正常的 Typecho 一样安装啦~
BUG 处理
我在完成上面的步骤后,试图进行安装,但是会出现以下的 bug:
上传目录无法写入, 请手动将安装目录下的 /usr/uploads 目录的权限设置为可写然后继续升级
下面是解决方法:
进入 PHP 容器检查权限 进入 PHP 容器,检查 uploads 目录的权限和所有者。
docker exec -it typecho_php_1 /bin/bash
cd /var/www/html/usr
ls -ld uploads
chown -R www-data:www-data uploads
chmod -R 775 uploads
进入 Nginx 容器检查权限 进入 Nginx 容器,确保 uploads 目录的权限也正确。
docker exec -it typecho_nginx_1 /bin/bash
cd /var/www/html/usr
ls -ld uploads
重启容器 为确保更改生效,重启 Nginx 和 PHP 容器。
docker-compose restart nginx php
再次访问 Typecho 的安装页面,确认问题已解决,可以正常进行安装。
但是此时还会有一些问题:
安装程序无法自动创建 config.inc.php 文件
您可以在网站根目录下手动创建 config.inc.php 文件, 并复制如下代码至其中
针对我的环境,在 /data/docker_data/typecho/typecho 下:
vim config.inc.php
之后把提示的内容粘贴进去就行了。
更多网页
当之后再想在该服务器上部署其他服务时,若是再利用Docker新建一个容器,安装nginx,并设置反向代理,未免也太麻烦了,不如直接使用此步中安装的nginx proxy manager添加相应的站点。
首先,根据前文的Dockerfile找到nginx的文件目录:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 保持默认即可,不建议修改左侧的80
- '10281:81' # 这里我修改了默认端口
- '443:443' # 保持默认即可,不建议修改左侧的443
volumes:
- ./data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
- ./letsencrypt:/etc/letsencrypt # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中
可以看到,我们把 docker 环境的 data 目录同样映射到了宿主机对应位置的 data 目录下。因此就很简单了。
首先,在你挂载的data文件夹里面创建一个新的文件夹,比如在我的服务器上,是这个样子的:
~/data/docker_data/typecho/npm/data$ sudo mkdir y1yan.com
之后,建立对应的网页:
cd y1yan.com
sudo touch index.html
sudo vim index.html
之后,登陆NPM,在网页里新建一个Proxy Host。
在高级里,添加下面的内容:
location / {
root /data/y1yan.com; # 修改成你自己刚刚创建的目录,只需要改demo10.gao.ee这部分就可以了
}
就可以正常访问了。
References
ubuntu 20.04 国内源安装docker
解决Ubuntu系统下无法定位Docker软件包的安装问题指南
[How do I exit the systemctl status command's output? [duplicate]](https://askubuntu.com/questions/961025/how-do-i-exit-the-systemctl-status-commands-output)
【好玩儿的Docker项目】10分钟搭建一个Typecho博客|太破口!念念不忘,必有回响!
解决 Typecho Docker 环境安装问题:权限配置指南
vi/vim粘贴复制脚本内容时全变成注释的问题解决方法
如何在Nginx Proxy Manager(NPM)上部署静态网站