codelover2016

手把手教你用 Docker 搭建 Hexo 博客

  •  
  •   codelover2016 · May 25, 2018 · 7115 views
    This topic created in 2955 days ago, the information mentioned may be changed or developed.

    手把手教你用 Docker 搭建 Hexo 博客

    hexo

    • 快速、简洁且高效的博客框架,Node.js 所带来的超快生成速度,让上百个页面在几秒内瞬间完成渲染。

    • 只需一条指令即可部署到 GitHub Pages, Heroku 或其他网站。

    • Hexo 拥有强大的插件系统,安装插件可以让 Hexo 支持 Jade, CoffeeScript。

    npm install hexo-cli -g
    hexo init blog
    cd blog
    npm install
    hexo server
    

    以上来自Hexo 官网

    到这里,你的 hexo 博客已经初始化好了, blog/public 文件夹下面已经生成了对应的 HTML 文件.

    扩展阅读:

    docker 部署

    不 BB 这么多,先上 Dockerfile

    # node 环境镜像
    FROM node:latest AS build-env
    # 创建 hexo-blog 文件夹且设置成工作文件夹
    RUN mkdir -p /usr/src/hexo-blog
    WORKDIR /usr/src/hexo-blog
    # 复制当前文件夹下面的所有文件到 hexo-blog 中
    COPY . .
    # 安装 hexo-cli
    RUN npm --registry=https://registry.npm.taobao.org install hexo-cli -g && npm install
    # 生成静态文件
    RUN hexo clean && hexo g
    
    # 配置 nginx
    FROM nginx:latest
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    WORKDIR /usr/share/nginx/html
    # 把上一部生成的 HTML 文件复制到 Nginx 中
    COPY --from=build-env /usr/src/hexo-blog/public /usr/share/nginx/html
    EXPOSE 80
    
    

    接着跑一下看看.

    docker build -t 镜像名:latest .;
    docker run -p 80:80 -d 镜像名:latest;
    
    

    好了,完事....

    Nginx https 证书配置

    最后 Nginx 配置 https 证书的步骤.

    首先,你要有个证书,哪来的我不管了.

    PS:良心推荐https://freessl.org/直接生成免费证书

    然后 nginx.conf 如下:

    
    events {
        worker_connections 1024;
    }
    
    http {
        server {
                listen 443;
                server_name  codelover.link;
                root /usr/share/nginx/html;
                index index.html index.htm;
                ssl on;
                ssl_certificate /etc/nginx/full_chain.pem;
                ssl_certificate_key /etc/nginx/private.key;
    
    
                include       /etc/nginx/mime.types;
                default_type  application/octet-stream;
                gzip on;
                gzip_min_length 5k;
                gzip_buffers 4 16k;
                gzip_http_version 1.1;
                gzip_comp_level 3;
                gzip_types text/plain application/json application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
                gzip_vary on;
        }
        server {
            listen 80;
            server_name  codelover.link;
            root /usr/share/nginx/html;
            index index.html index.htm;
            include  /etc/nginx/mime.types;
            default_type  application/octet-stream;
        }
    
    }
    

    这时候用 docker 跑你的 hexo-blog 镜像的时候把对应的 pem 和 key 文件映射到对应路径记录.

    如下:

    # codelover-blog 为配置文件路径,codelover-blog/ssl 为证书路径
    docker run -p 80:80 -p 443:443 \
    --name codelover-blog \
    -v ~/docker-data/codelover-blog/nginx.conf:/etc/nginx/nginx.conf \
    -v ~/docker-data/codelover-blog/ssl/full_chain.pem:/etc/nginx/full_chain.pem \
    -v ~/docker-data/codelover-blog/ssl/private.key:/etc/nginx/private.key \
    --restart=always -d 你的 hexo-blog 博客镜像;
    

    顺手也把非静态文件的 nginx 配置放一份,如下:

    events {
        worker_connections 1024;
    }
    
    http {
        upstream webservers {
            #weigth 参数表示权值,权值越高被分配到的几率越大
            #本机上的 Squid 开启 3128 端口
            server 10.31.160.197:8080 weight=5;
            server 192.168.0.1:9090  weight=3;
        }
    
    
        server {
                listen 443;
                server_name  woyaozufang.live;
                location / {
                    proxy_pass   http://webservers;
                }
                ssl on;
                ssl_certificate /etc/nginx/full_chain.pem;
                ssl_certificate_key /etc/nginx/private.key;
                error_page   500 502 503 504  /50x.html;
                location = /50x.html {
                root   html;
                }
                gzip on;
                gzip_min_length 5k;
                gzip_buffers 4 16k;
                gzip_http_version 1.1;
                gzip_comp_level 3;
                gzip_types text/plain application/json application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
                gzip_vary on;
        }
    
    
        server {
            listen 8080;
            server_name  woyaozufang.live;
            location / {
                proxy_pass   http://webservers;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
        server {
            listen 80;
            server_name  woyaozufang.live;
            location / {
                proxy_pass   http://webservers;
            }
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
    
    }
    
    
    39 replies    2018-05-29 09:26:44 +08:00
    naiba
        1
    naiba  
       May 26, 2018 via Android
    把 v2 当博客用了😓去简书吧
    Luckyray
        2
    Luckyray  
       May 26, 2018 via iPhone
    我想问下多个机器上的 hexo 一般是怎么同步的?
    ZeoKarl
        3
    ZeoKarl  
       May 26, 2018 via iPhone   ❤️ 2
    Hexo 还用 docker?装个 nginx 不就好了,本地同步上去
    Mogugugugu
        4
    Mogugugugu  
       May 26, 2018 via Android
    三楼正解。
    Martox
        5
    Martox  
       May 26, 2018 via Android   ❤️ 4
    强行用 docker。我一个静态网站博客凭什么要用上 docker。想开启 https 的话,就 10 分钟,还是全站 https。看下我的水文。[10 分钟开启全站 https]( https://juejin.im/entry/5b07c51d6fb9a07 ) aa63232e2
    Martox
        6
    Martox  
       May 26, 2018 via Android
    @Martox 手机插入的 markdown 链接,错了。https://juejin.im/entry/5b07c51d6fb9a07aa63232e2
    Backlitz
        7
    Backlitz  
       May 26, 2018 via Android
    用 hexo 一般都是为了省服务器钱吧,不托管还有什么意义……
    loading
        8
    loading  
       May 26, 2018
    既然都写到这地步了,建议写一下 windows 装 Docker 算了,233.
    Showfom
        9
    Showfom  
    PRO
       May 26, 2018
    这个 docker 不是多此一举的感觉么。。。。apt install nginx 就可以解决的
    liyuhang
        10
    liyuhang  
       May 26, 2018
    V2EX 不是个人博客哦
    codelover2016
        11
    codelover2016  
    OP
       May 26, 2018
    @naiba 分享创造,您觉得不好的话请直接举报或者联系管理员删除....
    codelover2016
        12
    codelover2016  
    OP
       May 26, 2018
    @nieyujiang 真的看了我的 Dockerfile 了?我明明是直接用 Hexo 生成了静态文件,然后扔到了 nginx 的 docker 镜像里面,接着打包成了独立的博客镜像,在服务器上只需要自己直接把 docker 跑起来即可,甚至可以把 nginx 的配置都直接扔上去,到服务器上直接跑 docker 即可.一键部署什么都不需要还不美滋滋?
    codelover2016
        13
    codelover2016  
    OP
       May 26, 2018
    @nieyujiang 你觉得强行就强行咯,我觉得方便就方便.本地 push 到服务器么?嗯,我现在本地 push md 到 git 仓库,阿里云帮我打包镜像,jenkins 帮我自动发布.嗯,闲着蛋疼的...
    codelover2016
        14
    codelover2016  
    OP
       May 26, 2018
    @liyuhang 我发在分享发现栏目,还好吧....
    codelover2016
        15
    codelover2016  
    OP
       May 26, 2018
    @Showfom 就是不想在服务器上装啊,用 docker 都是这种原因,各种环境隔离....
    Showfom
        16
    Showfom  
    PRO
       May 26, 2018
    @codelover2016 你个静态博客有啥好隔离的。。。
    codelover2016
        17
    codelover2016  
    OP
       May 26, 2018
    @Showfom 服务器不知只有一个博客,还有别的东西嘛,大家都在 docker 里面跑,怎么玩都可以,大概是这个意思.
    love4taylor
        18
    love4taylor  
    PRO
       May 26, 2018 via Android
    真的累.... 直接 git push 然后由 GitLab CI 处理 rsync 到服务器或者到 GitLab Pages 多方便啊...
    codelover2016
        19
    codelover2016  
    OP
       May 26, 2018
    @Love4Taylor Gitlab CI 能自动生成静态文件么(我没用过不知道啊,也没人分享给我)?没人发现其实我这里不需要本地有 hexo?我换个地方换台机器也只需要把 md 扔上去就可以了
    love4taylor
        20
    love4taylor  
    PRO
       May 26, 2018
    @codelover2016 #19 当然可以, 你可以设置为只要有 push 就自动触发. 你 push 一个 md 就自动发布喽

    Muchisan
        21
    Muchisan  
       May 26, 2018
    这是在干嘛…… Github+Travis CI 就可以完成你要的效果了,何必占用个服务器资源。

    操作方法详见(我的博客): http://muchisan.space/blog/articles/post-20180116171947.html
    zthxxx
        22
    zthxxx  
       May 26, 2018
    静态博客也要强行上 docker 跟风。。。
    同 #25 楼,Github + Travis CI 一套
    https://blog.zthxxx.me/posts/Build-Hexo-Blog-by-Travis-CI
    codelover2016
        23
    codelover2016  
    OP
       May 26, 2018
    @Muchisan 我博客又不挂 Github Pages,我在我的自己服务器上跑.当然你们还能说自己服务器开个 webhook 让 GitHubt 通知然后自己跑一下 SH 更新就可以.嗯,没毛病...
    codelover2016
        24
    codelover2016  
    OP
       May 26, 2018
    @zthxxx 嗯,强上 Docker 不行么?我也是给我的方法罢了.
    Showfom
        25
    Showfom  
    PRO
       May 26, 2018 via iPhone
    @codelover2016 跑别的东西 nginx 也只要装一个就够了
    qfdk
        26
    qfdk  
    PRO
       May 26, 2018 via iPhone
    看到 docker 了 来安利一下我的黑科技 https://github.com/qfdk/EasyDockerWeb
    codelover2016
        27
    codelover2016  
    OP
       May 26, 2018
    @qfdk 可以可以,已 star
    codelover2016
        28
    codelover2016  
    OP
       May 26, 2018
    @qfdk 如果支持接入多主机,基本就是 daocloud 那一套东西了.
    qfdk
        29
    qfdk  
    PRO
       May 26, 2018
    @codelover2016 #27 基本都是玩具啦啦啦。 对搞成 Devops,加上流水线啥的。之前把所有的玩意儿都 docker 化了,有时候确实方便
    whatsmyip
        30
    whatsmyip  
       May 26, 2018
    @qfdk 这个轮子有什么特殊的地方吗?感觉已经有好多了

    https://blog.newnius.com/docker-cluster-web-ui.html
    Muchisan
        31
    Muchisan  
       May 26, 2018   ❤️ 1
    @codelover2016 没说只有 Github 能这么用,不过我觉得还是别说了,你有些不能接受不同的意见,对每个你不喜欢的评论都要用怼的方式回复,所以……你弄这个挺有想法, 还有自己高兴就好吧。
    qfdk
        32
    qfdk  
    PRO
       May 27, 2018
    @whatsmyip #29 其实一开始的版本是针对特殊功能的,就是已经准备好了镜像,然后挂载本地代码,然后 docker 中编译。因为生产环境中需要维护一个很老的项目,很多 jar maven 已经失效了,还有一些内部的 jar,对于新来的员工无法搞定编译环境,然后就搞了个这个东西,后来发现可以搞得功能全一点儿,一个镜像的操作,具有自动查找镜像的功能,然后容器操作基本就是很基础的操作,只是给需求简单的用户并不想花更多时间来学习一个新的 UI 的人来的。 比如你可以建立 n 个酸酸乳容器等等,因为没有很复杂的功能,也用不着很复杂的功能,配合 forever 效果良好 :) 顺便也是一个 nodejs 的版本 配合了 html5 界面,没有什么前端全家桶。
    Raincal
        33
    Raincal  
       May 27, 2018
    可以在 DaoCloud 中构建项目 然后把构建的镜像部署在 VPS 上
    nginx 可以换成 alpine 版本 这样镜像会小点
    Chieh
        34
    Chieh  
       May 27, 2018 via Android
    直接用 GitHub pages 貌似更简单
    exkernel
        35
    exkernel  
       May 27, 2018 via iPhone
    直接用 caddy 吧 自带证书
    yazoox
        36
    yazoox  
       May 27, 2018 via Android
    @Martox 你的网站挂了!
    Martox
        37
    Martox  
       May 28, 2018
    @yazoox 没挂啊
    yuanfnadi
        38
    yuanfnadi  
       May 28, 2018
    @Showfom docker 搭配上 gitlab-ci 可以做到提交代码自动构建 构建完自动拉取最新镜像 然后发布。方便很多。
    codelover2016
        39
    codelover2016  
    OP
       May 29, 2018
    @Muchisan 一群人冷嘲热讽我也很绝望,我个人感觉我还属于在阐明我的目的.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2855 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 12:38 · PVG 20:38 · LAX 05:38 · JFK 08:38
    ♥ Do have faith in what you're doing.