关于 Docker

Docker 有多火,相信大家都很清楚,在一些互联网的大群一问基本上 60% 以上的人已经迁移到 Docker 或者正在往 Docker 迁移。类似这样的文章也是相当多:

为什么 Docker

为什么大家都在往 Docker 迁移:

  • Scale
    • 横向 Scale,只需要多开一个 Container,而多开一个 Container 与多开一个进程并无太大区别
    • 执行效率开销,由于是 Container 而不是 VM,虚拟化这一层的性能几乎可以忽略
    • 秒级的开机速度
  • 安全性
    • 每个服务独立在自己的 Container,起码在文件系统层面有一定的防护
    • CPU 内存限制,不怕因为某个服务出现过载而影响到别的服务

Docker 的缺点

  • Root 权限,Docker 是基于 Root 权限运行的,如果某一天 Docker 被攻破,而你的系统又可以 getshell,意味着入侵者可以轻松进来随便玩,所以在 Docker 使用过程中尽可能不要挂载文件目录。
  • AUFS,这玩意据说效率不好,具体多不好我们没有测试。由于我们一直在用 MongoDB 提供的 MongoDB 4000IOPS,所以我们不考虑将数据库服务迁移到 Docker 里面(最近这服务在 AWS 下架了,MongoDB你在玩我)。

为什么我们选择 Docker

  • 我们有一些服务是单线程,多进程,由于 EC2 低配机器并不划算,我们是买了高配然后跑多个进程的。
  • 部分服务需要 auto-scale,特别是出现新闻热点的时候,NLP 就需要 scale。之前我们的 scale 是发个邮件给我或者CTO然后启动新的 VPS,再上去部署一遍 NLP。这怎么看都不靠谱,毕竟之前业务量小(恩,现在业务量也小)。

我们如何迁移到 Docker

购买 Docker Private Repositories

有些内部的 Docker File 并不希望公开,而且也没有公开的意义,所以购买了最低的 20-Repositories 的套餐。

使用可信的 Docker Repo

Docker 上我们尽可能使用了官方的 Repository,之前部分服务选用了 Dockerfile Project 的 Repository。不知道为啥被下架了,幸好除了 Java 以外其他服务都有官方的替代。Java 方面可能是协议的原因,官方的 Java Repository 没有 Oracle-JDK,所以 Java 方面我基于 jenv 写了一个 chaopeng/jenv,有需要的朋友可以参考或者 pull 来用,另外也建议使用 azul/zulu-openjdk

监控与部署

监控方面由于没有人力去开发,我们暂时使用了 shipyard,暂时是只能监控进程生存和一些简单的部署的工作,另外用他提供的 API,我们做了一些简单的自动 Scale。有位巴西的同事在试用 ansible,看上去功能更全,我们也用可能转过去。