docker 官网 <https://docs.docker.com> docker 在线体验 http://labs.play-with-docker.com docker 官方案例 https://docs.docker.com/samples/ ![](https://img.kancloud.cn/8c/c5/8cc5a294a11d6b8166e52c7b24b69240_1037x1037.png) # Docker定义 > Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,[源代码](https://github.com/docker)托管在Github上,基于Go语言并遵从Apache2.0协议开源。 Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。 Docker将应用程序与该程序的依赖,打包在一个文件里面,用担心环境问题。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就像在物理机上运行一样。 # 虚拟机 > 虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在Windows系统里面运行Linux系统。应用程序对此毫无感知,因为虚拟机看上去跟真丝系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不要了就删掉,对其它部分毫无影响。 **虚拟机的缺点:** * 资源占用多:**虚拟机**会**独占**一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。 * 冗余步骤多:虚拟机是完整的操作系统。 * 启动慢:启动操作系统需要多久,启动虚拟机就需要多久。 # Linux容器 > 由于虚拟机存在以上缺点,Linux发展出了另一种虚拟化技术:Linux容器(Linux Containers,缩写为LXC)。 Linux容器不是模拟一个完整的操作系统,而是对**进程**进行隔离(Linux容器是一个由 Linux Namespace、Linux Cgroups 和rootfs 三种技术构建出来的进程的隔离环境)。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。 **Linux容器优势** * 启动快:容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。 * 资源占用少:容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所以资源。另外,多个**容器**可以**共享资源**,**虚拟机**都是**独享资源**。 * 体积小:容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。 # 容器与虚拟机对比 > 一个容器中运行原生Linux和共享主机与其它容器的内核,它运行一个独立的进程,不占用任何其它可执行文件的内存,使其轻量化。 相比之下,虚拟机(VM)运行一个完整的“客户”操作系统,通过虚拟机管理程序虚拟访问主机资源。一般来说,虚拟机提供的环境比大多数应用程序需要的资源多。 ![](https://github.com/taot168/pmdoc/blob/master/doc/image/docker/%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8E%E5%AE%B9%E5%99%A8%E5%AF%B9%E6%AF%94.png?raw=true) # Docker解决的问题 * 环境管理复杂:从各种OS到各个中间件再到各种App,一款产品能够成功发布,作为开发者需要关心的东西太多,且难于管理,这个问题在软件兴业中普遍存在并需要直接面对。Docker可以简化部署多种应用实例工作,比如Web应用、后台应用、数据库应用、大数据应用比如Hadoop集群、消息队列等等都可以打包成一个image部署。 * 云时代的到来:AWS的成功,引到开发者将应用转移到云上,解决来硬件管理的问题,然而软件配置和管理相关的问题依然存在。Docker的出现正好能帮助软件开发着开阔思路,尝试新的软件管理的方法解决这个问题。 * 虚拟化手段的变化:云时代采用标配硬件来降低成本,采用虚拟化手段来满足用户按需分配的资源需求以及保证可用性和隔离性。然而无论是KVM还是Xen,在Docker看来都是在浪费资源,又难于管理,更加轻量级大LXC更加灵活和快速: * LXC的便携性:LXC在Linux 2.6的Kernel里就已经存在了,但是其设计之初并非为云计算考虑,缺少标准化的描述手段和容器的可便携性,决定其构建出的环境难于分发和标准化管理(相对于KVM之类的image和sanpshot的概念)。Docker就在这个问题上作出了实质性的创新方法。 # Docker作用 Docker的用途: * 提供了一次性的环境:比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。 * 提供弹性的云服务:因为Docker容器可以随开随关,很适合动态扩缩容。 * 组建微服务架构:通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。