Docker 从入门到实践系列一 - 什么是Docker


img

虚拟机和容器

虚拟机和容器都属于虚拟化技术。

虚拟机是在一套硬件上,虚拟出一个完整的操作系统,在该系统上再运行所需的应用进程。

容器不是虚拟出一个完整的操作系统,而是对进程的隔离。

下面的图片比较了 Docker 和虚拟机的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而虚拟机则是在硬件层面实现。

虚拟机

Docker

虚拟机和容器的区别

特性虚拟机容器
量级重量级轻量级
性能接近原生弱于原生
操作系统每个VM都在自己的OS中运行所有容器共享主机操作系统
启动时间以分钟为单位以毫秒为单位
硬盘使用一般为 GB一般为 MB
占用资源占用更多的内存和CPU资源占用较少的内存和CPU资源
隔离性完全隔离,因此更安全进程级隔离,可能不太安全
系统支持量一般几十个支持上千个容器

什么是 Docker

Docker 是开源应用容器引擎,轻量级容器技术。Docker 诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

Docker 的优点

作为一种新兴的虚拟化技术,Docker 跟传统的虚拟机相比具有众多的优势。

  • 一致的运行环境:Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境的一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题。
  • 更快速的启动时间:可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
  • 隔离性:避免公用的服务器,资源会容易受到其他用户的影响。
  • 弹性伸缩,快速扩展:善于处理集中爆发的服务器使用压力。
  • 更轻松的迁移:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
  • 持续交付和部署:使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。

Docker 的应用场景

不同公司的应用场景不同,常见的应用场景有

  • Web 应用的自动化打包,自动化测试和持续集成、快速部署。
  • 弹性的云服务:因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
  • 提供一致性的环境:同步开发环境和生产环境等

其他的应用场景可以参考:8 个 Docker 真实应用场景

Docker 核心概念

Docker 包括三个基本概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

理解了这三个概念,就理解了 Docker 的整个生命周期。

Docker 三个关键动作:Build、Ship、 Run。

  • Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等资源
  • Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样
  • Run (运行镜像):正在运行的镜像就是一个容器,容器就是运行程序的地方

以上内容部分引自:《Docker 技术入门与实战》

docker 镜像(image)

  • 一个只读模板,可以用来创建容器,一个镜像可以创建多个容器
  • Docker 提供了一个很简单的机制来创建和更新现有的镜像,甚至可以直接从其他人那里获取做好的镜像直接使用

docker 容器(container)

  • 容器是从镜像创建的运行实例,也就是镜像启动后的一个实例称为容器,是独立运行的一个或一组应用。
  • docker 利用容器来运行应用,他可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。
  • 可以把容器看做是一个简易版的 Linux(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

docker 仓库(resoisitory)

仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。

当然,用户也可以在本地网络内创建一个私有仓库。

当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

底层原理

底层原理

docker 底层使用了一些 linux 内核的特性,大概有 namespacecgroupsufs

namespace

docker 使用 linux namespace 构建隔离的环境,它由以下 namespace 组成

  • pid:隔离进程
  • net:隔离网络
  • ipc:隔离 IPC
  • mnt:隔离文件系统挂载
  • uts:隔离hostname
  • user: 隔离uid/gid

control groups

也叫 cgroups,限制资源配额,比如某个容器只能使用 100M 内存

union file systems

UnionFS 是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加。docker 的镜像与容器就是分层存储,可用的存储引擎有 aufsoverlay 等。

docker 的镜像和容器都使用了 unionFS 做分层存储,镜像作为只读层是共享的,而容器在镜像之上附加了一层可写层,最大程度地减少了空间的浪费。

关于分层存储的详细内容可以查看官方文档 docker: About storage drivers

Docker 引擎

Docker 引擎是一个 Client-Server 应用程序,有以下主要组件:

  1. Server 是一个长期运行的程序,成为守护进程(Docker 命令)
  2. REST API,可以用来与守护进程进行通信并指示其操作的接口
  3. 命令行界面(CLI)客户端(Docker 命令)

在这里插入图片描述

命令行界面使用 API 通过脚本或直接在命令行界面通过命令与 Docker 守护进程交互。

Docker 架构

docker 的架构图如下

在这里插入图片描述

从图中可以看出几个组成部分

  • docker client:即 docker 命令行工具
  • docker host:宿主机,docker daemon 的运行环境服务器
  • docker daemondocker 的守护进程,docker client 通过命令行与 docker daemon 交互
  • container:最小型的一个操作系统环境,可以对各种服务以及应用容器化
  • image:镜像,可以理解为一个容器的模板配置,通过一个镜像可以启动多个容器
  • registry:镜像仓库,存储大量镜像,可以从镜像仓库拉取和推送镜像

Docker 为什么快

这里我们说下 Docker 为什么比 VMware 快。

  1. 首先 Docker 的抽象层比 VMware 虚拟机少。Docker 不需要 Hypervisor 实现硬件资源的虚拟化,Docker 需要的硬件都是实际物理机上的硬件资源。所以在磁盘占用、CPU、内存利用率上 Docker 有很大的优势。
  2. Docker 利用的是宿主机的内核,不需要 Guest OS。当新建一个容器时,Docker 不需要像虚拟机一样重新加载一个操作系统内核,这样就减少了加载操作系统内核这样的费时费资源过程。因 Docker 使用宿主机的操作系统,新建一个 Docker 容器只需几秒。

在这里插入图片描述

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页