用Docker在阿里云服务器上部署hexo

前言

最近想自己出一个Web题目了,🍆学长告诉我搭建环境要用到docker-compose,于是便想先把博客迁移到Docker里,顺便学一学docker的基本操作。

把博客迁移到Docker里就不需要宝塔面板了,所以重置成Ubuntu系统。重置后需要再次建立ssh连接。docker配置的过程参考使用docker搭建nginx挂载hexo博客

安装Docker

Docker常用命令

  • 搜索镜像
1
docker search IMAGENAME
  • 拉取镜像
1
docker pull IMAGENAME
  • 查看本地镜像
1
docker images
  • 删除本地镜像
1
docker rmi IMAGENAME

所以我们这里拉取nginx镜像

1
2
docker search nginx
docker pull nginx

配置docker-compose

1
2
3
4
5
cd /home
mkdir blog
cd blog
mkdir {www,log,conf} #创建挂载目录
vim docker-compose.yml #创建docker-compose文件

配置docker-compose文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3'
services:
nginx:
restart: 'always'
image: 'nginx'
container_name: 'blog'
ports:
- '80:80' #将容器内80端口映射到外部IP的80端口
- '443:443'
volumes:
- '/home/blog/www/public:/usr/share/nginx/html'
#这里的/home/blog/www/public是本机的目录,放置了博客的静态文件
#/usr/share/nginx/html是docker容器内的目录
#这里把本机目录挂载到了容器内
- '/home/blog/log:/var/log/nginx/' #对应的是日志文件
- '/home/blog/conf:/etc/nginx/conf.d' #对应的是配置文件

保存以后退出

配置nginx

1
2
cd conf
vim default.conf #配置nginx

写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
server {
listen 80;
server_name localhost; #这里可以填入你的域名

#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
root /usr/share/nginx/html;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
## 下面三行是添加的。
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}

# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}

上传静态文件

在本地!!!

因为运行hexo g时会生成静态文件public,所以我们在本地生成静态文件以后将它上传到远程服务器。

1
2
3
4
scp -r /mnt/e/blog/public root@xxx.xxx.xxx.xxx:/home/blog/www
# /mnt/e/blog/public是你本地的public目录地址
# xxx.xxx.xxx.xxx表示你远程服务器的地址
# /home/blog/www表示上传到远程服务器的位置

运行docker-compose

在服务器端

1
2
cd /home/blog
docker-compose up -d #-d指在后台运行

至此博客便成功迁移到Docker中了,访问你的远程服务器IP,就可以发现博客已经出现了。

实现自动化部署

光是这样还是不行的,因为hexo只能在本机生成静态文件,而要让它同步到博客上还需要每次都scp一下,这当然是不现实的,于是我想到之前用过一个钩子函数post-receive,每次hexo部署完成以后,自动启动钩子,进行更新同步的操作,那么我们开始吧!具体可以参考我的另一篇文章

创建钩子函数

/home/blog/www/目录下

1
2
3
4
5
mkdir repos
cd repos
git init --bare blog.git #创建一个裸库
cd blog.git/hooks
vim post-receive #创建钩子函数

写入以下内容

1
2
3
4
5
6
7
8
#!/bin/bash
DIR=/home/blog/www
rm -rf ${DIR}/public/ #首先删除所有静态文件
mkdir ${DIR}/public #新建一个文件夹用于存放静态文件
git --work-tree=${DIR}/public --git-dir=/home/blog/www/repos/blog.git checkout -f
#将部署后产生的静态文件上传到博客根目录
docker-compose up -d #docker重新部署
docker restart blog #docker重启容器

之后修改hexo的站点配置文件

1
2
3
4
5
6
deploy:
type: git
repository:
github: #这里是你的github.io页面地址
server: <你的用户名>@服务器IP:/home/blog/www/repos/blog.git
branch: master

至此这一次博客迁移宣告成功!每次写完文章只要

1
2
hexo cl
hexo g -d

即可!

后记

  • 感谢🍆!🍆是我偶像!

  • Googlenb!