原文链接
由来
不管是阿里,腾讯,还是华为的云服务器,对于新用户优惠都是极大了,新用户买同样配置的云服务器,要比老用户便宜一半以上的费用,于是乎,这几年我从阿里的服务器,转到了腾讯的服务器,现在又从腾讯的服务器转到了华为的服务器。但是每次更换新的服务器的时候,尤其是更换了厂家,所有的环境都得重新配置,哪怕是一个静态博客所需的node,git环境,实在是麻烦。
初识docker
机缘巧合的机会接触到docker,使用Dockerfile文件配置了各种环境,一句dokcer build命令,便创建了自己需要的镜像,一句docker run,自己要的容器便生成了,如此方便的操作,再也不用担心以后换服务器的。
思路
- 本地电脑使用git push 命令提交到服务器的宿主机git仓库中
- 宿主机中的git仓库配置hook,当发现提交时,将宿主机装裸仓库提交到容器中git仓库中。
- 容器中的git仓库也配置hook,当发现提交时,将markdown的文档,转成html文件,生成静态网站
使用Dockerfile配置博客需要的环境
take is cheap, show me your code!先浏览一下dockerfile。其中Dockerfile,sources.list,post-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