Docker配置Hexo+Git+Nginx
文章目录
[隐藏]
- 功能需求
- 解决方案
- 实现思路
- 主机环境
- 前期准备
- 构建Dockerfile
- 构建镜像与容器
- 测试镜像
- 配置ssh
- 本地测试ssh并互换秘钥
- 本地配置ssh配置文件
- 本地配置hexo
功能需求
像我这种Tototototo Young的码字儿的总喜欢追求逼格,原来用博客园onenote可以直接导入,后来就想迁移到自己云主机上
为了保证服务器环境的干净(强迫症晚期),将整套环境封装进docker中
如果想要8003直接绑定到域名上,见另一篇Docker配置Nginx反向代理
解决方案
- Hexo+Github的构建博客资料网上有很多,不赘述,不使用这种方法
-
Hexo+Git+Nginx+云主机上构建服务器资料也不少,如果想要配置过程的邮件私聊我
-
Hexo+Git+Nginx+云主机+Docker,今天使用这种方法构建,镜像还没有push到Docker源,有需要的私聊~
实现思路
Hexo是基于Nodejs的一个框架,将markdown文件解析生成html静态文件
通过Git将本地的html文件拉取到云主机上,存入nginx站点目录供解析
Docker容器需要开放两个端口,80用于nginx解析,22端口给git推送博客页面,宿主机监听8003和8004端口
镜像以Centos为基础镜像,拉取NodeJS,使用yum安装Nginx,Git,OpenSSH
但由于需要配置ssh的公钥私钥,则在实例化镜像后再进入容器配置ssh
主机环境
- 宿主机环境
centos Linux release 7.3.1611 (Core)
docker version 17.06.1-ce, build 874a737
node v8.4.0
npm 5.3.0 -
容器环境
centos Linux release 7.4.1708 (Core)
nginx version: nginx/1.12.1
git version 1.8.3.1 -
容器目录
git库: /root/blogs.git
nginx: /etc/nginx/conf.d/default.conf
blog文件: /usr/share/nginx/html
ssh私钥: /root/.ssh/authorized_keys
前期准备
-
宿主机已有nodejs环境并可运行,根目录在/usr/local/node
-
宿主机安装docker
-
电脑端安装git
构建Dockerfile
拉取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,使p构建镜像与容器”>构建镜像与容器
构建镜像
$ 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
获取本地ssh公钥,电脑端打开git bash
$ ssh-keygen
一路回车下去,然后打开C:UsersUsername.sshid_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服务
本地测试ssh并互换秘钥
本地git bash执行
$ ssh root@***.***.***.*** -p 8004 // 前面是宿主机ip后面是端口
首次执行ssh时需要输入yes连接,之后hexo才能正常推送
如果报错ERROR
ERROR // 如果多次更换docker,同配置ssh连接时需要删除客户机的known_hosts @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HASCHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
C:Usershughd.sshknown_hosts 删除该主机对应的旧信息即可
本地配置ssh配置文件
打开C:Usershughd.ssh,如果没有config文件则创建新的
Host是云主机ip地址,Port是容器映射到宿主机的端口8004
Host ***.***.***.*** Port ***
本地配置hexo
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
原文出处:webmad -> http://blog.webmad.net/2017/10/14/Docker%E9%85%8D%E7%BD%AEHexo+Git+Nginx/