这两年也就春节这几天有工夫折腾一下自己的博客。
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%。
参考资料
- nginx – DockerHub
- WordPress: with Nginx web server in Docker
- acme.sh
- W3TC FAQ: Installation: Redis Server
本来昨天晚上写的时候,标题是「将博客迁移到Docker上——又一次失败了」,然后今天找了一天资料,无数次 docker-compose up -
d和 docker-compose down
之后,终于,终于成功了。
发表回复