V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codelover2016
V2EX  ›  分享发现

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

  •  
  •   codelover2016 · 2018-05-25 23:20:51 +08:00 · 6352 次点击
    这是一个创建于 2378 天前的主题,其中的信息可能已经有所发展或是发生改变。

    手把手教你用 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 条回复    2018-05-29 09:26:44 +08:00
    naiba
        1
    naiba  
       2018-05-26 01:27:50 +08:00 via Android
    把 v2 当博客用了😓去简书吧
    Luckyray
        2
    Luckyray  
       2018-05-26 01:29:52 +08:00 via iPhone
    我想问下多个机器上的 hexo 一般是怎么同步的?
    nieyujiang
        3
    nieyujiang  
       2018-05-26 05:36:07 +08:00 via iPhone   ❤️ 2
    Hexo 还用 docker?装个 nginx 不就好了,本地同步上去
    Mogugugugu
        4
    Mogugugugu  
       2018-05-26 08:41:46 +08:00 via Android
    三楼正解。
    Martox
        5
    Martox  
       2018-05-26 08:45:51 +08:00 via Android   ❤️ 4
    强行用 docker。我一个静态网站博客凭什么要用上 docker。想开启 https 的话,就 10 分钟,还是全站 https。看下我的水文。[10 分钟开启全站 https]( https://juejin.im/entry/5b07c51d6fb9a07 ) aa63232e2
    Martox
        6
    Martox  
       2018-05-26 08:47:07 +08:00 via Android
    @Martox 手机插入的 markdown 链接,错了。https://juejin.im/entry/5b07c51d6fb9a07aa63232e2
    Backlitz
        7
    Backlitz  
       2018-05-26 09:05:51 +08:00 via Android
    用 hexo 一般都是为了省服务器钱吧,不托管还有什么意义……
    loading
        8
    loading  
       2018-05-26 09:19:57 +08:00
    既然都写到这地步了,建议写一下 windows 装 Docker 算了,233.
    Showfom
        9
    Showfom  
       2018-05-26 12:09:07 +08:00
    这个 docker 不是多此一举的感觉么。。。。apt install nginx 就可以解决的
    liyuhang
        10
    liyuhang  
       2018-05-26 12:37:47 +08:00
    V2EX 不是个人博客哦
    codelover2016
        11
    codelover2016  
    OP
       2018-05-26 12:49:43 +08:00
    @naiba 分享创造,您觉得不好的话请直接举报或者联系管理员删除....
    codelover2016
        12
    codelover2016  
    OP
       2018-05-26 12:53:32 +08:00
    @nieyujiang 真的看了我的 Dockerfile 了?我明明是直接用 Hexo 生成了静态文件,然后扔到了 nginx 的 docker 镜像里面,接着打包成了独立的博客镜像,在服务器上只需要自己直接把 docker 跑起来即可,甚至可以把 nginx 的配置都直接扔上去,到服务器上直接跑 docker 即可.一键部署什么都不需要还不美滋滋?
    codelover2016
        13
    codelover2016  
    OP
       2018-05-26 12:55:42 +08:00
    @nieyujiang 你觉得强行就强行咯,我觉得方便就方便.本地 push 到服务器么?嗯,我现在本地 push md 到 git 仓库,阿里云帮我打包镜像,jenkins 帮我自动发布.嗯,闲着蛋疼的...
    codelover2016
        14
    codelover2016  
    OP
       2018-05-26 12:56:56 +08:00
    @liyuhang 我发在分享发现栏目,还好吧....
    codelover2016
        15
    codelover2016  
    OP
       2018-05-26 12:57:54 +08:00
    @Showfom 就是不想在服务器上装啊,用 docker 都是这种原因,各种环境隔离....
    Showfom
        16
    Showfom  
       2018-05-26 12:59:07 +08:00
    @codelover2016 你个静态博客有啥好隔离的。。。
    codelover2016
        17
    codelover2016  
    OP
       2018-05-26 13:00:58 +08:00
    @Showfom 服务器不知只有一个博客,还有别的东西嘛,大家都在 docker 里面跑,怎么玩都可以,大概是这个意思.
    Love4Taylor
        18
    Love4Taylor  
       2018-05-26 13:10:19 +08:00 via Android
    真的累.... 直接 git push 然后由 GitLab CI 处理 rsync 到服务器或者到 GitLab Pages 多方便啊...
    codelover2016
        19
    codelover2016  
    OP
       2018-05-26 13:16:23 +08:00
    @Love4Taylor Gitlab CI 能自动生成静态文件么(我没用过不知道啊,也没人分享给我)?没人发现其实我这里不需要本地有 hexo?我换个地方换台机器也只需要把 md 扔上去就可以了
    Love4Taylor
        20
    Love4Taylor  
       2018-05-26 13:29:54 +08:00
    @codelover2016 #19 当然可以, 你可以设置为只要有 push 就自动触发. 你 push 一个 md 就自动发布喽

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

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

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