Docker 初探与持续部署

Docker 初探

前段时间在翻新服务器的时候稍微搞了下 docker,然后发现以前对容器的理解完全是错的,最近稍微系统学了点,这里记录下浅显的东西。

  • image 只是文件层的东西,相当于 /root 下的文件,相当于一个可以随时被 chroot 的文件系统。
  • 同上,image 的 build 过程实际上就是 build 文件系统的过程。build 出来之后就可以直接使用了,与环境无关(但是内核依然是系统的内核?)
  • 镜像不可变,容器内容有更新都可以 commit 出一个全新的镜像。所以要尽可能的把变的东西放在容器外面,作为 volumn 挂载(比如数据库的物理层,log 文件,配置文件等)。
  • 容器之间可以连接,就可以通过虚拟网桥通讯,并且会自动设置 hosts 与环境变量。

用起来感觉容器最大的好处就是减少了配置和分发部署的成本。以前配服务器需要好久而且和发行版有关。现在真正做到一键部署。

持续部署

之前在个人项目里面尝试过持续部署。

是基于 github 的 webhook(基于 caddy),我这边推了代码,服务器接到通知,拉代码,然后跑脚本部署。

其实可用性也是很高,也很方便。不过没有一个地方可以看 log,而且也不方便做服务器迁移,而且各个部分耦合度很高,不好做 dockerize。

后来考虑把服务器容器化之后就开始想着如何做持续部署了,这个时候在做一个 hitokoto 的玩具。由三部分组成:

  1. PostgreSQL 数据库(以及一堆 SQL 脚本)
  2. node 服务,起一个 API 服务器处理各种请求。
  3. 前端,最后会 build 成静态文件。
  4. web server 分发前后端流量。

最后选择的平台是 Docker cloud/Dao cloud。

这两个平台都有 service/stack 的概念,大概就是单个容器即服务,多个服务组成一个应用栈。配置文件和 docker compose 的差不多,但是平台会自动帮你更新(重新部署)服务,可以很方便的做整个应用的管理。

上面两个平台的好处是可以自动帮你 build docker image(基于 webhook),而且 image 更新了还可以自动做 redeploy。总之,不太需要做什么就完成了自动部署。

至于前端方面,觉得没有必要加一层容器,考虑的是在 CI 构建,并直接推代码到 volumn 里面去。测试补全了,也可以让其他服务在 CI 先测试,然后部署。最后选择了 circleci,因为 travis ci 要给 ssh key 的话要钱……不过感觉 circle ci 其他方面都要弱好多。

Table of Contents