Docker 是什么?

Docker是一个开源的应用容器引擎,基于Go语言开发 并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何主流的 Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。更重要的是Docker性能开销极低。

Docker的优势:

  • Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题。——一致的运行环境
  • 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
  • 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
  • 善于处理集中爆发的服务器使用压力。——弹性伸缩,快速扩展
  • 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
  • 使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署

Docker 引擎

Docker 引擎是一个包含以下组件的客服端/服务端(CS)应用程序

  • 服务器:它是一个长时间运行程序的守护进程。(dockerd 命令)
  • REST API:它指定了程序可以用来与守护进程对话并指导它该做什么的接口。
  • 客服端:它是一个命令行接口(CLI)。(docker 命令)

CLI使用Docker REST API来控制或通过脚本或直接CLI命令与Docker守护进程交互。许多其他Docker应用程序使用底层API和CLI。

Docker 客服端与Docker 守护进程通信,Docker 守护进程负责构建、运行和分发Docker 容器。Docker 客服端和守护线程可以在同一个系统上运行,也可以将Docker客服端链接到远程Docker 守护进程。Docker 客服端和守护线程使用REST API 通过UNIX套接字或网络接口进行通信。

Docker 守护进程(daemon)

Docker 守护进程(dockerd) 监听Docker API 请求并管理Docker 对象,如:镜像、容器、网络和volumes。守护进程还可以与其他守护进程通信来管理Docker 服务。

Docker 客服端(Client)

Docker 客服端(docker)是Docker 用户与Docker 交互的主要方式。当你使用诸如这样的命令时(docker run),客服端发送这些命令给守护进程(dockerd)其执行,这个Docker 命令使用了Docker API 接口。Docker 客服端可以与多个守护进程进行通信。

Docker registries

Docker registries存储这Docker 镜像。Docker Hub 和 Docker Cloud 是任何人都可以使用的公共Docker registries,并且Docker 默认配置在Docker Hub上查找镜像。你甚至可以运行你自己的私人registries。如使用Docker Datacenter (DDC),它包括Docker Datacenter (DDC)。

Docker 对象(objects)

Docker 对象包括:镜像、容器、网络、volumes、插件和其他对象。

镜像和容器

镜像是轻量的、可执行的独立软件包,它包含应用程序运行所需的:代码、运行环境、系统库、环境变量和配置文件。通过运行镜像可以来启动容器。

容器是镜像运行时的实例。当镜像被执行时,镜像在内存中变成(一个有状态的镜像,或一个用户进程)容器。您可以通过docker ps 命令查看所有正在运行的容器列表

可以将容器和镜像的关系类似与面向对象编程中对象与类。

Docker 面向对象
容器 对象
镜像

容器和虚拟机

容器中运行原生 Linux和共享主机与其它容器的内核。它运行一个独立的进程,不占用任何其他可执行文件的内存,使其轻量化。

虚拟机运行一个完整的“客户”操作系统,通过虚拟机管理程序虚拟访问主机资源。一般来说,虚拟机提供的环境比大多数应用程序需要的资源更多。

简单来说,容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。

                                        

观察两者对比图,传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

容器与虚拟机总结:

  • 容器(Container)是一个应用层面抽象,用于将代码和依赖打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行。与虚拟机相比,容器占用空间少(容器镜像大小通常只有几十兆),瞬间就能完成启动。
  • 虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多太服务器。管理程序允许多个VM在一台机器上运行。每一个VM都包含一整套系统、一个或多个应用、必要的二进制文件和资源库,因此占用大量空间。而且VM启动也十分缓慢。
  • 容器和虚拟机并不存是谁取代谁,而是两者可以和谐共存。
特性 容器(Container) 虚拟机(VM)
启动 秒级别 分钟级别
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个 单机支持几十个

最新文章

  1. JdbcTemplate+PageImpl实现多表分页查询
  2. HTC vive开发:关于手柄按键
  3. Xamarin的不归路-安卓模拟器启动慢&没有虚拟键盘
  4. mysql乐观锁总结和实践--转
  5. @propetry参数
  6. Nagios监控Oralce
  7. 编程式事务、XML配置事务、注解实现事务
  8. style、currentStyle、getComputedStyle区别介绍
  9. VB.NET中vbcr 是回车、vbcrlf 是回车和换行的结合、vblf 是换行
  10. java集合(3)- Java中的equals和hashCode方法详解
  11. (转)CSS颜色及<a>标签超链接颜色改变
  12. 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和
  13. js封装成插件-------Canvas统计图插件编写
  14. e297: write error in swap file
  15. mysql 获取昨天数据 utc时间
  16. mysql中主外键关系
  17. spring mvc防止表单重复提交的代码片段
  18. altium designer 快捷键
  19. 16S 基础知识、分析工具和分析流程详解
  20. Mac OS 下安装 Vagrant

热门文章

  1. 前端自动化构建工具Grunt
  2. Android 隐式 Intent 跳转注意事项
  3. Network Request Failed
  4. 并发包java.util.concurrent.locks.Lock
  5. 最新一道面試題目,input: int[1,1,2,2,2,3,3,3],output [3,2,1],要求按照數字出現的次數從多到少排列元素。
  6. JSP实现用户登录样例
  7. 【mysql案例】mysql5.6.14配置my.cnf多实例,mysql_install_db初始化不读取my.cnf配置文件
  8. BZOJ3874:[AHOI2014&JSOI2014]宅男计划(爬山法)
  9. spring boot应用启动原理分析
  10. 【洛谷P2296】[NOIP2014]寻找道路