将博客迁移到Docker上


发布于

|

分类

这两年也就春节这几天有工夫折腾一下自己的博客。

16年左右吧,Docker大火,想把博客迁移到Docker上,然而失败了。这几年随着Docker越用越多,工具越来越好,又尝试了好几次,不幸的是,都失败了。

然而今年,终于成功了。


来说说做了啥。

首先,我依然有强烈的洁癖:不想用第三方镜像,只想用“官方”镜像。于是有了下面这个列表:

  • wordpress:fpm-alpine
  • nginx:alpine
  • mariadb:latest

要说上面三个镜像凑齐了就能开始干活了。

先照虎画猫,写个docker-compose.yml文件:

version: "3.6"
services:
  wordpress:
    image: wordpress:fpm-alpine
    container_name: my_blog
    volumes:
      - ./wordpress:/var/www/html
    environment:
      - WORDPRESS_DB_NAME=wordpress
      - WORDPRESS_TABLE_PREFIX=wp_
      - WORDPRESS_DB_HOST=database
      - WORDPRESS_DB_USER=wordpress
      - WORDPRESS_DB_PASSWORD=wordpress
    depends_on:
      - database
    restart: always

  database:
    image: mariadb
    container_name: database
    volumes:
      - ./database:/var/lib/mysql
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_USER=wordpress
      - MYSQL_PASSWORD=wordpress
      - MYSQL_DATABASE=wordpress
    restart: always

  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./cert:/etc/letsencrypt
      - ./logs:/var/log/nginx
      - ./wordpress:/var/www/my_blog
    depends_on:
      - wordpress
    restart: always

然后 docker-compose up ,浏览器打开,发现被拒绝。docker ps 发现nginx一直在重启。比较奇怪的是,其他volume,如果宿主机上没有的话,docker会将镜像里面的东西复制到宿主机上来,但是nginx的配置死活过不来。然后看readme,将docker里面的配置文件复制出来:

docker run --name tmp-nginx-container -d nginx
docker cp tmp-nginx-container:/etc/nginx/nginx.conf /host/path/nginx.conf
docker cp tmp-nginx-container:/etc/nginx/conf.d/default.conf /host/path/default.conf
docker rm -f tmp-nginx-container

OK,这下子能看到nginx欢迎页了。但这远远不够:Wordpress还没工作呢。

改nginx配置如下:

server {
    listen 80 http2 ssl;
    #listen [::]:80 http2 ssl ipv6only=on;

    server_name _;

    root /var/www/my_blog; # Only for static files
    index index.html index.php;

    location / {
        try_files $uri $uri/ /index.php?$args; # 注意最后不能加上 `=404` 否则不能伪静态
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_index index.php;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;# 注意这里前面我手写了绝对路径
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass blog:9000;
        include fastcgi_params;
    }

}

OK这下子wp可以工作了。这里有个点需要注意一下:看docker-compose里面的volumes设置。wp的路径在 /var/www/html,如果这个东西被挂载在了nginx里面的 /var/www/html,那么假如我想再起一个wp,路径也在 /var/www/html,两个就冲突了。所以这里需要搭配开。另外,如果这里和php-fpm里面的路径不同的话,SCRIPT_FILENAME 需要再自己写一下,和php-fpm里面的路径对应。好像设置 root 的方式无效。

以上所有步骤都在自己的mac上跑的,验证通过后自然就是上线测试了。将现在网站的配置、插件、sql导出来,新服务器上安docker,起docker,导入sql,一切看起来都那么顺利。

然而……

首先发现,我之前启用了hsts,会强制从http跳转到https,现在还没有配置https,于是各种挂。并且似乎wildcard hsts是和dns绑定的,一直试图跳转到原来的ip。

重启浏览器,开隐身,强行进数据库里面将首页的https改为http,然后各种降级,终于能在http模式下跑起来了。

然后是配置https。再挂上一个acme.sh的Docker:

  acme.sh:
    image: neilpang/acme.sh
    container_name: acme.sh
    command: daemon
    volumes:
      - ./data/cert:/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - Ali_Key=XXXXX
      - Ali_Secret=XXXXX

然后执行一句 docker-compose exec acme.sh --issue --dns dns_ali -d haoyu.love -d "*.haoyu.love",证书就申请好了。最后将证书配置到nginx里面就好。

最最后是备份脚本。有了Docker,有了备份,就能迅速搬家。本来备份这件事儿也想写个Docker来搞,但是觉得工作量太大了……就污染一下母鸡:安个conda,写个crontab,完事儿。


说这这么简单……其实……都是泪……

比如,nginx,尝试了一整天才知道后面 SCRIPT_FILENAME 应该这样设置;比如,配置证书,申请到好几个文件,不知道哪个该怎么写;比如,想配置Redis缓存,无奈 php-fpm 镜像默认没装redis扩展;比如,w3tc配置Redis缓存,找遍了docs才找到方法;比如,备份脚本,调用bash的时候,命令是对的,但结果死活与预期不相符……

这下好了~估计下次折腾博客,是2021年了。

后续

因为全国肺炎疫情在家闲着,就顺便多折腾了点。

首先,解决了左边菜单一直飘的问题。感觉应该是跟背景 backdrop-filter 冲突了,只要加上这句,就开始乱飘。后来通过一个伪类解决了这个Bug。

然后是,给代码加上了个样式。之前 code 跟正文实在分不开,现在能看清了。

还有是修复了一大堆的样式。第一次感受到Wordpress的主题编辑器还是有点用的。😂

最后嘛……各种小Bug修复,还没修完。想不通为啥Docker之后这么多Bug……站点健康总达不到100%。

参考资料


本来昨天晚上写的时候,标题是「将博客迁移到Docker上——又一次失败了」,然后今天找了一天资料,无数次 docker-compose up -d和 docker-compose down之后,终于,终于成功了。


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注