Docker 简介 入门 K8S [MD]
我的GitHub | 我的博客 | 我的微信 | 我的邮箱 |
---|---|---|---|
baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
目录
Docker 简介
- Docker 官方主页
- Docker 官方博客
- Docker 官方文档
- Docker Store
- Docker Cloud
- Docker Hub
- Docker 的源代码仓库
- Docker 发布版本历史
- Docker 常见问题
- Docker 远端应用 API
什么是容器
Docker 是世界领先的软件容器平台
,所以想要搞懂 Docker 的概念我们必须先从容器
开始说起。
官方的解释
一句话概括容器:容器就是将软件打包成标准化单元
,以用于开发、交付和部署。
- 容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
- 容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。
- 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
通俗的解释
容器就是一个存放东西的地方
,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样。我们现在所说的容器存放的东西可能更偏向于应用
,比如网站、程序甚至是系统环境。
Docker 的一些概念
什么是 Docker
- Docker 是世界领先的
软件容器平台
。 - Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于
Linux 内核
提供的CGroup
功能和name space
来实现的,以及 AUFS 类的UnionFS
等技术,对进程进行封装隔离
,属于操作系统层面的虚拟化技术
。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。 Docker 能够自动执行重复性任务
,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。- 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker 思想
- 集装箱
- 标准化: ① 运输方式 ② 存储方式 ③ API 接口
- 隔离
Docker 容器的特点
轻量
在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核
;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
标准
Docker 容器基于开放式标准,能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础设施上运行。
安全
Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。
为什么要用 Docker
- 一致的运行环境:Docker 的镜像提供了
除内核外完整的运行时环境
,确保了应用运行环境一致性,从而不会再出现 “这段代码在我机器上没问题啊” 这类问题 - 更快速的启动时间:可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间
- 隔离性:避免公用的服务器,资源会容易受到其他用户的影响
- 弹性伸缩,快速扩展:善于处理集中爆发的服务器使用压力
- 迁移方便:可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况
- 持续交付和部署:使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署
容器 VS 虚拟机
每当说起容器,我们不得不将其与虚拟机做一个比较。就我而言,对于两者无所谓谁会取代谁,而是两者可以和谐共存
。
简单来说: 容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件
,容器之间是共享同一套操作系统资源的
,因此容器更容易移植,效率也更高。
两者对比图
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统
,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核
,容器内没有自己的内核
,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便.
容器与虚拟机总结
- 容器是一个
应用层抽象
,用于将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核
,但各自作为独立的进程在用户空间中运行
。与虚拟机相比,容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动。 - 虚拟机 (VM) 是一个
物理硬件层抽象
,用于将一台服务器变成多台服务器
。管理程序允许多个 VM 在一台机器上运行。每个 VM 都包含一整套操作系统
、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且 VM 启动也十分缓慢。
通过 Docker 官网,我们知道了这么多 Docker 的优势,但是大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境
。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker 通常用于隔离不同的应用
,例如前端,后端以及数据库。
就我而言,对于两者无所谓谁会取代谁,而是两者可以和谐共存。
Build Ship and Run
如果你搜索 Docker 官网,会发现如下的字样:Docker - Build, Ship, and Run Any App, Anywhere
。那么 Build, Ship, and Run 到底是在干什么呢?
- Build 构建镜像: 镜像就像是集装箱包括文件以及运行环境等等资源
- Ship 运输镜像:主机和仓库间运输,这里的仓库就像是超级码头一样
- Run 运行镜像:运行的镜像就是一个容器,
容器就是运行程序的地方
Docker 运行过程也就是去仓库把镜像拉到本地
,然后用一条命令把镜像运行起来变成容器
。所以,我们也常常将 Docker 称为码头工人
或码头装卸工,这和 Docker 的中文翻译搬运工人
如出一辙。
Docker 底层原理
虚拟化技术
简单点来说,虚拟化技术可以这样定义:
虚拟化技术是一种资源管理技术,是将计算机的各种实体资源
,如CPU、内存、磁盘空间、网络适配器等,予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储
。
Docker 原理
Docker 技术是基于 LXC 虚拟容器技术的。
LXC,其名称来自 Linux 软件容器Linux Containers
的缩写,一种操作系统层虚拟化(Operating system–level virtualization)技术,为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易的创建和管理系统或应用容器。
LXC 技术主要是借助 Linux 内核中提供的 CGroup
功能和 name space
来实现的,通过 LXC 可以为软件提供一个独立的操作系统运行环境。
cgroup 和 namespace
namespace 是 Linux 内核用来隔离内核资源
的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源
,进程之间根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源
,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离
进程组(process groups) 所使用的物理资源(如 cpu memory i/o 等等) 的机制。
cgroup 和 namespace 两者对比:
两者都是将进程进行分组,但是两者的作用还是有本质区别。namespace 是为了隔离
进程组之间的资源,而 cgroup 是为了对一组进程进行统一的资源监控和限制
。
Docker 的三个基本概念
Docker 中有非常重要的三个基本概念,理解了这三个概念,就理解了 Docker 的整个生命周期。
- 镜像
Image
:一个特殊的文件系统 - 容器
Container
:镜像运行时的实体 - 仓库
Repository
:集中存放镜像文件的地方
理解了这三个概念,就理解了 Docker 的整个生命周期
镜像:一个特殊的文件系统
操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据
,其内容在构建之后也不会被改变。
Docker 设计时,就充分利用Union FS
的技术,将其设计为分层存储的架构
。镜像实际是由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变
,后一层上的任何改变只发生在自己这一层。
比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
容器:镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例
一样,镜像是静态的定义,容器是镜像运行时的实体
。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程
,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。前面讲过镜像使用的是分层存储,容器也是如此。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据
,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷
(Volume)、或者绑定宿主目录
,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。
仓库:集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务
,Docker Registry
就是这样的服务。
一个 Docker Registry 中可以包含多个仓库Repository
;每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库
。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签
就常用于对应该软件的各个版本。我们可以通过<仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签.。
这里补充一下 Docker Registry 公开服务和私有 Docker Registry 的概念:
Docker Registry 公开服务 是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的Docker Hub
,这也是默认的 Registry,并拥有大量的高质量的官方镜像。
在 Docker Hub 的搜索结果中,有几项关键的信息有助于我们选择合适的镜像:
- OFFICIAL Image :代表镜像为 Docker 官方提供和维护,相对来说稳定性和安全性较高。
- Stars :和点赞差不多的意思,类似 GitHub 的 Star。
- Dowloads :代表镜像被拉取的次数,基本上能够表示镜像被使用的频度。
当然,除了直接通过 Docker Hub 网站搜索镜像这种方式外,我们还可以通过 docker search
这个命令搜索 Docker Hub 中的镜像,搜索的结果是一致的。
在国内访问Docker Hub
可能会比较慢,国内也有一些云服务商提供类似于Docker Hub
的公开服务。
除了使用公开服务外,用户还可以在 本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
Docker 和 K8S
Docker
2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫dotCloud
的公司。
这家公司主要提供基于PaaS
的云计算技术服务。具体来说,是和LXC
有关的容器技术。
LXC,就是Linux容器虚拟技术Linux container
后来,dotCloud公司将自己的容器技术进行了简化和标准化,并命名为——Docker。
Docker技术诞生之后,并没有引起行业的关注。而dotCloud公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。
正当他们快要坚持不下去的时候,脑子里蹦出了"开源"的想法。
什么是"开源"?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。
有的软件是一开始就开源的。也有的软件,是混不下去,创造者又不想放弃,所以选择开源。自己养不活,就吃"百家饭"嘛。
2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes
正式决定,将Docker项目开源。
不开则已,一开惊人。
越来越多的IT工程师发现了Docker的优点,然后蜂拥而至,加入Docker开源社区。
Docker的人气迅速攀升,速度之快,令人瞠目结舌。
开源当月,Docker 0.1 版本发布。此后的每一个月,Docker都会发布一个版本。到2014年6月9日
,Docker 1.0 版本正式发布。
此时的Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像Google、微软、Amazon、VMware这样的巨头,都对它青睐有加,表示将全力支持。
Docker火了之后,dotCloud公司干脆把公司名字也改成了Docker Inc.
。
Docker和容器技术为什么会这么火爆?说白了,就是因为它"轻"。
在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表,是VMWare和OpenStack。
相信很多人都用过虚拟机。虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台"子电脑"出来。
在"子电脑"里,你可以和正常电脑一样运行程序,例如开QQ。如果你愿意,你可以变出好几个"子电脑",里面都开上QQ。"子电脑"和"子电脑"之间,是相互隔离的,互不影响。
虚拟机属于虚拟化技术。而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化。
虚拟机虽然可以隔离出很多"子电脑",但占用空间更大,启动更慢
,虚拟机软件可能还要花钱(例如VMWare)。
而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似"沙箱")。
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。
容器和虚拟机的对比
正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。
我们具体来看看Docker。
大家需要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎
。
想要搞懂Docker,其实看它的两句口号就行。
第一句,是Build, Ship and Run
。
也就是,搭建、发送、运行
,三板斧。
举个例子:
我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。
结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。
但是,跑来一个老巫婆,教会我一种魔法。
这种魔法,可以把我盖好的房子复制一份,做成镜像
,放在我的背包里。
等我到了另一片空地,就用这个"镜像",复制一套房子,摆在那边,拎包入住。
怎么样?是不是很神奇?
所以,Docker 的第二句口号就是:Build once,Run anywhere
。搭建一次,到处能用)。
Docker技术的三大核心概念,分别是:
- 镜像
Image
:例如为知笔记镜像 - 容器
Container
:Docker 是创建容器的工具,是应用容器引擎 - 仓库
Repository
:例如 Docker Hub
我刚才例子里面,那个放在包里的"镜像",就是Docker镜像。而我的背包,就是Docker仓库。我在空地上,用魔法造好的房子,就是一个Docker容器。
说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置。
每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!
也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。
这么一来,我们可以交换镜像,你用我的,我用你的,岂不是很爽?
于是乎,就变成了一个大的公共仓库
。
负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。
不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢?
所以,Docker Registry服务对镜像的管理是非常严格的。
最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。
K8S
好了,说完了Docker,我们再把目光转向K8S。
就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的
——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理
。
就在这个时候,K8S出现了。
K8S,就是基于容器的集群管理平台
,它的全称,是kubernetes
。
Kubernetes 这个单词来自于希腊语,含义是舵手或领航员。K8S是它的缩写,用"8"字替代了"ubernete"这8个字符。
和Docker不同,K8S的创造者,是众人皆知的行业巨头——Google。
然而,K8S并不是一件全新的发明。它的前身,是Google自己捣鼓了十多年的Borg系统。
K8S是2014年6月
由Google公司正式公布出来并宣布开源的。
同年7月,微软、Red Hat、IBM、Docker、CoreOS、 Mesosphere和Saltstack 等公司,相继加入K8S。
之后的一年内,VMware、HP、Intel等公司,也陆续加入。
2015年7月
,Google正式加入OpenStack
基金会。与此同时,Kuberentes v1.0正式发布。
目前,kubernetes的版本已经发展到V1.13。
2020-06-18
本文来自博客园,作者:白乾涛,转载请注明原文链接:https://www.cnblogs.com/baiqiantao/p/13159213.html