将 Typecho 迁移至 Docker

之前一直用的是宝塔面板来管理服务器,很多傻瓜化的一键操作,确实省心省事。但是这东西,用起来虽然方便,但是使用频率极低,一年半载下来,用不到几次。如果不关注相关的行业资讯,出了漏洞都不见得能够立即知道,发现的时候说不定为时已晚。

趁着这段时间不忙,可以重装一下服务器,改成 Docker 容器化部署应用。

Docker 容器

这个可以参考菜鸟教程,不同的操作系统(如CentOSUbuntuDebain等)安装也都差不多,跟着教程一步一步的走。

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/sslSSL证书文件路径
  • -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.confNginx配置文件
  • -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,至此迁移完成。

THE-END

AI 评论

由 Google AI Gemini Pro 生成

博主牛皮!从这篇日志中,我不仅了解到了如何将 Typecho 迁移至 Docker,还学习到了很多关于 Docker 的知识。博主写得非常详细,即使像我这样的 Docker 小白也能轻松理解。感谢博主的分享,让我受益匪浅!

添加评论

已有 43 条评论

  • 不亦乐乎
    福建

    docker用的还是不大习惯,很多基本命令都记不住,用起来还得翻本本看笔记。端口和文件夹映射也是搞得晕乎乎的。 😂

    • 冰剑
      湖北

      常用的命令基本都记得,不常用的临时搜索来解决。用一次知道是干啥的就行了,下次就能省很多事。

  • 皇家元林
    安徽

    docker这个吃资源吗?
    我也不习惯docker,装在物理机上多好!

    • 冰剑
      湖北

      Docker 本身不吃资源,吃资源的是应用容器,当然不同的应用占用的资源也不一样。也可以通过参数来分配和限制容器最大能使用的资源。

      我现在只跑了三个容器,nginx、mysql、php-fpm,占用500M左右的内存。

  • JIeJaitt
    JIeJaitt
    湖南

    Docker还是挺吃内存的,不过好像挺方便备份重启站点的

    • 冰剑
      湖北

      还好吧,目前2G内存跑几个小点的程序够用了。

  • Mr.Chou
    广东

    最近才第一次折腾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年将迎来新的开始,愿你我常伴,星河绚烂,日子温暖有光。

    • 冰剑
      湖北

      谢谢,收到提醒都忘记看了。

  • wys.me
    江苏

    喜欢就折腾吧。我已经好久没折腾了。

    • 冰剑
      湖北

      喜提新年第一条评论。

  • 平安家属子痕
    江苏

    之前以为Docker占用比较多,没在vps安装docker,后来为了memos还是装了。以前没用宝塔,后来还是用了宝塔国际,是真心方便。

    • 冰剑
      湖北

      哪个用着顺手就用哪个。

  • 大大的小蜗牛
    湖北

    今天也迁移了一个 Typecho 到 Docker,搜索进了你这篇文章,我发现 Joyqi 有官方 Docker 镜像:https://hub.docker.com/r/joyqi/typecho

    • 冰剑
      湖北

      我知道 joyqi 有写 docker,不记得当时是什么原因放弃了。

  • 老孙
    香港

    我就直接编译一个镜像,😂映射部分文件夹

  • zizdog
    山西

    对于多数人的单一站点需求,其实完全可以把【typecho和整个所需的环境】打包进docker。

  • shingchi
    shingchi
    广东

    用 docker compose 要方便点

    • 冰剑
      湖北

      因为之前会涉及到共用mysql,后面应该会改成compose的方式。