Docker概述

Docker概述123

Docker的概念

Docker是一个开源平台,它包含容器引擎和Docker Hub注册服务器。

  • Docker容器引擎:该引擎可以让开发者打包它们的应用和依赖包到一个可移植的容器中,然后将其发布到任何流行的Linux机器上。
  • Docker Hub注册服务器:用户可以在该服务器上创建自己的镜像库来存储、管理和分享镜像。利用Docker,可实现软件的一次配置,处处运行。

Docker引擎可以将任何应用打包成一个轻量的、易移植的、隔离的容器。

通过标准的操作系统接口使得应用可以在各种运行环境下保持一致。

容器和虚拟机

Docker是容器的一种,容器是一种轻量级的虚拟技术,和容器对应的更为重量级的虚拟技术是虚拟机。

虚拟机是一种基于硬件的虚拟技术,它采用指令级的虚拟,完全虚拟一整套物理主机,包含CPU、内存、磁盘、网卡等设备,给用户呈现的就是一个物理主机的特性。用户可以在虚拟机里安装各种各样的操作系统,一切操作都看起来和真机一样。(第一类虚拟机管理程序,如Virtualbox和VMWare Workstation,它运行在操作系统之上。第一类虚拟机管理程序,如Xen,它直接运行在裸机上。

容器是一种基于操作系统的虚拟技术,它运行在操作系统之上的用户空间,所有的容器都共用一个系统内核,甚至是公共库,容器引擎提供进程级别的隔离,让每一个容器都想运行在单独的系统之上,但又能共享很多底层资源。比起虚拟机,容器更为轻量、快速、易于管理。

除了Docker,常见的容器还有Solaris Zone、BSD jails、OpenVZ和LXC等。
虚拟机与Docker容器的对比

更为详细的对比如下表:

虚拟机与容器对比表

Docker与容器

Docker早期是基于LXC(Linux Containers,LXC)4容器的,但是其具有很多LXC这类容器所没有的新特性。

  • 跨平台的可移植性。Docker定义了一种统一标准的打包格式,将应用及其依赖打包进单个镜像中,该镜像可以在任何Docker可运行的机器间便携传输,并且在不同机器上,Docker隔离了应用与平台的直接联系,对配置进行了抽象,使得在任何平台上应用的运行环境都一样。LXC的配置却不是可移植的,它依赖于某台具体的机器。
  • 面向应用。Docker是为优化应用部署而诞生的,LXC则是面向机器的,这是两者设计哲学上的不同。Docker面向应用的哲学体现在API、用户接口以及文档等各个方面,Docker都是为了更简单地做事。而LXC则是更关注于使用更少地CPU、更少地RAM,成为一个更轻量地机器。
  • 版本控制。Docker地版本控制和git工具非常类似,Docker可以跟踪一个容器地版本信息,查看版本差异,提交和回滚版本等。所有地版本信息都将被记录,这样可以清晰地看到一个应用服务器地更改历史。
  • 组建复用。Docker容器以组件式搭建,可以利用一个基础镜像构建更多的应用容器。
  • 共享性。Docker用于一个公共的注册服务器。开发者上传它们的镜像,我们可以通过这些共享的镜像来进一步定制自己的镜像。Docker的注册服务器本身也是一个开源项目,所以任何人都可以下载源码后在自己的网络中部署自己的注册服务器。
  • 工具生态系统。Docker提供了API以供自动化创建和部署容器,而越来越多的工具加入到Docker之中来扩展它的能力,Docker已经形成了自己的软件工具生态圈。

Docker的组件

Docker采用的是C/S架构,Docker客户端,即Docker可执行程序,可以通过命令行和API的形式与Docker守护程序进行通信,Docker守护程序提供Docker服务。
Docker的C/S架构

Docker包含三大核心组件——镜像、容器和库。

  • 镜像:是一个只读的静态模板。它保存着容器需要的环境和应用的执行代码,可以把镜像看作容器的代码,当代码运行起来后就成了容器。镜像采用分层机制,每一层镜像都是只读的,但是可以将写数据的层通过联合文件系统附加到原有的镜像上。
  • 容器:是一个运行时环境,它是一个镜像的运行状态,相对于静态的镜像而言。容器是镜像执行的动态表现,用户可以在容器中运行所想要的程序和服务,容器也不在乎你在什么样的环境下运行它。
  • :Docker采用注册服务器来存储和共享用户的镜像,库是某个特定用户存储镜像的目录。

Docker应用开发和部署

下图是通过Docker进行应用开发和部署的案例流程,首先,在开发主机上构建容器A,构建方法可以是手工构建,也可以通过Dockerfile自动构建。容器A的构建必须基于一个已有的基础镜像,并在它上面执行一系列操作。镜像A是容器的静态形式,容器是镜像的运行态。将容器A保存为镜像A,然后推送到Docker库中进行共享。这时候,另一端可以通过Docker库来获得镜像A,并将其拉取到本地,最后在产品集群中运行容器A,其中产品集群中一般会同时运行多个容器,这些容器互不影响,相互隔离。

使用Docker进行开发和部署的流程

Docker的特性

Docker是利用容器技术实现的一种轻量级的虚拟技术。

  • 隔离性:Docker采用libcontainer作为默认容器,取代了之前的LXC。libcontainer的隔离性主要是内核的命名空间来实现的,具体有pid、net、mnt和uts等命名空间,它们将容器的线程、网络、消息、文件系统和主机名进行隔离。
  • 可度量性:在Docker中,主要通过cgroups(控制组)来控制资源的度量和分配。
  • 移植性:Docker利用AUFS来实现对容器的快速更新。AUFS是一种支持将不同目录挂载到同一虚拟文件系统下的文件系统,支持对每个目录的读写权限管理。另外,AFUS具有层的概念,每一次修改都是在已有的只写层进行增量修改,修改内容将形成新的文件层,而不会影响原有的层。采用AUFS作为Docker容器的文件系统,具有如下好处
    • 节省存储空间:多个容器可以共享一个基础镜像存储
    • 快速部署
    • 升级方便
    • 增量修改
  • 安全性

Docker的安装

可以参照官方给出的文档

Docker的应用场景

  • 加速本地开发。
  • 自动打包和部署应用
  • 创建轻量、私有的PaaS环境
  • 自动化测试和持续集成/部署
  • 部署并扩展Web应用、数据库和后端服务器
  • 创建安全沙盒
  • 轻量级的桌面虚拟化

由于Docker并非使用虚拟化技术,容器必须与主机的内核一致——Windows Server的容器只能在Windows Server的主机上运行,64为Linux的容器只能在64位的Linux主机上运行。

微服务5是容器最主要的用例,也是容器兴起的最大推动力。

微服务是一种软件系统开发和构成形式,由小而独立的组件构成,这些组件通过网络互相连接沟通。这与传统的单一架构(monolith)软件开发模式相反,后者只有一个庞大的程序。当需要扩展一个单一架构的软件时,纵向扩展(scale up)往往是唯一选择,也就是说,需要把机器升级,增加内存和使用更强大的CPU,才能应付更多的负载。相反,微服务则设计成横向扩展(scale out),为了满足增长的需求,只需部署多台机器分摊负载即可。

容器云

容器云以容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员提供用于构建、发布和运行分布式应用的平台。当容器云专注于资源共享与隔离、容器编排与部署时,它更接近传统的IaaS;当容器云渗透到应用支撑与运行时环境时,它更接近传统的PaaS。

容器云并不仅仅限于Docker,基于rkt容器的CoreOS项目也是容器云。


  1. 曾金龙, 肖新华, 刘清. Docker开发实践[M]. 人民邮电出版社, 2015.
  2. Adrian Mouat. Docker开发指南[M]. 人民邮电出版社, 2017.
  3. 浙江大学. Docker 容器与容器云[M]. 人民邮电出版社, 2015.
  4. 2008年,Linux容器(Linux Containers,LXC)项目启动,它把CGroup、内核命名空间以及chroot等技术融合,提供了一套完整的容器方案。最后,Docker于2013年补充了当时容器化技术的不足,将容器技术带入主流
  5. SamNewman, 纽曼, 崔力强,等. 微服务设计[M]. 人民邮电出版社, 2016.
posted @ 2018-03-05 10:14  main_c  阅读(244)  评论(0编辑  收藏  举报