手把手教你用 Docker 搭建 Hexo 博客 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codelover2016
V2EX    分享发现

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

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

    手手教你用 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 一般是怎么同步的?
    ZeoKarl
        3
    ZeoKarl  
       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  
    PRO
       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  
    PRO
       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  
    PRO
       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  
    PRO
       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  
    PRO
       2018-05-26 18:25:35 +08:00 via iPhone
    @codelover2016 跑别的东西 nginx 也只要装一个就够了
    qfdk
        26
    qfdk  
    PRO
       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  
    PRO
       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
    @odelover2016 没说只有 Github 能这么用,不过我觉得还是别说了,你有些不能接受不同的意见,对每个你不喜欢的评论都要用怼的方式回复,所以……你弄这个挺有想法, 还有自己高兴就好吧。
    qfdk
        32
    qfdk  
    PRO
       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     Solana     5870 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 03:37 PVG 11:37 LAX 20:37 JFK 23:37
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86