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

2018-05-25 23:20:51 +08:00
 codelover2016

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

hexo

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;
        }
    }

}

6344 次点击
所在节点    分享发现
39 条回复
Muchisan
2018-05-26 14:28:03 +08:00
这是在干嘛…… Github+Travis CI 就可以完成你要的效果了,何必占用个服务器资源。

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/457864

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX