将 Typecho 迁移至 Docker
之前一直用的是宝塔面板来管理服务器,很多傻瓜化的一键操作,确实省心省事。但是这东西,用起来虽然方便,但是使用频率极低,一年半载下来,用不到几次。如果不关注相关的行业资讯,出了漏洞都不见得能够立即知道,发现的时候说不定为时已晚。
趁着这段时间不忙,可以重装一下服务器,改成 Docker 容器化部署应用。
Docker 容器
这个可以参考菜鸟教程,不同的操作系统(如CentOS、Ubuntu、Debain等)安装也都差不多,跟着教程一步一步的走。
Nginx
建议先去 Docker Hub 中找到最新的 Nginx 版本,如nginx:1.25
。
Nginx 稍微麻烦一点,首先需要启动一个 Nginx,让其在容器内部生成配置文件。然后将配置文件复制出来,再关闭删除。
# 运行不带参数的 nginx
docker run --name nginx -d nginx:1.25
# 讲 nginx 容器内的配置文件复制到执行目录
docker cp nginx:/etc/nginx/nginx.conf /usr/local/docker/nginx
# 停止 nginx 容器
docker stop nginx
# 删除 nginx 容器
docker rm nginx
配置文件复制出来后,再执行带配置参数的运行命令。
docker run --name nginx --restart=always -p 80:80 -p 443:443 \
-v /etc/localtime:/etc/localtime \
-v /usr/local/docker/nginx/blog:/www \
-v /usr/local/docker/nginx/html:/usr/share/nginx/html \
-v /usr/local/docker/nginx/ssl:/etc/nginx/ssl \
-v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/docker/nginx/logs:/var/log/nginx \
-d nginx:1.25
--name
容器名称(下面不在复述)--restart=always
开机自启动,失败的一直尝试重启(下面不在复述)-p 80:80 -p 443:443
映射 80 和 443 端口(下面不在复述)-v /etc/localtime:/etc/localtime
与宿主机时间同步(下面不在复述)-v /usr/local/docker/nginx/blog:/www
存放博客的路径-v /usr/local/docker/nginx/html:/usr/share/nginx/html
存放其他资源的路径,没有可以去掉-v /usr/local/docker/nginx/ssl:/etc/nginx/ssl
SSL证书文件路径-v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
Nginx配置文件-v /usr/local/docker/nginx/logs:/var/log/nginx
日志文件,不需要可以去掉
PHP
建议先去 Docker Hub 中找到最新的 PHP 版本,如php:7.4-fpm
。
docker run --name php-fpm --restart=always -p 9000:9000 -v /etc/localtime:/etc/localtime -v /usr/local/docker/nginx/www:/www -d php:7.4-fpm
-v /usr/local/docker/nginx/blog:/www
与 Nginx 的配置路径要一致
由于 Typecho 需要用到pdo_mysql
的扩展,所需需要在容器中安装上扩展。
# 进入容器内部
docker exec -it php-fpm /bin/bash
# 安装 pdo_mysql 扩展
docker-php-ext-install pdo_mysql
# 安装 pcntl 扩展,因为我的 Say 插件需要用到 pcntl_fork 函数
docker-php-ext-install pcntl
# 查看是否安装成功
php -m
# 退出容器
exit
MySQL
建议先去 Docker Hub 中找到最新的 MySQL 版本,如mysql:5.7
。
docker run --name mysql --restart=always -p 3306:3306 -v /etc/localtime:/etc/localtime -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d -v /usr/local/docker/mysql/logs:/var/log -v /usr/local/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:5.7
-v /usr/local/docker/mysql/data:/var/lib/mysql
数据存储路径-e MYSQL_ROOT_PASSWORD=password
记得修改 ROOT 密码
Bridge 网络
现在三个容器都是相互独立的,我们需要把它们组合在一个网络中。
# 创建一个自定义的 Bridge 网络
docker network create typecho
# 将容器加入到新建的网络
docker network connect typecho nginx
docker network connect typecho php-fpm
docker network connect typecho mysql
# 查看网络情况
docker network inspect typecho
可以看到新建的网络中,三个容器都分别获得了新的IP,在同一个网络中,容器相互之间可以用容器名称来调用服务,如mysql
。
修改配置
Nginx
打开/usr/local/docker/nginx/conf/nginx.conf
,将下面的配置粘贴至 http 内。
server {
listen 443 ssl;
server_name digu.plus www.digu.plus;
ssl_certificate /etc/nginx/ssl/digu.plus_bundle.crt; # SSL 证书
ssl_certificate_key /etc/nginx/ssl/digu.plus.key; # SSL 证书
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root /www;
index index.html index.htm index.php;
include /www/nginx.htaccess; # typecho 的伪静态
}
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name;
include fastcgi_params;
}
}
server {
listen 80;
server_name digu.plus www.digu.plus;
rewrite ^ https://$http_host$request_uri; # 强制使用 https 访问
}
MySQL
mysql 的容器创建好了,再来创建数据库。
# 进入 mysql 容器
docker exec -it mysql /bin/bash
# 登录 mysql
mysql -uroot -p
# 输入 root 密码
# 创建数据库
create database typecho
Typecho
将typecho的相关文件放入/usr/local/docker/nginx/blog
,因为我是迁移,所以直接修改config.inc.php
配置。如果是全新安装,这访问http://xxxx.com/install.php
。
// config db
$db = new \Typecho\Db('Pdo_Mysql', 'typecho_');
$db->addServer(array (
'host' => 'mysql',
'port' => 3306,
'user' => 'root',
'password' => 'password',
'charset' => 'utf8mb4',
'database' => 'typecho',
'engine' => 'InnoDB',
), \Typecho\Db::READ | \Typecho\Db::WRITE);
\Typecho\Db::set($db);
'host' => 'mysql'
因为都在同一个网络,所以只需要写容器名称即可
结束
# 重启三个重启
docker restart nginx mysql php-pfm
Typecho 迁移至 Docker,至此迁移完成。
AI 评论
由 Google AI Gemini Pro 生成博主牛皮!从这篇日志中,我不仅了解到了如何将 Typecho 迁移至 Docker,还学习到了很多关于 Docker 的知识。博主写得非常详细,即使像我这样的 Docker 小白也能轻松理解。感谢博主的分享,让我受益匪浅!
已有 45 条评论
docker用的还是不大习惯,很多基本命令都记不住,用起来还得翻本本看笔记。端口和文件夹映射也是搞得晕乎乎的。 😂
常用的命令基本都记得,不常用的临时搜索来解决。用一次知道是干啥的就行了,下次就能省很多事。
docker这个吃资源吗?
我也不习惯docker,装在物理机上多好!
Docker 本身不吃资源,吃资源的是应用容器,当然不同的应用占用的资源也不一样。也可以通过参数来分配和限制容器最大能使用的资源。
我现在只跑了三个容器,nginx、mysql、php-fpm,占用500M左右的内存。
很好很不错,收藏了
你博客里面的干货挺多的,学习了。😀
Docker还是挺吃内存的,不过好像挺方便备份重启站点的
还好吧,目前2G内存跑几个小点的程序够用了。
最近才第一次折腾Vps..虚拟机经常宕机主机商直接给了台vps..自己安装了宝塔就跑个博客,最近稳定的很
虚拟机换VPS,赚了啊。
宝塔折腾起来确实方便,减少折腾。
准备黑五整台vps 也按这个教程搭了。😄
1111的阿里云88元一年挺香的。
没时间搞这些 也许我太懒了😂
一次折腾,长期受益啊。
有技术,敢折腾。
docker当初用过,很不习惯,还是习惯了宝塔操作。
要记一些基本命令,或者临时查命令,用起来是有些麻烦,但是一劳永逸。
我现在用到的服务,也是基本上首选 Docker。部署、维护、迁移都非常方便省事。还有个神器 Nginx Proxy Manager,有这两件套基本上可以部署 99% 的应用了。
第一次听说这个神器,改天折腾一下。
刚看了下,有点意思,但是还是没折腾明白,感觉如果熟悉的话,NPM、Portainer这两个一起用,也可以省事很多。
Portainer 只是 Docker 的 GUI 管理面板,要不要无所谓,我更喜欢命令行管理,docker compose 好用一些。对多数应用来说,NPM 也只是起到一个反代的作用。
站长给个联系方式呗,您之前做的typecho插件我无法使用,想问您问题
关于里面有邮箱
不想用宝塔可以试试mdserver-web(仿宝塔)、1panel(这玩意存粹是个docker)
我用的mdserver-web、docker对新手来说还是不太友好
https://github.com/midoks/mdserver-web
就docker得了,懒得折腾了,习惯了就好。
Docker适合专业人士,宝塔适合小白。
2023年即将过去,就把一切遗憾和不如意,在岁末之际画上句号,2024年将迎来新的开始,愿你我常伴,星河绚烂,日子温暖有光。
谢谢,收到提醒都忘记看了。
喜欢就折腾吧。我已经好久没折腾了。
喜提新年第一条评论。
之前以为Docker占用比较多,没在vps安装docker,后来为了memos还是装了。以前没用宝塔,后来还是用了宝塔国际,是真心方便。
哪个用着顺手就用哪个。
这又是几个小时的折腾哦
独立博客就是用来折腾的。
今天也迁移了一个 Typecho 到 Docker,搜索进了你这篇文章,我发现 Joyqi 有官方 Docker 镜像:https://hub.docker.com/r/joyqi/typecho
我知道 joyqi 有写 docker,不记得当时是什么原因放弃了。
我就直接编译一个镜像,😂映射部分文件夹
😅现在懒的折腾太多 没时间搞
GUI确实省事,节约时间。
对于多数人的单一站点需求,其实完全可以把【typecho和整个所需的环境】打包进docker。
那还不如compose
用 docker compose 要方便点
因为之前会涉及到共用mysql,后面应该会改成compose的方式。
小白用户觉得宝塔面板还可以。
宝塔确实简单易用,省事。