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

一个 hexo 的最小化服务器端 docker 构建脚本,需要的自取

  •  
  •   cnnblike ·
    cnnblike · 2016-12-27 09:05:18 +08:00 · 4491 次点击
    这是一个创建于 2907 天前的主题,其中的信息可能已经有所发展或是发生改变。

    xD 众所周知,大部分 docker 服务提供商诸如 hyper.sh 还有网易蜂巢之类的,都是按容器的大小和数量计费的,因此虽然 docker 官方给的最佳实践是“每个容器只包含一个程序”,但实际上你一个一万年都不会有人访问的博客服务,当然是能省则省,这个脚本就是出于这个目的来设计的——我虽然没有挑战 64mb VPS 那种想法,但是这个脚本构建出来的内存还真的不需要 64mb ,因为不通过 git deployer 提交内容的时候,常态化运行的只有这三个:

    1. nginx - 提供静态网页服务

    2. ssh - 通过 git 提交时会用到

    3. hypervisor - docker 启动时自动启动两个程序,在 ssh 和 nginx 挂掉的时候自动重开,在更新 nginx 设置后提供 hypervisorctl restart nginx 的动作

    我在 hyper.sh 上试了一下,这个镜像的内存占用只有 59mb ,如果把 openssh 换成 dropbear ,把 bash 换成其他莫名其妙的 sh ,把 nginx 换成 lighttpd ,内存占用会更少——当然我更加建议你在 hyper.sh 上最少使用 128M 的容器为好, 64M 一个月和 128M 一个月也就差了 0.5 刀,总不至于连这点钱都出不起,哈哈。

    地址在这里: https://github.com/cnnblike/hexo-server-all-in-one

    构建方法: 把自己的 blog.pub (公钥)放到目录下,然后docker build -t test:v1 .

    部署方法自行参照自己的 docker 服务提供商。

    如何向这个 docker 灌注内容呢?

    你需要两个 repo ,一个 repo 是 content-repo ,一个 repo 是 config-repo 。

    content-repo 的信息如下: ssh://root@<your domain="">/var/repo/blog.git ,其中的内容会通过 post-hook 自动复制到 /var/www/html/中,复制后 nginx 会自动重启

    config-repo 的信息如下: ssh://root@<your domain="">/var/repo/config.git ,其中的内容会通过 post-hook 自动复制到 /etc/nginx/中,复制后 nginx 会自动重启

    事实上,我已经通过自 host 的 gogs 和 jenkins 搭起了一个全自动部署的服务,这样子就可以达到我在 gogs 的网页上修改了后台的 md 文件,会自动推送到 jenkins 服务器进行 hexo g 然后 hexo d 到这个展示的静态 docker 中,感觉还不错,你们有兴趣的话我可以把过程拿出来分享一下

    14 条回复    2016-12-27 16:43:04 +08:00
    leopku
        1
    leopku  
       2016-12-27 10:29:39 +08:00
    这不完全是虚拟机的思维用 docker 嘛
    GOOD21
        2
    GOOD21  
       2016-12-27 10:35:24 +08:00
    "但实际上你一个一万年都不会有人访问的博客服务"...

    莫名戳中泪点...
    cnnblike
        3
    cnnblike  
    OP
       2016-12-27 10:54:03 +08:00
    @leopku

    几个点:
    0.hypervisor+多进程就是虚拟机了?这里实际上工作的只有 nginx , git 和 ssh 只在被调用的时候才消耗内存。

    1.docker 便宜,而且买到多少内存的 docker 就是多少内存的 docker ,不像 vm ,你买个 OpenVZ 怕超售,买个 128M 的 KVM , ramnode 那种,一年 15 刀的,价格和 hyper.sh 上一样,但是 128M 的内存,系统内核又吃掉一大半。

    2.国内最便宜的可备案服务器是网易蜂巢的 Docker ,网易一个月 30 块, 640M 内存,送 50G 流量,比阿里云便宜得不知道到哪里去了,更不要说阿里云根本都特么不卖 512M 内存的了。

    3.相同的功能如果要分成 nginx 和 ssh 分开弄,两个共享一个 docker volume 这么复制来复制去,加起来就是 3 个 docker ,兄弟预算和我不一样。
    我在做一个自我挑战,就是一个月花 10 刀,在美国和中国各部署一份服务,保持中美两国的访问速度都在某个范围内。

    4. Phusion 对于容器内多任务的看法是这么说的:
    ```
    "But I thought Docker is about running a single process in a container?"
    Absolutely not true. Docker runs fine with multiple processes in a container. In fact, there is no technical reason why you should limit yourself to one process – it only makes things harder for you and breaks all kinds of essential system functionality, e.g. syslog.
    We encourage you to use multiple processes.
    ```
    我觉得你还是看得片面了
    fucker
        4
    fucker  
       2016-12-27 10:55:01 +08:00
    "但实际上你一个一万年都不会有人访问的博客服务"...

    莫名戳中泪点...
    bonfy
        5
    bonfy  
       2016-12-27 10:59:20 +08:00
    "但实际上你一个一万年都不会有人访问的博客服务"...

    莫名戳中泪点...
    bonfy
        6
    bonfy  
       2016-12-27 11:00:05 +08:00
    "但实际上你一个一万年都不会有人访问的博客服务"...

    莫名戳中泪点.....
    shyling
        7
    shyling  
       2016-12-27 12:04:45 +08:00
    还是喜欢通过 auto build 直接把静态文件写到 image 里,然后 deploy 这个 image ,而不是做个 git repo 。。。
    oott123
        8
    oott123  
       2016-12-27 12:19:33 +08:00
    同意 #7
    完全可以通过自动构建服务,就只需要运行一个 nginx 就好……
    当然了,你都有自动构建服务了,那不如托管到 xx pages 上……
    cnnblike
        9
    cnnblike  
    OP
       2016-12-27 12:54:14 +08:00
    @shyling
    @oott123

    现在各家容器托管商的操作流程不大一样,如果统一放到 CI 里面的话,可能到最后 Travis 脚本就变成了纠结这堆托管商的 API 啊之类的事情了。

    我个人的想法就是直接把内容部署和容器托管商分开,比方说我可能需要一个德国的 docker ,但是德国当地没有 docker 提供商,只有 VPS 提供商,这样把 docker 部署到 vps 之后,部署用的 git 那一套就是统一的了。

    github pages 我也想过,国内的状态还是尴尬。一来是墙,二来是速度,在浙江省境内,网易蜂巢的 ping 不超过 10ms ,完全没法比

    另外的考虑就主要是以后还可能要在 image 上跑一些小的实验性的玩具吧, pages 灵活性不大够,加上前几天 github 又对 pages 加各种限制,感觉靠谱度又下降了
    leopku
        10
    leopku  
       2016-12-27 13:57:17 +08:00
    @cnnblike
    支持 @shyling +1

    跟 travis 、 API 、 pages 神马的都没关系,难道标准姿势不是 把 image push 到 hub 或 registry ,然后再从 hub 或 registry pull image 么
    shyling
        11
    shyling  
       2016-12-27 14:02:16 +08:00
    https://github.com/lingmm/IssueBlog 窝这个就是类似那样的。不过我留的文件稍微多了点
    cnnblike
        12
    cnnblike  
    OP
       2016-12-27 14:27:44 +08:00 via iPhone
    @leopku
    你们的意思是先 push ,然后让 docker 提供商自己去 pull ?可这样你还是要在自动脚本里面写一句比方说 hyper compose up 这种的啊,有些 docker 提供者提供的是 json 格式的部署脚本,有些用的是 yml 形式的,还有些只提供了 api 没 cli 的你还要自己写个脚本去 post 请求,这不是比复杂更复杂了么
    cnnblike
        13
    cnnblike  
    OP
       2016-12-27 14:29:34 +08:00 via iPhone
    @leopku 像蜂巢好像连 docker volume 都还没有,嗨呀好气啊
    shyling
        14
    shyling  
       2016-12-27 16:43:04 +08:00
    @cnnblike 这倒是麻烦了 0v0 我是自己的 vps 上的 docker
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3107 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:46 · PVG 18:46 · LAX 02:46 · JFK 05:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.