像我这种废柴码字儿的总喜欢追求逼格,原来用博客园onenote可以直接导入,后来就想迁移到自己云主机上
为了保证服务器环境的干净(强迫症晚期),将整套环境封装进docker中
如果想要8003直接绑定到域名上,见另一篇Docker配置Nginx反向代理
Hexo是基于Nodejs的一个框架,将markdown文件解析生成html静态文件
通过Git将本地的html文件拉取到云主机上,存入nginx站点目录供解析
Docker容器需要开放两个端口,80用于nginx解析,22端口给git推送博客页面,宿主机监听8003和8004端口
镜像以Centos为基础镜像,拉取NodeJS,使用yum安装Nginx,Git,OpenSSH
但由于需要配置ssh的公钥私钥,则在实例化镜像后再进入容器配置ssh
拉取Centos镜像
$ sudo docker pull centos
编辑Dockerfile文件
FROM centos:latest # 基于centos
COPY . /usr/local/node # 将node环境复制
RUN \
yum install -y wget && \ # 安装wget
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup && \ # 备份yum源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \ # 更换yum源为阿里源
yum clean all && \ # yum缓存
yum makecache && \
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm && \ # 获取nginx的yum源
yum install -y nginx && \ # 安装nginx
yum install -y git && \ # 安装git
yum install -y vim && \ # 安装vim
git init --bare ~/blogs.git && \ # 创建git库
echo "git --work-tree=/usr/share/nginx/html --git-dir=/root/blogs.git checkout -f" >~/blogs.git/hooks/post-receive && \ # 创建git勾子用于拉取hexo推送的信息
chmod a+x ~/blogs.git/hooks/post-receive && \ # 给勾子执行权限
yum install -y openssh openssh-server openssh-clients && \ # 安装ssh服务
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key && \ # 生成服务端钥匙
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key && \
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
EXPOSE 22 # 暴露22端口用于ssh连接,git拉取页面
EXPOSE 80 # 暴露80端口用于nginx服务
CMD ["nginx","-g","daemon off;"] # nginx服务命令,必须使用daemon守护进程
Docker容器后台运行,就必须有一个前台进程,如果CMD仅执行nginx,那么nginx执行完后台启动后,会立即自杀,docker容器状态会变为exited
docker容器必须有一个常驻的前台进程,所以使用daemon,使pid=1的进程不是/bin/bash而退出
构建镜像
$ docker build -t hexoblogs . // 构建新镜像,注意不要少了最后的点
Successfully built 70eaeb40d97b
Successfully tagged hughdong/hexoblogs:latest
实例化容器并映射到宿主机端口,后台运行容器
$ sudo docker run --name dhblogs -p 8003:80 -p 8004:22 -d hexoblogs:latest
查看容器情况,当看到Status是UP且能看到Ports端口情况时为正常
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c58e2a73f117 hexoblogs:latest "nginx -g 'daemon ..." 12 minutes ago Up 12 minutes 0.0.0.0:8004->22/tcp, 0.0.0.0:8003->80/tcp dhblogs
浏览器输入http://...:8003/是否显示nginx测试页
获取本地ssh公钥,电脑端打开git bash
$ ssh-keygen
一路回车下去,然后打开C:\Users\Username.ssh\id_rsa.pub,复制内容,username是自己的电脑账户名
从宿主机进入Docker容器
$ sudo docker exec -it dhblogs /bin/bash
进入容器后执行以下步骤
# echo "*******************************" > ~/.ssh/authorized_keys // 复制的公钥,替换掉命令的******
# chmod 600 ~/.ssh/authorized_keys // 赋予权限
# chmod 700 ~/.ssh
# /usr/sbin/sshd // 启动ssh服务
本地git bash执行
$ ssh root@***.***.***.*** -p 8004 // 前面是宿主机ip后面是端口
首次执行ssh时需要输入yes连接,之后hexo才能正常推送
如果报错ERROR
ERROR // 如果多次更换docker,同配置ssh连接时需要删除客户机的known_hosts
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HASCHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C:\Users\hughd.ssh\known_hosts 删除该主机对应的旧信息即可
打开C:\Users\hughd.ssh,如果没有config文件则创建新的
Host是云主机ip地址,Port是容器映射到宿主机的端口8004
Host ***.***.***.***
Port ***
nodejs和npm安装过程略
$ npm install -g hexo-cli
$ npm install hexo-deployer-git --save
$ npm install hexo-server
$ hexo init f:/6.Code/GitBlogs // 初始化hexo
$ npm install
配置本地hexo的_config.yml
# Site
title: Hugh
subtitle: Mad web developers
description:
author: HughDong
language: zh-CN
timezone: Asia/Shanghai
# Deployment
deploy:
type: git
repo: root@***.***.***.***:/root/blogs.git
branch: master
生成并推送博客,看到回显服务器端files文件更新则成功
$ hexo clean && hexo g -d
[master 29390bd] Site updated: 2017-10-13 11:03:15 9 files changed, 23 insertions(+), 23 deletions(-)
Branch master set up to track remote branch master from root@***.***.***.***:/root/blogs.git.
To ***.***.***.***:/root/blogs.git aa45a3e..29390bd HEAD -> master
INFO Deploy done: git