目录
- docker解决的问题
- 1. 开发、测试和运维人员之间的矛盾
- 2. 更轻量的虚拟化,节省了虚拟机的性能损耗
- 虚拟机与容器的区别
- 1. 虚拟机
- 2. 容器
- Docker 系统架构
docker解决的问题
1. 开发、测试和运维人员之间的矛盾
“程序在我这跑得好好的,在你那怎么就不行呢”
这是一个典型的应用场景,Docker image中包含了程序需要的所有的运行时依赖,比如java的程序,肯定要在image中包含jdk;比如Python的程序,肯定要在image中包含对应版本的Python解释器。程序在我这跑得好好的,去你那就不行了,显然是环境问题。Docker把整个运行时环境打包放到image中,所以搞定了环境依赖问题。
我们知道,一个程序要跑起来,需要这么几部分:代码 + 运行环境 + 配置 + 依赖的服务。代码当然就是同一份代码,环境如果都一样,通常不会有问题。Docker image中包含了运行环境+配置,这对部署相当友好。如果你没有做过这种系统,那你肯定装过软件,装一些复杂的软件的时候有没有因为版本依赖或者编译参数等让你抓狂?用了Docker再也没有这种问题了:
docker pull xxx;
docker run xxx;
所以总结起来就是:Docker解决了运行环境和配置问题,方便部署,也就方便做持续集成。
2. 更轻量的虚拟化,节省了虚拟机的性能损耗
“系统好卡,肯定是又有哪个哥们的程序在作孽了”
。现在的服务器都牛的很,动不动128G内存,24个CPU,Linux本身就是个多租户的操作系统,可以多人共用,但是如果某个程序狂吃内存和CPU,占用了太多系统资源,这就会影响其他程序的运行。一个公司的几个同事共用一台机器出现这种问题可以通过内部协调沟通解决。但是云主机提供商呢?不同的用户之间不认识,共用一台强大的计算机,结果某个程序耗尽了资源,其他用户肯定不乐意了。
所以虚拟机出现了,做了资源隔离,不同用户之间彼此老死不相往来,不会相互影响,世界一下子清静了。但是,虚拟机有缺点:创建速度慢,迁移起来麻烦,因为中间多了虚拟硬件和虚拟操作系统的创建,有了性能损耗。
一台高性能服务器创建十几个虚拟机,太浪费了……
相对虚拟机的重量级虚拟化方案,Linux内核级的一些隔离方案让人们看到了希望,cgroups、namespace、tc、quota、chroot、lxc,终于,Docker出现了,Docker利用这些成熟的技术。(详见:深挖 Docker 之 Linux namespace 和 cgroups),让虚拟化变得轻量了起来,创建一个container瞬间完成,速度可以达到秒级甚至是毫秒级!性能损耗非常小,虽说隔离性没有虚拟机那么彻底,安全性上稍差一些,但也基本可以用,不用太担心。
虚拟机与容器的区别
Docker 容器的本质就是通过容器虚拟技术虚拟出的一台主机,就像虚拟机一样。可以将应用及其运行环境部署在这台虚拟出的主机上运行。但容器与虚拟机又有着本质的不同。
1. 虚拟机
传统的虚拟技术是在物理机的操作系统之上安装一个虚拟机管理程序,例如 VMware、VirtualBox 等。在其管理下可以创建很多个虚拟机。每个虚拟机需要安装自己独立的操作系统,而应用就是安装在虚拟机操作系统之上的程序,应用程序通过调用各种命令或库函数来使用其需要的各种系统资源。
对于完全相同的两个应用,其若需要运行在两个虚拟机中,则就需要两套完全相同的虚拟机操作系统与 Binaries/Libraries,存在大量的资源占用冗余。形成资源浪费。
Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,他可以协调访问服务器上的所有的物理设备和虚拟机,也叫虚拟机监视器。Hypervisor是所有虚拟化技术的核心。当服务器启动并执行Hypervisor时,他会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。常见的产品有Vmware、KVM、Xen等。
2. 容器
Docker 容器运行在 Docker 引擎之上,所有 Docker 容器共享同一个 Docker 引擎,但它们的运行又是相互隔离、互不干扰的。由于 Docker 容器不需要进行虚拟硬件及操作系统,而是共享的宿主机的硬件与操作系统,所以 Docker 容器对系统资源的占用很少,其仅包含运行时必须的一些资源。所有 Docker 容器对于系统资源的使用都是由 Docker 引擎统一进行管理,所以对系统资源的利用率很高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。
Docker 系统架构
Docker中具有几个非常重要的概念,下面通过理解这些概念来了解Docker的系统架构。
-
Docker client : Docker 命令行工具,是用户使用Docker的主要方式,Docker client与Docker daemon通信并将结果返回给用户,Docker client也可以通过socket或者RESTful api访问远程的Docker daemon。
-
Docker Daemon : Docker 守护进程,其监听着 Docker API 请求并管理 Docker对象,例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。
-
Docker image: 镜像是只读的,镜像中包含有需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker Hub/Registry上下载。
-
Docker container: 容器是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
-
Docker Registry: Docker 的镜像中心中存放着很多由官方、其他机构或个人创建的 Docker 仓库,Docker用户可以直接从这些仓库中 pull 需要的镜像,也可以将自己制作的镜像 push 到 Docker 镜像中心相应的仓库中。最常用的镜像中心是Docker官方的Docker Hub(https://hub.docker.com)。