在连续两年里为每一个项目都配备一个docker后,我变得越来越不喜欢使用docker了。
不过值得肯定的是,在写完dockerfile和docker-composer之后,一行代码直接部署的痛快感,真的会让人身心愉悦。
但是,为了这一行代码的部署,调试过程也是十分折磨人的。
docker表面上很方便,其实工具链之间的衔接十分糟糕。
docker将linux的namespace做了深层次的封装,使用户上手的难度非常低,部署到生产环境也很容易。但这仅限于小型项目,比如你的一个nodejs+mongodb或者php+mysql的架构方式。如果是稍微复杂一些的项目,依赖关系非常多的话,你会发现,docker会出现各种神奇的bug。比如docker-compose之间的依赖不会等待被依赖者加载完毕,挂载volume有时会无法在entrypoint或command中执行命令,必须要用COPY…诸如此类,原本不需要如此复杂的部署,如今却变得复杂和难以维护。
在进行多机部署的时候,跟着官方文档走都不能成功,上stackoverflow和github上查了半天也查不到任何解决办法,是经常发生的事情。
当然用多了之后会习惯docker的不完美,但也会让你思考,这个项目一定需要使用docker吗?
docker的确降低了运维难度,但是加大了运营成本。
在我看来,docker最大的一个缺点是,十分吃硬盘。docker封装的namespace,但是并没有对文件进行进一步的管理,只是粗暴的将文件到处复制粘贴。当服务器上开了数百个容器后发现QQ买卖平台1TB的硬盘被吃掉了一半时,我的内心里只有两个字:绝望。这意味着需要不停增加服务器资源才能维持系统的运行,如果不采用docker部署的方式,可能并不需要如此大的磁盘空间。
除了磁盘空间的占用外,作为一名中国用户,时区、墙等都是问题,当然这些问题都是可以解决的,但是也很花费时间。
我并不是在指责docker的不好,正相反,我觉得docker是个非常酷的工具。使用docker后,在我更新半年前写的爬虫时,完全不用担心该怎么从新部署,还是那条熟悉的命令即可完成,减轻了很多记忆上的压力。
那么在什么时候不必使用docker呢
架构简单,类似数据库+应用程序这种情况是不需要docker的,因为你花在调试docker上的时间可能比你完成具体业务逻辑的时间还要多(想偷懒不想安装各种库时除外);业务上docker会占用太多资源的时候可以考虑不使用docker,因为服务器资源真的很贵;
啊,想来想去,不使用docker的场景真少啊,说到底我还是喜欢使用docker的,连多找几个不用docker的理由都找不到(笑。
docker并不是万能的,但如果你现在告诉我不要使用docker,我可能还做不到(docker是一个让人用上就不想扔的产品,部署时的如丝般流畅还是够吸引人啊)。