Docker配置Hexo+Git+Nginx

功能需求

像我这种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,使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

获取本地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服务

本地测试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 删除该主机对应的旧信息即可

本地配置ssh配置文件

打开C:\Users\hughd.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
标签:GITDockerNginx 发布于:2019-11-05 14:10:07