一 知道容器

Docker核心概念总结
Docker 是世界领先的软件容器渠道,所以想要搞懂 Docker 的概念咱们必须先从容器开始说起。

# 1.1 什么是容器?

# 先来看看容器较为官方的解说

一句话归纳容器:容器便是将软件打包成标准化单元,以用于开发、交付和布置。

  • 容器镜像是轻量的、可履行的独立软件包 ,包括软件运转所需的一切内容:代码、运转时环境、体系工具、体系库和设置。
  • 容器化软件适用于根据 Linux 和 Windows 的运用,在任何环境中都能够始终如一地运转。
  • 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,然后有助于削减团队间在相同根底设施上运转不同软件时的冲突。

# 再来看看容器较为通俗的解说

假如需求通俗地描绘容器的话,我觉得容器便是一个寄存东西的当地,就像书包能够装各种文具、衣柜能够放各种衣服、鞋架能够放各种鞋子相同。咱们现在所说的容器寄存的东西可能更偏向于运用比方网站、程序乃至是体系环境。

Docker核心概念总结

知道容器

# 1.2 图解物理机,虚拟机与容器

关于虚拟机与容器的对比在后面会详细介绍到,这儿仅仅经过网上的图片加深咱们关于物理机、虚拟机与容器这三者的了解(下面的图片来源于网络)。

物理机:

Docker核心概念总结
物理机

虚拟机:

Docker核心概念总结

虚拟机

容器:

Docker核心概念总结

经过上面这三张笼统图,咱们能够大概经过类比归纳出:容器虚拟化的是操作体系而不是硬件,容器之间是同享同一套操作体系资源的。虚拟机技能是虚拟出一套硬件后,在其上运转一个完好操作体系。因而容器的阻隔等级会稍低一些。


信任经过上面的解说咱们关于容器这个既生疏又熟悉的概念有了一个初步的知道,下面咱们就来谈谈 Docker 的一些概念。

# 二 再来谈谈 Docker 的一些概念

# 2.1 什么是 Docker?

说实话关于 Docker 是什么并太好说,下面我经过四点向你说明 Docker 到底是个什么东西。

  • Docker 是世界领先的软件容器渠道。
  • Docker 运用 Google 公司推出的 Go 言语 进行开发完成,根据 Linux 内核 供给的 CGroup 功用和 namespace 来完成的,以及 AUFS 类的 UnionFS 等技能,对进程进行封装阻隔,属于操作体系层面的虚拟化技能。 由于阻隔的进程独立于宿主和其它的阻隔的进程,因而也称其为容器。
  • Docker 能够自动履行重复性任务,例如搭建和装备开发环境,然后解放了开发人员以便他们专注在真实重要的事情上:构建出色的软件。
  • 用户能够方便地创建和运用容器,把自己的运用放入容器。容器还能够进行版别办理、复制、分享、修改,就像办理普通的代码相同。

# 2.2 Docker 思想

  • 集装箱
  • 标准化: ① 运送方法 ② 存储方法 ③ API 接口
  • 阻隔

# 2.3 Docker 容器的特色

  • 轻量 : 在一台机器上运转的多个 Docker 容器能够同享这台机器的操作体系内核;它们能够迅速发动,只需占用很少的核算和内存资源。镜像是经过文件体系层进行结构的,并同享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
  • 标准 : Docker 容器根据开放式标准,能够在一切主流 Linux 版别、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何根底设施上运转。
  • 安全 : Docker 赋予运用的阻隔性不仅限于彼此阻隔,还独立于底层的根底设施。Docker 默许供给最强的阻隔,因而运用出现问题,也仅仅单个容器的问题,而不会波及到整台机器。

# 2.4 为什么要用 Docker ?

  • Docker 的镜像供给了除内核外完好的运转时环境,保证了运用运转环境共同性,然后不会再出现 “这段代码在我机器上没问题啊” 这类问题;——共同的运转环境
  • 能够做到秒级、乃至毫秒级的发动时间。大大的节约了开发、测验、布置的时间。——更快速的发动时间
  • 避免共用的服务器,资源会简略遭到其他用户的影响。——阻隔性
  • 善于处理会集迸发的服务器运用压力;——弹性弹性,快速扩展
  • 能够很简略的将在一个渠道上运转的运用,迁移到另一个渠道上,而不必担心运转环境的改动导致运用无法正常运转的情况。——迁移方便
  • 运用 Docker 能够经过定制运用镜像来完成继续集成、继续交付、布置。——继续交付和布置

# 三 容器 VS 虚拟机

每当说起容器,咱们不得不将其与虚拟机做一个比较。就我而言,关于两者无所谓谁会替代谁,而是两者能够和谐共存。

简略来说:容器和虚拟机具有相似的资源阻隔和分配优势,但功用有所不同,由于容器虚拟化的是操作体系,而不是硬件,因而容器更简略移植,功率也更高。

# 3.1 两者对比图

传统虚拟机技能是虚拟出一套硬件后,在其上运转一个完好操作体系,在该体系上再运转所需运用进程;而容器内的运用进程直接运转于宿主的内核,容器内没有自己的内核,并且也没有进行硬件虚拟。因而容器要比传统虚拟机更为简便。

Docker核心概念总结

# 3.2 容器与虚拟机总结

Docker核心概念总结

  • 容器是一个运用层笼统,用于将代码和依靠资源打包在一起。 多个容器能够在同一台机器上运转,同享操作体系内核,但各自作为独立的进程在用户空间中运转 。与虚拟机比较, 容器占用的空间较少(容器镜像大小一般只要几十兆),瞬间就能完成发动
  • 虚拟机 (VM) 是一个物理硬件层笼统,用于将一台服务器变成多台服务器。 办理程序允许多个 VM 在一台机器上运转。每个 VM 都包括一整套操作体系、一个或多个运用、必要的二进制文件和库资源,因而 占用很多空间 。并且 VM 发动也十分缓慢

经过 Docker 官网,咱们知道了这么多 Docker 的优势,可是咱们也没有必要完全否定虚拟机技能,由于两者有不同的运用场景。虚拟机更擅长于完全阻隔整个运转环境。例如,云服务供给商一般采用虚拟机技能阻隔不同的用户。而 Docker 一般用于阻隔不同的运用 ,例如前端,后端以及数据库。

# 3.3 容器与虚拟机两者是能够共存的

就我而言,关于两者无所谓谁会替代谁,而是两者能够和谐共存。

Docker核心概念总结


# 四 Docker 基本概念

Docker 中有非常重要的三个基本概念,了解了这三个概念,就了解了 Docker 的整个生命周期。

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

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

Docker核心概念总结
docker基本概念

# 4.1 镜像(Image):一个特别的文件体系

操作体系分为内核和用户空间。关于 Linux 而言,内核发动后,会挂载 root 文件体系为其供给用户空间支撑。而 Docker 镜像(Image),就适当于是一个 root 文件体系。

Docker 镜像是一个特别的文件体系,除了供给容器运转时所需的程序、库、资源、装备等文件外,还包括了一些为运转时准备的一些装备参数(如匿名卷、环境变量、用户等)。 镜像不包括任何动态数据,其内容在构建之后也不会被改动。

Docker 设计时,就充分运用 Union FS 的技能,将其设计为分层存储的架构 。镜像实践是由多层文件体系联合组成。

镜像构建时,会一层层构建,前一层是后一层的根底。每一层构建完就不会再产生改动,后一层上的任何改动只产生在自己这一层。 比方,删去前一层文件的操作,实践不是真的删去前一层的文件,而是仅在当时层标记为该文件已删去。在终究容器运转的时分,尽管不会看到这个文件,可是实践上该文件会一直跟从镜像。因而,在构建镜像的时分,需求额外当心,每一层尽量只包括该层需求增加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为简略。乃至能够用之前构建好的镜像作为根底层,然后进一步增加新的层,以定制自己所需的内容,构建新的镜像。

# 4.2 容器(Container):镜像运转时的实体

镜像(Image)和容器(Container)的联系,就像是面向对象程序设计中的 类 和 实例 相同,镜像是静态的界说,容器是镜像运转时的实体。容器能够被创建、发动、停止、删去、暂停等

容器的实质是进程,但与直接在宿主履行的进程不同,容器进程运转于属于自己的独立的 命名空间。前面讲过镜像运用的是分层存储,容器也是如此。

容器存储层的生计周期和容器相同,容器消亡时,容器存储层也随之消亡。因而,任何保存于容器存储层的信息都会随容器删去而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状况化。一切的文件写入操作,都应该运用数据卷(Volume)、或许绑定宿主目录,在这些方位的读写会跳过容器存储层,直接对宿主(或网络存储)产生读写,其功用和稳定性更高。数据卷的生计周期独立于容器,容器消亡,数据卷不会消亡。因而, 运用数据卷后,容器能够随意删去、重新 run ,数据却不会丢失。

# 4.3 库房(Repository):会集寄存镜像文件的当地

镜像构建完成后,能够很简略的在当时宿主上运转,可是, 假如需求在其它服务器上运用这个镜像,咱们就需求一个会集的存储、分发镜像的服务,Docker Registry 便是这样的服务。

一个 Docker Registry 中能够包括多个库房(Repository);每个库房能够包括多个标签(Tag);每个标签对应一个镜像。所以说:镜像库房是 Docker 用来会集寄存镜像文件的当地类似于咱们之前常用的代码库房。

一般,一个库房会包括同一个软件不同版别的镜像,而标签就常用于对应该软件的各个版别 。咱们能够经过<库房名>:<标签>的格式来指定详细是这个软件哪个版别的镜像。假如不给出标签,将以 latest 作为默许标签.。

这儿弥补一下 Docker Registry 揭露服务和私有 Docker Registry 的概念:

Docker Registry 揭露服务 是开放给用户运用、允许用户办理镜像的 Registry 服务。一般这类揭露服务允许用户免费上传、下载揭露的镜像,并可能供给收费服务供用户办理私有镜像。

最常运用的 Registry 揭露服务是官方的 Docker Hub ,这也是默许的 Registry,并具有很多的高质量的官方镜像,网址为:hub.docker.com/open in new… 。官方是这样介绍 Docker Hub 的:

Docker Hub 是 Docker 官方供给的一项服务,用于与您的团队查找和同享容器镜像。

比方咱们想要查找自己想要的镜像:

Docker核心概念总结

运用Docker Hub 查找镜像

在 Docker Hub 的查找成果中,有几项关键的信息有助于咱们选择合适的镜像:

  • OFFICIAL Image:代表镜像为 Docker 官方供给和保护,相对来说稳定性和安全性较高。
  • Stars:和点赞差不多的意思,类似 GitHub 的 Star。
  • Downloads:代表镜像被拉取的次数,基本上能够表明镜像被运用的频度。

当然,除了直接经过 Docker Hub 网站查找镜像这种方法外,咱们还能够经过 docker search 这个指令查找 Docker Hub 中的镜像,查找的成果是共同的。

➜  ~ docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   8763                [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3073                [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   650                                     [OK]

在国内拜访Docker Hub 可能会比较慢国内也有一些云服务商供给类似于 Docker Hub 的揭露服务。比方 时速云镜像库open in new window、网易云镜像服务open in new window、DaoCloud 镜像商场open in new window、阿里云镜像库open in new window等。

除了运用揭露服务外,用户还能够在 本地搭建私有 Docker Registry 。Docker 官方供给了 Docker Registry 镜像,能够直接运用做为私有 Registry 服务。开源的 Docker Registry 镜像只供给了 Docker Registry API 的服务端完成,足以支撑 docker 指令,不影响运用。但不包括图形界面,以及镜像保护、用户办理、拜访操控等高级功用。


# 五 常见指令

# 5.1 基本指令

docker version # 检查docker版别
docker images # 检查一切已下载镜像,等价于:docker image ls 指令
docker container ls # 检查一切容器
docker ps #检查正在运转的容器
docker image prune # 清理暂时的、没有被运用的镜像文件。-a, --all: 删去一切没有用的镜像,而不仅仅是暂时文件;

# 5.2 拉取镜像

docker search mysql # 检查mysql相关镜像
docker pull mysql:5.7 # 拉取mysql镜像
docker image ls # 检查一切已下载镜像

# 5.3 删去镜像

比方咱们要删去咱们下载的 mysql 镜像。

经过 docker rmi [image] (等价于docker image rm [image])删去镜像之前首先要保证这个镜像没有被容器引证(能够经过标签称号或许镜像 ID 删去)。经过咱们前面讲的docker ps指令即可检查。

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
c4cd691d9f80        mysql:5.7           "docker-entrypoint.s…"   7 weeks ago         Up 12 days          0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

能够看到 mysql 正在被 id 为 c4cd691d9f80 的容器引证,咱们需求首先经过 docker stop c4cd691d9f80 或许 docker stop mysql暂停这个容器。

然后检查 mysql 镜像的 id

➜  ~ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
mysql                   5.7                 f6509bac4980        3 months ago        373MB

经过 IMAGE ID 或许 REPOSITORY 名字即可删去

docker rmi f6509bac4980 #  或许 docker rmi mysql

# 六 Build Ship and Run

Docker 的概念以及常见指令基本上现已讲完,咱们再来谈谈:Build, Ship, and Run。

假如你查找 Docker 官网,会发现如下的字样: “Docker – Build, Ship, and Run Any App, Anywhere” 。那么 Build, Ship, and Run 到底是在干什么呢?

Docker核心概念总结

  • Build(构建镜像) :镜像就像是集装箱包括文件以及运转环境等等资源。
  • Ship(运送镜像) :主机和库房间运送,这儿的库房就像是超级码头相同。
  • Run (运转镜像) :运转的镜像便是一个容器,容器便是运转程序的当地。

Docker 运转过程也便是去库房把镜像拉到本地,然后用一条指令把镜像运转起来变成容器。所以,咱们也常常将 Docker 称为码头工人或码头装卸工,这和 Docker 的中文翻译搬运工人千篇一律。

# 七 简略了解一下 Docker 底层原理

# 7.1 虚拟化技能

首先,Docker 容器虚拟化技能为根底的软件,那么什么是虚拟化技能呢?

简略点来说,虚拟化技能能够这样界说:

虚拟化技能是一种资源办理技能,是将核算机的各种[实体资源](zh.wikipedia.org/wiki/資源_(計算… “实体资源”))(CPUopen in new window、内存open in new window、磁盘空间open in new window、网络适配器open in new window等),予以笼统、转化后呈现出来并可供切割、组合为一个或多个电脑装备环境。由此,打破实体结构间的不可切割的妨碍,运用户能够比原本的装备更好的方法来运用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方法,地域或物理装备所约束。一般所指的虚拟化资源包括核算才能和数据存储。

# 7.2 Docker 根据 LXC 虚拟容器技能

Docker 技能是根据 LXC(Linux container- Linux 容器)虚拟容器技能的。

LXC,其称号来自 Linux 软件容器(Linux Containers)的缩写,一种操作体系层虚拟化(Operating system–level virtualization)技能,为 Linux 内核容器功用的一个用户空间接口。它将运用软件体系打包成一个软件容器(Container),内含运用软件本身的代码,以及所需求的操作体系中心和库。经过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出运用程序的独立沙箱运转环境,使得 Linux 用户能够简略的创建和办理体系或运用容器。

LXC 技能主要是凭借 Linux 内核中供给的 CGroup 功用和 namespace 来完成的,经过 LXC 能够为软件供给一个独立的操作体系运转环境。

cgroup 和 namespace 介绍:

  • namespace 是 Linux 内核用来阻隔内核资源的方法。 经过 namespace 能够让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。详细的完成方法是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对大局体系资源的一种封装阻隔,使得处于不同 namespace 的进程具有独立的大局体系资源,改动一个 namespace 中的体系资源只会影响当时 namespace 里的进程,对其他 namespace 中的进程没有影响。

    (以上关于 namespace 介绍内容来自www.cnblogs.com/sparkdev/p/… ,更多关于 namespace 的呢内容能够检查这篇文章 )。

  • CGroup 是 Control Groups 的缩写,是 Linux 内核供给的一种能够约束、记录、阻隔进程组 (process groups) 所运用的物力资源 (如 cpu memory i/o 等等) 的机制。

    (以上关于 CGroup 介绍内容来自 www.ibm.com/developerwo… ,更多关于 CGroup 的内容能够检查这篇文章 )。

cgroup 和 namespace 两者对比:

两者都是将进程进行分组,可是两者的作用仍是有本质区别。namespace 是为了阻隔进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和约束。

# 八 总结

本文主要把 Docker 中的一些常见概念做了详细的阐述,可是并不涉及 Docker 的装置、镜像的运用、容器的操作等内容。这部分东西,期望读者自己能够经过阅览书本与官方文档的形式把握。假如觉得官方文档阅览起来很费力的话,这儿引荐一本书本《Docker 技能入门与实战第二版》。

# 九 引荐阅览

  • 10 分钟看懂 Docker 和 K8Sopen in new window
  • 从零开始入门 K8s:详解 K8s 容器基本概念open in new window

# 十 参阅

  • Linux Namespace 和 Cgroupopen in new window
  • LXC vs Docker: Why Docker is Betteropen in new window
  • CGroup 介绍、运用实例及原理描绘open in new window