本文尝试解释两者的不同,不涉及底层知识。相当于科普小知识。
一个谨慎的比较docker和vm,个人觉得Container像个一个迷你的vm
从某种意义上说,这是正确的。但从另一个角度来看,这是非常不准确的,可能会让读者导致混乱,错误的假设。
需要理解的重要相似之处是,这两种方法都是为部署和运行应用程序创建隔离环境的方法。
VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;
容器完全在容器主机的应用程序层中运行。在UserLAnd[1]中,OSs有内核空间,操作系统的核心在其中运行。然后是用户空间,所有与用户活动相关的东西都在这里运行。没有安装操作系统。容器共享主机的内核空间,类似于主机中的一个用户,LXC所实现的隔离性主要是来自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace将container的进程, 网络, 消息, 文件系统和hostname 隔离开。但是,cgroup的隔离性要比kvm粒度大,并且很难metric指标。比如,磁盘的IO就很难隔离。导致一个容器的io增大,这个主机都有可能hang。
容器实际上就是一个进程。当它在容器内时,感觉就像一台完全独立的机器。我们可以启动新的进程,当监控这些进程时,您将只看到容器内的进程。但是,如果您监控主机进程,仍然能够看到容器中运行的所有内容。
容器共享主机。那么他是如何在同一台机器上运行Ubuntu和centos呢?
因为容器实际上共享主机的内核。特定的linux发行版都构建在同一个内核之上(尽管版本不同)。所有的包管理器、UI之类的东西,以及其他各种软件,都可以在用户空间中运行,这些软件使发行版独一无二,并创造出不同的Linux风格。具有不同发行版的不同容器可以在同一台机器上运行而不会产生冲突。
当涉及到平台设计时,这个内核共享事实还有其他重要的含义。例如,windows容器将不能在Linux主机上运行。
容器本质上是不可变的。 容器操作系统、库、实用程序和应用程序在构建时都是冻结的,在此之后它就不能更改了。所以,不需要以传统的方式更新容器。重新构建和重新部署。虽然有一些缺点,但是在可重复性、简化部署和可靠性方面有很大的提高。
镜像其实是一个标准的文件包,它表示容器运行时文件系统的状态。这可以发布到注册表,也可以用作父镜像。
大多数镜像将构建在父镜像之上(父镜像通常也构建在另一个镜像像之上)。基本映像没有父镜像的。
下面是一个完整的ubuntu镜像[2]
简而言之,容器化为单个OS上的工作负载隔离提供了标准化的方法,而虚拟化为在一台服务器上安装多个OSs提供了标准化的方法。它们在业界都很突出,在云计算中经常一起使用。
因为容器没有安装完整的操作系统,所以它的重量更轻,因为下载和运行更快,存储更小。
下图以尽可能简单的方式说明了上述差异。请注意使用VMs和容器运行相同的两个工作负载的堆栈组合。
如果大家理解了上面描述的容器和vm之间的关键区别,那么第二个图将提供对正在发生的事情的更深入的信息。大家可以清楚地看到这两种技术如何提供工作负载隔离。
记住,堆栈表示逻辑层次结构。我们知道这些容器都在主机操作系统上作为唯一的进程运行,而VM客户操作系统是成熟的操作系统,可以管理它们自己的进程。
现在,让我们看看vm和容器通常是如何一起使用的。假设我们想在云中运行Python Flask应用程序和JAVA Spring应用程序。下图描述了AWS上可行的状态。
Amazon EC2是Amazon的托管计算服务。这意味着用户不需要担心服务器或管理程序。我们只需选择实例类型(针对不同工作负载的不同特性)并部署VM。(国内的同学们还是使用阿里云吧)
有许多不同的Amazon机器镜像可供选择[3],或者可以创建自己的镜像。因为vm比容器更重。
我们可以在许多不同的服务中共同使用VM镜像。可以将基本操作系统、包更新、一些脚本、监视代理的安装和配置,以及其他操作和安全工具打包到vm中。
通常使用配置管理工具(如Ansible或Chef)来管理工作负载或服务。Chef已经是devops的标准管理工具。
下一个例子提供了一个非常基本的架构图,了解在云中运行容器的基本原理。
容器编排工具用于在平台上管理容器,在这个平台上,让我们感觉就像是在处理一台机器一样透明。这是通过巧妙地管理集群(云中的机器或vm集群)来实现的。它们可以通过自动化资源调度、扩展和工作负载管理功能来扩展容器的优点。Kubernetes是目前最流行的容器编排平台。
这些工具在体系结构上很复杂,很难配置和让他们良好的运行(坑还是比较多的)。但从用户的角度来看,它们非常棒,而且随着知识的增长、反馈的实现和托管服务的出现,它们越来越容易管理。
最后,我们希望获取Python容器并在本地机器上运行它。 它们允许我们相对容易地在机器上运行与生产中完全相同的内容。
Docker是一个本质上Linux应用程序。不过,Docker提供了易于使用的特点,可以在后台处理VM的运行 。上面显示了在Mac上部署docker应用程序的逻辑架构。
阿里的数据库基本都已经做到了docker化,这其中在存储、网络、数据库和docker本身都做了大量的优化。要想把整体服务docker化在技术上来讲还是很难的。会用和用好难度是不一样的。
[1]:https://play.google.com/store/Apps/details?id=tech.ula&hl=en_US 需要翻墙
[2]:https://github.com/tianon/docker-brew-ubuntu-core/blob/9db8c72dd02e8f9fd5dba82ff9266174b088e2e6/bionic/Dockerfile?source=post_page-----94c558905b6----------------------
[3]:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html