在Centos上使用Docker部署Hexo博客(腾讯云平台)
在CentOS上使用 Docker
运行 nginx
容器,这个容器挂载了Hexo部署目录来实现访问服务
前言
假设公网IP
111.11.1.11
域名www.gaoyuanqi.cn
下面出现的 111.11.1.11
和 www.gaoyuanqi.cn
均需换成自己的
关于域名备案
如果使用中国大陆服务器,域名必须备案才能访问博客
如果使用中国海外服务器,域名无需也不支持备案,但可以访问博客
本地
创建一个
hexo
目录作为项目目录,后面会自动创建3个目录:
hexo/hexo
:hexo博客文件hexo/ssl
:ssl证书文件hexo/conf
:nginx的conf配置文件
云主机
安全组需开放22、80、443端口,腾讯云默认开放所有端口
22
:ssh访问
80
:http访问
443
:https访问
环境
本地环境
windows10 64位
云主机环境
centos 9 64位
安装
在本地安装应用
Node.js
、Git
、Hexo
安装见:
这里创建了 hexo/hexo/
目录
在服务器安装应用
1、安装git
1 | sudo yum install git |
2、查看git版本
1 | git --version |
3、安装docker
Docker配置
1、配置阿里云镜像加速
2、拉取nginx镜像
1 | docker pull nginx:latest |
3、启动nginx服务
1 | docker run -d \ |
-d
:在分离模式下(后台)运行--name
:给运行的容器取一个名字,这里是 nginx-web-p
:docker宿主机端口映射nginx-web容器端口,即80映射80,443映射443--restart
:将 nginx-web 容器设为自启动-v
:将docker宿主机的目录路径绑定装载到nginx-web容器的目录路径,即两者路径下的数据会自动同步且保持一致,目录不存在则自动创建/usr/share/zoneinfo/Asia/Shanghai
:将宿主机时间同步到容器,因为容器与宿主机时间相差8小时/home/nginx/conf.d
:存放站点配置文件/home/nginx/html
:存放hexo部署目录/home/nginx/log
:存放nginx-web容器运行日志/home/nginx/ssl
:存放ssl证书,用于https访问nginx:latest
:使用标签为latest
的nginx
镜像,即上面拉取的nginx镜像
4、查看运行的容器
1 | docker ps |
正常如下图所示:
5、拷贝default.conf文件
nginx-web 容器内的 /etc/nginx/conf.d/
目录下本来有一个 default.conf
文件,不过因为在与宿主机上的 /home/nginx/conf.d
目录挂载时被覆盖了
没有该文件,浏览器访问出现 502 Bad Gateway
报错
因此下面要运行一个新nginx容器,然后拷贝该容器上的 default.conf 文件到挂载目录
1 | docker run -d --name=ceshi nginx:latest |
6、获取nginx-web容器IP
1 | docker inspect nginx-web |
如下图 172.17.0.2
配置ssh公钥
设置ssh公钥后可以免密码部署git仓库:
创建git仓库
创建hexo.git仓库(必要)
1、创建部署目录(root权限下执行)
1 | mkdir -p /home/nginx/html/hexo |
2、创建hexo.git仓库
1 | su git |
3、编辑hexo.git钩子文件
1 | vi ~/hexo.git/hooks/post-receive |
按 i
键进入输入模式,写入:
1 | git --work-tree=/home/nginx/html/hexo --git-dir=/home/git/hexo.git checkout -f |
按 ESC
键退出输入模式,按 :wq
保存
4、授予钩子文件可执行权限
1 | chmod +x ~/hexo.git/hooks/post-receive |
创建ssl.git仓库
1、创建ssl.git仓库
1 | cd ~ |
2、编辑ssl.git钩子文件
1 | vi ~/ssl.git/hooks/post-receive |
按 i
键进入输入模式,写入
1 | git --work-tree=/home/nginx/html/hexo --git-dir=/home/git/ssl.git checkout -f |
按 ESC
键退出输入模式,按 :wq
保存
3、授予钩子文件可执行权限
1 | chmod +x ~/ssl.git/hooks/post-receive |
创建conf.git仓库
1、创建conf.git仓库
1 | cd ~ |
2、编辑conf.git钩子文件
1 | vi ~/ssl.git/hooks/post-receive |
按 i
键进入输入模式,写入
1 | git --work-tree=/home/nginx/conf.d --git-dir=/home/git/conf.git checkout -f |
按 ESC
键退出输入模式,输入 :wq
保存
3、 授予钩子文件可执行权限
1 | chmod +x ~/conf.git/hooks/post-receive |
域名配置
以腾讯云为例
域名解析
解析 www.gaoyuanqi.cn
如下(第三条)
主机记录
为www
记录类型
为A
记录值
为云主机公网IP
- 如果域名是
www.abc.gaoyuanqi.cn
则主机记录
为www.abc
申请ssl证书
如果使用 www.gaoyuanqi.cn
访问博客,则证书绑定域名必须是 www.gaoyuanqi.cn
,两者保持一致
下载的ssl证书是一个压缩包,解压后其中有一个 Nginx
文件夹,将该文件夹重命名为 www.gaoyuanqi.cn
拉取远程仓库
进入
hexo/
项目目录下打开终端
1、拉取ssl.git
1 | git clone git@111.11.1.11:/home/git/ssl.git |
2、拉取conf.git
1 | git clone git@111.11.1.11:/home/git/conf.git |
此时 hexo
项目目录下有 hexo
、ssl
、conf
三个文件夹
推送本地仓库
推送hexo.git
编辑
hexo/hexo/_config.yml
站点配置文件(最下面写入):
1 | deploy: |
注意前面和冒号 :
后的空格
然后在
hexo/hexo/
目录下打开终端推送:
1 | hexo clean |
推送ssl.git
首先将装有ssl证书文件的
www.gaoyuanqi.cn
文件夹复制到hexo/ssl/
目录下
然后在
hexo/ssl/
目录下打开终端:
1 | git add . |
推送conf.git
- 在
hexo/conf/
目录下创建一个名为www.gaoyuanqi.cn.conf
的站点配置文件 .conf
前面一般以域名命名www.gaoyuanqi.cn.conf
文件内容分两种情况:http访问
和https访问
http访问配置
如果不配置ssl证书
1 | # HTTP server |
行数说明
- 4 :监听80端口,default_server 即设为默认虚拟主机,无效访问会转到该站点
- 6 :域名或者云主机公网IP
- 9 :nginx-web容器内的hexo部署目录路径,与宿主机
/home/nginx/html
目录挂载 - 17-20 :nginx-web容器内的50x.html文件路径,与宿主机
/home/nginx/html
目录挂载(上面运行ceshi容器时已经拷贝下来,也可手动新建)
https访问配置
如果配置ssl证书
1 | # HTTP server |
行数说明
- 4 :监听80端口,default_server 即设为默认虚拟主机,无效访问会转到该站点
- 6 :域名或者云主机公网IP
- 11 :将
www.gaoyuanqi.cn
的访问转发到代理地址即 nginx-web 容器,格式为http://容器IP:容器端口
- 13 :将http访问重定向为https访问,即定向到第二个 server 块,需要注意ssl证书到期时间
- 21 :域名
- 25-26 :nginx-web容器内的ssl证书路径,与宿主机
/home/nginx/ssl
目录挂载 - 33-36 :nginx-web容器内的hexo部署目录路径,与宿主机
/home/nginx/html
目录挂载 - 42-45 :nginx-web容器存放50x.html文件路径,与宿主机
/home/nginx/html
目录挂载(上面运行ceshi容器时已经拷贝下来,也可手动新建)
推送
在
hexo/conf/
目录下打开终端:
1 | git add . |
重启 nginx-web
在root用户下
重启nginx-web容器
1 | docker restart nginx-web |
查看运行的容器
1 | docker ps |
正常运行容器所示
但如果
则很大概率 www.gaoyuanqi.cn.conf
站点配置文件不正确,比如,域名不一致、conf文件有不合法字符等
浏览器访问 https://www.gaoyuanqi.cn
其它问题
容器被删除
如果容器被删除了,宿主机上的数据依然会保留,执行:
1 | docker run -d \ |
就可以重新运行