Docker并不是容器,而是创建容器的工具,是应用容器引擎。其实看它的两句口号就可以很容易的理解它。第一句是“Build, Ship and Run”翻译过来便是“搭建、发送、运行”;第二句是“Build once,Run anywher”也就是只要搭建一次,到处都能用。比如你想在一片空地上盖房子,但你需要很多步骤才能将这个房子盖好,可是住了一段时间后你却想搬家了,只能重新盖房子。
Docker就像一个魔法,可以把你原本盖好的房子复制了放进背包里然后粘贴到另一个空地,其实就是“镜像”。Docker的三大核心概念分别是镜像(Image)、容器(Container)、仓库(Repository)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。每个人生成的不同镜像,可以互相交换,最终它就变成了一个公共仓库。
使用Docker时候,你会发现它真的是个宝藏,可以秒级开启应用,不用特别繁琐的配置什么,可以减轻很多这种重复性的劳动。Docker不适合虚拟化桌面,它比较适合linux族,Unix族以及应用程序的虚拟化。逻辑是这样的,在操作系统的概念里面,有一个内核,docker是基于Linux 内核,它不适用于Windows虚拟化,Windows操作系统有另外一个虚拟技术Hype-y。
Docker有一些缺点,表面上很方便,实际上工具链之间的衔接略微糟糕。它将linux的namespace做了深层次的封装,用户上手的难度低,部署到生产环境也很容易。但仅限于小型项目,换成稍微复杂一些的项目,依赖关系非常多的话,就能发现它会出现各种奇怪的bug。比如docker-compose之间的依赖不会等待被依赖者加载完毕,挂载volume有时会无法在entrypoint或command中执行命令,必须要用COPY等等,变得复杂和难以维护。
在进行多机部署的时候,跟着官方文档走都不能成功,上stackoverflow和github上查了半天也查不到任何解决办法,是经常发生的事情。Docker确实可以降低了运维难度,但是运营成本却提升了。它最大的一个缺点是十分吃硬盘。Docker封装的namespace,并没有对文件进行进一步的管理,只是粗暴的将文件到处复制粘贴。当服务器上开了数百个容器后发现1TB的硬盘被吃掉了一半时,意味着需要不停增加服务器资源才能维持系统的运行。除了磁盘空间的占用外,作为一名中国用户,时区、墙等都是问题。
当然所有问题都是可以解决的,只是比较浪费时间。毋庸置疑Docker是个非常酷的工具,它的优点还是远大于缺点的。但它并不是万能的,当你遇到架构简单,类似数据库+应用程序这种情况可以不用Docker,业务上Docker会占用太多资源的时候也可以考虑不用,因为服务器资源挺贵。
原文地址:https://www.toutiao.com/i6904507690052338184/