Docker&Kubernetes&Cloud

docker常用命令原理图概览:

按照docker官网上的说法,docker的文件系统分为两层:bootfs和rootfs
[图片上传失败...(image-924c21-1525939075600)]


image

bootfs包含了bootloader和linux内核。用户是不能对这层作任何修改的。在内核启动之后,bootfs实际上会unmount掉。

rootfs则包含了一般系统上的常见目录结构,类似于/dev, /proc, /bin等等以及一些基本的文件和命令。
上图中,aufs (advanced multi layered unification filesystem),是一种可堆叠的文件系统。
对于linux上不同版本的问题,docker可以同时运行多个rootfs.

image

Docker是一个用于开发,发布和运行应用程序的开放平台。Docker被设计用于更快的交付你的应用。使用Dokcer,你可以将你的应用从基础设施中分离出来,并且向对待一个管理应用程序一样对待你的基础设施。Docker帮助你更快的发布代码,更快的测试,更快的部署和缩短编写代码和运行代码的周期。
Docker通过组合带有工作流和工具的内核容器化特征来实现,这些工具能够帮助你管理和部署你的应用。

在她的内核,Docker提供了一个方式,该方式能够在一个容器中安全分离的运行任何程序。这种分离和安全性允许你同时在你的主机上运行任何容器。容器的轻量化特征,不带额外的虚拟机加载来运行,意味着你可以获取尽可能多的硬件。

围绕着容器的是工具和一个平台,他们可以以下面几个方式帮助你:

  • 将你的应用(和支持的组件)带入到Docker容器中。
  • 分发和发布这些容器到你的团队中用于后期开发和测试。
  • 部署这些应用到你的产品uanjing中,无论他是在一个本地数据中心还是在云上。

我可以使用Docker干啥?

1、更快的发布你的应用

Docker在帮助缩短开发生命周期方面做的很完美。Docker允许你的应用在本地容器中开发,该容器包含你的应用和服务程序。然后他会集成一个连续的集合体和部署工作流。

举个例子,你的开发者本地编写代码并且和他们的同事使用Docker共享他们的开发栈。当他们完成之后,他们推送他们的代码和栈进入到一个测试环境中,运行任何必须的测试。从测试环境中,你可以推送Docker镜像到产品中,并部署你的代码。

2、更简单的部署和扩展

Docker的基于容器的平台允许高度可移植的工作负载。Docker容器可以运行在一个开发者本地主机上,在一个数据中心的物理或虚拟机上,或者是在云上。

Docker的可移植性和轻量性特征也使得动态管理工作负载更加容易。你可以使用Docker更快的扩展和卸载应用和服务。Docker的速度意味着扩展可以更加接近真实的时间。

3、实现更高的密度和运行更多的工作负载

Docker是轻量的和快速的。相比较基于管理程序的虚拟机,他提供一个切实可行的,性价比高的选择。这在高密度环境中是及其有用的:例如,构件你自己的云或PAAS。但是他用于小中型的部署,你想要获取更多的资源,也是很有用的。

啥是主要的Docker组件?

Docker有两个主要组件:

  • Docker引擎:开源的容器化平台。
  • Docker Hub:我们的用于分享和管理Docker容器的SAAS平台。

啥是Docker的架构?

Docker使用一个客户端服务器架构。Docker客户端和Docker守护进程交流,Docker守护进程做非常重要的工作,构建,运行和分发你的Docker容器。Docker客户端和守护进程可以运行在同样的系统上,或者是你可以连接一个Docker客户端到一个远程Docker守护进程中。Docker客户端和守护进程通过sockets或通过RESTful API进行沟通交流。

这里写图片描述

Docker守护进程

正如上面的图片显示,Docker守护进程运行在一个主机机器中。用户不直接和守护进程交互,而是通过Docker客户端。

Docker客户端

Docker客户端,以docker二进制的形式出现,是Docker最基本的用户接口。他接收来自用户的命令,然后和Docker守护进程来回沟通。

Docker内部

为了能够理解Docker的内部,你需要去理解下面三个资源:

  • Docker镜像
  • Docker注册处
  • Docker容器
Docker镜像

一个Docker镜像是一个只读的模板。例如,一个镜像可以包含一个带有Apache和你的web应用的Ubuntu操作系统。镜像被用来创建Docker容器。Docker提供了一个简单的方式来构建一个新的镜像或更新一个存在的镜像,或者是你可以下载其他人已经创建的Docker镜像。Docker镜像是Docker的build组件。

Docker注册处

Docker注册处保留镜像。这些是来自于上传或下载镜像的公共或私密存储的地方。公共的Docker注册处又Docker Hub提供。他提供了一个你可以使用的已存镜像的集合。这些可以是你自己创建的或其他人创建的你可以使用的镜像。Docker注册处是Docker的distribution组件。

Docker容器。

Docker容器和目录是相似的。一个Docker容器可以保存任何东西,这些东西是运行一个应用程序所必须的。每一个容器都是从一个Docker镜像中创建的。Docker容器可以被运行,开启,停止,移动和删除。每一个容器都是一个分离的和安全的应用平台。Docker容器是Docker的运行组件。

Docker镜像如何工作?

我们已经知道Docker镜像是一个只读的模板,在镜像中Docker容器被创建。每一个容器包含一系列层。Docker使用union文件系统来组合这些层到一个单一的镜像中。Union文件系统允许分离文件系统的文件和目录作为分支,被透明化的覆盖,构成一个单一的一致的文件系统。

Docker非常轻量化的一个原因就是因为这些层。当你改变了一个Docker镜像的时候–例如,更新一个应用程序到一个新版本–一个新的层被构建。因此,不是替换整个镜像或整体重新构建。就像你可能在一个虚拟机上工作,仅仅那一层被添加或更新。现在你不必发布一个整体的新的镜像,仅仅更新便可。这使得发布Docker镜像更快更简单。

每一个镜像都从一个基础镜像开始,例如,ubuntu,一个基本的Ubuntu镜像,或者是fedora,一个基本的Fedora镜像。你也可以使用你自己的镜像作为新镜像的基础镜像,例如,如果你有一个基本的Apache镜像,你可以使用这个作为你的Web应用镜像的基本镜像。

Docker镜像从这些基本镜像中使用一个简单的,可描述的步骤,我们称作指令,被构件。每一个指令在我们的镜像中创建一个新层。指令包含的行为类似于:

  • 运行一个命令
  • 添加一个文件或目录
  • 创建一个环境变量
  • 当从这个镜像中创建了一个容器的时候哪一个进程运行

这些指令被存储在被称为Dockerfile的文件中。一个Dockerfile是一个基于包含构件镜像的指令和命令脚本的文本文件。当你需要构件一个镜像,执行指令返回一个最终镜像的时候,Docker读取这个Dockerfile

Docker注册处如何工作?

Docker注册处是你的Docker镜像的保存处。一旦你构建了一个Docker镜像,你可以将他推送到一个公共的注册处例如Docker Hub或者是到你自己的注册处。

使用Docker客户端,你可以搜索已经发布的镜像和下载到你的Docker主机中来从他们中构建容器。

Docker Hub既提供公共的也提供私人的镜像存储。公共存储可以被任何人搜索和下载。私人存储仅仅你和你的用户可以下载使用。

容器如何工作?

一个容器包含一个操作系统,用户文件和元数据。正如我们看到的,每一个容器都是从镜像中被构建的。那个镜像告诉Docker容器保存什么数据,当容器发布的时候运行什么进程,还有其他一些配置数据。Docker镜像是只读的。当Docker从一个镜像中运行一个容器的时候,他在镜像的最顶层添加一个读写层(使用union文件系统),在该层中你的应用程序可以运行。

当你运行一个容器的时候发生了啥?

无论是使用docker二进制还是API,Docker客户端告诉Docker守护程序来运行一个容器。

$ docker run -i -t ubuntu /bin/bash

Docker引擎客户端使用带有run选项的docker二进制运行一个新的容器。Docker客户端需要告诉Docker守护进程运行容器的最低限度是:

  • 容器从哪一个Docker镜像中构建的,例如,ubuntu
  • 当他被发布的时候,内部容器想要运行的命令,例如,/bin/bash

所以,当我们运行这个命令的时候钩子下面发生了什么?

按照次序,Docker引擎做:

  • 推出ubuntu镜像:Docker引擎检查当前的ubuntu镜像。如果镜像已经存在,Docker引擎使用他作为新的容器。如果在当前主机上不存在,然后Docker引擎从Docker Hub中拉取下来。
  • 创建一个新的容器:一旦Docker引擎有镜像,他便使用它来创建一个容器。
  • 分配文件系统,挂载一个读写层:容器在文件系统中被创建,并且一个读写层被添加到镜像中。
  • 分配一个网络/桥接口。创建一个网络接口来允许Docker容器与本地主机交流。
  • 设置一个IP地址。从一个池中寻找和绑定一个可用的IP地址。
  • 执行一个你指定的进程。运行应用。
  • 捕获和获取应用输出:连接和记录标准输入,输出和错误,来告诉你你的应用是如何工作的。

现在你就拥有一个运行的容器了。现在你可以管理你的容器,与你的应用交互,当结束的时候,可以停止和移除你的容器。

底层的技术

Docker是使用Go编写的,使用多个内核特征来分发其功能。

命名空间

Docker充分使用称为namespace的技术来提供分离的工作空间,我们称为容器。当你运行一个容器,Docker为这个容器创造一些列命名空间。

这个提供了一层分离:容器的每一个方面运行在他自己的明明空间中,并且不能访问其命名空间之外的数据。

Docker引擎在Linux中使用的命名空间有:

  • pid命名空间:进程分离
  • net命名空间:管理网络接口
  • ipc命名空间:管理IPC资源访问
  • mnt命名空间:管理挂载点
  • uts命名空间:分离内核和版本识别

控制组

在Linux上的Docker引擎也会使用其他的技术称为cgroups或控制组。在分离体中运行程序的关键就是只让他们使用你想要的资源。这能保证容器在主机中是一个优秀的多租户居民。控制组允许Docker引擎共享可用硬件资源,如果必要,设置限制和约束。例如,为特定容器限制可用内存。

Union文件系统

Union文件系统或者是UnionFS,是一个文件系统,其通过创建层来操作,使得他们更加轻量化和快速。Docker引擎使用union文件系统来为容器提供构件块。Docker引擎可以使用多个union文件系统变量,包括AUFS,btrfs,vfs和DeviceMapper。

容器格式

Docker引擎组合这些组件到一个包中,我们称为一个容器格式。默认的容器格式被称为libcontainer。在将来,Docker可能支持其他容器格式,例如,通过集成BSD Jails或Solaris Zones。

Docker的文件系统是分层的,它的rootfs在mount之后会转为只读模式。 Docker在它上面添加一个新的文件系统,来达成它的只读。

事实上,从下图中,我们能看到多个只读的文件系统,Docker中把他们称为 层。

image是只读的,container部分则是可写的。

如果用户想要修改底层只读层上的文件,这个文件就会被先拷贝到上层,修改后驻留在上层,并屏蔽原有的下层文件。

image

最后一部分是容器(container), 容器是可读写的。

在系统启动时,Docker会首先一层一层的加载image,直到最先面的base image。而这些image都是只读的。

最后,在最上层添加可读写的一个容器, 这里存放着诸如unique id,网络配置之类的信息。

既然是可读写的,就会有状态。容器共有两种状态:running 和 exited.

用户也可以用docker commit 命令将一个容器压制为image,供后续使用。

image

</article>

个人分类: Docker

image

(一)image layer(镜像层)

镜像可以看成是由多个镜像层叠加起来的一个文件系统,镜像层也可以简单理解为一个基本的镜像,而每个镜像层之间通过指针的形式进行叠加。

image

根据上图,镜像层的主要组成部分包括镜像层id,镜像层指针【指向父层】,元数据【layer metadata】包含了docker构建和运行的信息还有父层的层次信息。

只读层和读写层【top layer】的组成部分基本一致。同时读写层可以转换成只读层【docker commit操作实现】

(二)image(镜像)---【只读层的集合】

1、镜像是一堆只读层的统一视角,除了最底层没有指向外,每一层都指向它的父层,统一文件系统(union file system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。而每一层都是不可写的,就是只读层。

image

(三)container(容器)---【一层读写层+多层只读层】

1、容器和镜像的区别在于容器的最上面一层是读写层Dockerlayer】,而这边并没有区分容器是否在运行。运行状态的容器【running container】即一个可读写的文件系统【静态容器】+隔离的进程空间和其中的进程。

image

隔离的进程空间中的进程可以对该读写层进行增删改,其运行状态容器的进程操作都作用在该读写层上。每个容器只能有一个进程隔离空间。

image

(四)docker常用命令说明

1、标识说明

1)image---(统一只读文件系统)

image

2)静态容器【未运行的容器】---(统一可读写文件系统)

image

3)动态容器【running container】---(进程空间(包括进程)+统一可读写文件系统)

image

2、命令说明

a)docker生命周期相关命令:

1)docker create <image-id>
image

即为只读文件系统添加一层可读写层【top layer】,生成可读写文件系统,该命令状态下容器为静态容器,并没有运行。

2)docker start(restart) <container-id> 【docker stop即为docker start的逆过程】
image

即为可读写文件系统添加一个进程空间【包括进程】,生成动态容器【running container】

3)docker run <image-id>
image

docker run=docker create+docker start

类似流程如下 :

image
4)docker stop <container-id>
image

向运行的容器中发一个SIGTERM的信号,然后停止所有的进程。即为docker start的逆过程。

5)docker kill <container-id>
image

docker kill向容器发送不友好的SIGKILL的信号,相当于快速强制关闭容器,与docker stop的区别在于docker stop是正常关闭,先发SIGTERM信号,清理进程,再发SIGKILL信号退出。

6)docker pause <container-id> 【docker unpause为逆过程】---比较少使用
image

暂停容器中的所有进程,使用cgroup的freezer顺序暂停容器里的所有进程,docker unpause为逆过程即恢复所有进程。比较少使用。

7)docker commit <container-id>
image
image

把容器的可读写层转化成只读层,即从容器状态【可读写文件系统】变为镜像状态【只读文件系统】,可理解为【固化】。

8)docker build
image
image

docker build=docker run【运行容器】+【进程修改数据】+docker commit【固化数据】,不断循环直至生成所需镜像。

循环一次便会形成新的层(镜像)【原镜像层+已固化的可读写层】

docker build 一般作用在dockerfile文件上。

b)docker查询类命令:【查询对象:①image,②container,③image/container中的数据,④系统信息[容器数,镜像数及其他]】

1.1)docker images
image

docker images 列出当前镜像【以顶层镜像id来表示整个完整镜像】,每个顶层镜像下面隐藏多个镜像层。

1.2)docker images -a
image

docker images -a列出所有镜像层【排序以每个顶层镜像id为首后接该镜像下的所有镜像层】,依次列出每个镜像的所有镜像层。

1.3)docker history <image-id>
image

docker history 列出该镜像id下的所有历史镜像。

2.1)docker ps
image

列出所有运行的容器【running container】

2.2)docker ps -a
image

列出所有容器,包括静态容器【未运行的容器】和动态容器【running container】

3.1)docker inspect <container-id> or <image-id>
image

提取出容器或镜像最顶层的元数据。

3.2)docker info

显示 Docker 系统信息,包括镜像和容器数。

c)docker操作类命令:

1)docker rm <container-id>
image

docker rm会移除镜像,该命令只能对静态容器【非运行状态】进行操作。

通过docker rm -f <container-id>的-f (force)参数可以强制删除运行状态的容器【running container】。

2)docker rmi <image-id>
image
3)docker exec <running-container-id>
image

docker exec会在运行状态的容器中执行一个新的进程。

4)docker export <container-id>
image

docker export命令创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容。

image.png
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容