Docker基本概念

Docker Engine

Docker Engine是一个client-server 应用程序,它主要包含以下几块:

一个长时间运行的server,这个server进程叫做docker 守护进程(dockerd命令)

一些用于与daemon交互或者指令API

一个命令行接口(CLI)客户端(docker命令)

通过脚本或者直接在CLI输入命令,用户可以和Docker 守护进程交互。

守护进程 创建和管理Docker 对象,比如镜像,容器,网络和硬盘卷等。

Docker Engine Components Flow

 

 

Docker architecture

Docker使用客户-服务结构。通过Docker 客户端,Docker 守护进程完成构建,运行和分发docker 容器。Docker客户端和守护进程可以运行在同一台电脑上,或者也可以用客户端连接一个远端的守护进程。Docker客户端和守护进程通过API函数交互。

Docker 守护进程

Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如镜像,容器,网络和卷。

守护程序还可以与其他守护程序通信以管理Docker服务。

 

Docker 客户端

Docker客户端(docker)用来和docker交互。使用诸如docker run之类的命令时,客户端会将这些命令发送到dockerd,然后执行它们。

docker命令使用Docker API。 Docker客户端可以与多个守护程序通信。

 

Docker registries

Docker registries存储Docker映像。 Docker Hub是任何人都可以使用的公共registies,并且Docker配置为默认在Docker Hub上查找映像。可以运行自己的私人registies。使用docker pull或docker run命令时,所需的映像将从配置的registies中提取。使用docker push命令时,会将映像推送到配置的registies。

 

Docker 对象

docker中有多种对象,比如镜像,容器,网络,硬盘卷,插件和其它对象。

镜像:一个特殊的文件系统

操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

镜像不包含任何动态数据,其内容在构建之后也不会被改变。

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

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。

比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。

在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。

因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。

一个镜像通常是在另一个镜像的基础上增加额外配置生成,比如:通过基础ubuntu镜像,安装额外的apache web 服务器,额外的安装都可以通过配置文件配置。

创建Dockerfile来构建自己的镜像,Dockerfile定义了创建和运行镜像的步骤,每一条指令会在镜像中构建一层。当dockerfile有改动并且重建镜像时,只有那些有改动的及其之后的层会重建

容器:镜像运行时的实体

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。

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

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。

所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run,数据却不会丢失。

例子:docker run命令

$ docker run -i -t ubuntu /bin/bash  命令会运行一个ubuntu 镜像,并且会依附在本地cmd会话窗口上,执行 /bin/bash

 

当运行这条命令时,以下事情会发生(假设使用了默认的registry 配置)

1、如果本地没有ubuntu镜像,Docker会从配置好的路径中拉出ubuntu镜像,就像手动执行docker pull ubuntu。

2、Docker创建一个新的容器,相当于手动执行了docker container create 命令

3、Docker 分配一个读-写文件系统给容器,这个文件系统允许运行的容器创建或者更改本地文件系统的文件或这目录

4、由于没有特别指定网络选项,Docker会创建网络接口,默认的网络来连接容器。这过程包括给容器分配IP地址。默认的,容器通过主机的网络可以连接到外部网路

5、Docker启动容器并且执行 /bin/bash。由于容器以交互模式运行,并且依附在你控制台会话(因为-I 和 -t 标记).可以输入容器中文件系统的命令,结果展示在本地控制台会话框内。

6、exit终止 /bin/bash命令,当然容器没有被移除,可以重新启动它或者删除。

 

仓库:集中存访镜像文件的地方

镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。

我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

这里补充一下 Docker Registry 公开服务和私有 Docker Registry 的概念:

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。

一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub ,这也是默认的 Registry,并拥有大量的高质量的官方镜像,网址为:hub.docker.com/ 。

在国内访问 Docker Hub 可能会比较慢,国内也有一些云服务商提供类似于 Docker Hub 的公开服务。

除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。

 

开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 Docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

 

潜在技术

命令空间

Docker使用命令空间技术使得container具有单独的工作空间。运行一个容器时,Docker为空改容器创建一系列命名空间。

这些命名空间提供单独的一层,容器的每一部分都运行在单独的命名空间中,并且访问范围仅在各自的命名空间中。

Docker Engine 在linux上使用以下命名空间:

1、pid 命名空间:进程独立(PID:进程ID)

2、net 命名空间:管理网络接口(NET : NetWorking)

3、ipc 命名空间:管理进程间资源访问(IPC:InterProcess Communication)

4、mnt 命名空间:管理文件系统挂载(MNT: mount)

5、uts 命名空间:独立的内核和版本验证(UTS:Unix TimeSharing System)

 

Control groups

Docker engine 在linux上实现了control groups(cgroups)技术,cgroup指定某个应用程序能得到的资源。Control group 允许Docker Engine控制容器使用的资源,比如限制内存使用等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值