Docker+Git+Node+Hexo的静态博客

原文链接

由来

不管是阿里,腾讯,还是华为的云服务器,对于新用户优惠都是极大了,新用户买同样配置的云服务器,要比老用户便宜一半以上的费用,于是乎,这几年我从阿里的服务器,转到了腾讯的服务器,现在又从腾讯的服务器转到了华为的服务器。但是每次更换新的服务器的时候,尤其是更换了厂家,所有的环境都得重新配置,哪怕是一个静态博客所需的node,git环境,实在是麻烦。

初识docker

机缘巧合的机会接触到docker,使用Dockerfile文件配置了各种环境,一句dokcer build命令,便创建了自己需要的镜像,一句docker run,自己要的容器便生成了,如此方便的操作,再也不用担心以后换服务器的。

思路

-w1050
  • 本地电脑使用git push 命令提交到服务器的宿主机git仓库中
  • 宿主机中的git仓库配置hook,当发现提交时,将宿主机装裸仓库提交到容器中git仓库中。
  • 容器中的git仓库也配置hook,当发现提交时,将markdown的文档,转成html文件,生成静态网站

使用Dockerfile配置博客需要的环境

take is cheap, show me your code!先浏览一下dockerfile。其中Dockerfilesources.listpost-receice同一文件夹
Dockerfile

FROM node

RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak
# 更换为国内镜像源
ADD sources.list  /etc/apt/sources.list

RUN apt-get update

# 为了查看容器ip,安装net-tools
RUN apt-get install -y net-tools --allow-unauthenticated

# git仓库必需品
RUN apt-get install -y git --allow-unauthenticated

# npm更换国内镜像
RUN npm config set registry https://registry.npm.taobao.org

#安装静态博客hexo
RUN npm install -y hexo-cli -g

#安装守护进程的pm2
RUN npm install -y pm2 -g

#安装ssh,便于git提交
RUN apt-get install -y openssh-server --allow-unauthenticated


RUN mkdir mkdir /root/blog

WORKDIR /root/blog

RUN cd /root/blog

#创建容器的git裸仓库 
RUN git init --bare hexo.git

#配置提交文件后触发的hooks
ADD post-receive /root/blog/hexo.git/hooks/post-receive

#为hook文件添加可执行的权限
RUN chmod +x /root/blog/hexo.git/hooks/post-receive

#RUN /etc/init.d/ssh start

sources.list

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable
# deb-src [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic stable

post-receice

#!/bin/bash -l
GIT_REPO=/root/blog/hexo.git
PUBLIC_WWW=/root/blog/hexo
rm -rf ${PUBLIC_WWW}
git clone $GIT_REPO $PUBLIC_WWW
cd $PUBLIC_WWW
hexo clean && hexo g
pm2 delete all
pm2 start app.js
if [[ $? == 0 ]]
then
    echo "Congratulations! Your blog has been correctly deployed"
else
    echo "Unfortunately your blog has not been deployed correctly"
fi

如此这般,这般如此,就可以生成博客系统所需的镜像。
创建镜像

docker build -t "blog/v1" .

创建容器

# hexo默认端口是4000
sudo docker run -itd --name blog -p 80:4000 blog/v1

查看容器

sudo docker ps -a

进入容器

sudo docker exec -it containerId /bin/bash

创建宿主机中的git仓库

为了安全,宿主机中专门创建一个git用户用于提交

adduser git

在git用户下创建裸仓库,如图中的黑色边框部分

su git
cd /home/git
git init --bare blog.git 
cd blog.git

配置宿主机中的hook文件,post-receive。宿主机中的钩子,只需要push裸仓库给容器git仓库

#!/bin/bash -l
#替换containerIp即可
GIT_URL=root@containerIp:/root/blog/hexo.git
GIT_LOCATION=/home/git/hexo.git
#提裸仓
cd $GIT_LOCATION
git push -f $GIT_URL --all

为post-receive添加执行权限

chmod +x /home/git/blog.git/hooks/post-recice

使用ls -la命令确保post-receice的权限在git用户中

drwxr-xr-x 2 git git 4096 Mar 17 16:39 .
drwxr-xr-x 7 git git 4096 Mar 17 17:48 ..
-rwxr-xr-x 1 git git  478 Mar 17 01:07 applypatch-msg.sample
-rwxr-xr-x 1 git git  896 Mar 17 01:07 commit-msg.sample
-rwxr-xr-x 1 git git 3327 Mar 17 01:07 fsmonitor-watchman.sample
-rwxrwxr-x 1 git git  148 Mar 17 16:39 post-receive
-rwxr-xr-x 1 git git  189 Mar 17 01:07 post-update.sample
-rwxr-xr-x 1 git git  424 Mar 17 01:07 pre-applypatch.sample
-rwxr-xr-x 1 git git 1642 Mar 17 01:07 pre-commit.sample
-rwxr-xr-x 1 git git 1492 Mar 17 01:07 prepare-commit-msg.sample
-rwxr-xr-x 1 git git 1348 Mar 17 01:07 pre-push.sample
-rwxr-xr-x 1 git git 4898 Mar 17 01:07 pre-rebase.sample
-rwxr-xr-x 1 git git  544 Mar 17 01:07 pre-receive.sample
-rwxr-xr-x 1 git git 3610 Mar 17 01:07 update.sample

如果不是git用户,切换到root用户,使用chown,chgrp为post-receice修改用户和用户组。

使用秘钥实现免密登录,如果使用密码提交则会卡在输入密码的地方

su git
ssh-keygen -t rsa
cd /home/git
cd .ssh

宿主机id_rsa.pub中的内容复制到容器中的.ssh/authorized_keys

至此,宿主机中的git仓库配置,就完成了。接下来进行容器中ssh的配置

容器中ssh的配置

因为容器的git配置在Dockerfile已经完成,只剩下ssh的免密的配置。
进入容器

dcoker exec -it blog /bin/bash

编辑sshd_config

vim /etc/ssh/sshd_confg

在最下面添加以下代码

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys
PermitRootLogin yes

重启ssh

/etc/init.d/ssh stop
/etc/init.d/ssh start

你可能感兴趣的:(Docker+Git+Node+Hexo的静态博客)