【深度知识】DOCKER入门,框架原理,镜像制作和资源列表

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第1张图片

1. 摘要

本文是辉哥Docker入门的一些摘要和资源分享,涉及DOCKER入门,框架原理,镜像制作和资源列表等内容。作为自己学习的备忘,也分享给有需要的同学了。

2. 内容

2.1 Docker的定义和优势

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第2张图片
【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第3张图片

Docker 的优势

Docker 相比于传统虚拟化方式具有更多的优势:

  • Docker 启动快速属于秒级别。
    虚拟机通常需要几分钟去启动。
  • Docker 需要的资源更少。
    Docker 在操作系统级别进行虚拟化,Docker 容器和内核交互,几乎没有性能损耗,性能优于通过 Hypervisor 层与内核层的虚拟化。
  • Docker 更轻量。
    Docker 的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker 运行的镜像数远多于虚拟机数量,对系统的利用率非常高。
  • 与虚拟机相比,Docker 隔离性更弱。
    Docker 属于进程之间的隔离,虚拟机可实现系统级别隔离。
  • 安全性。
    Docker 的安全性也更弱,Docker 的租户 Root 和宿主机 Root 等同,一旦容器内的用户从普通用户权限提升为 Root 权限,它就直接具备了宿主机的 Root 权限,进而可进行无限制的操作。
    虚拟机租户 Root 权限和宿主机的 Root 虚拟机权限是分离的,并且虚拟机利用如 Intel 的 VT-d 和 VT-x 的 ring-1 硬件隔离技术。
    这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受到攻击。
  • 可管理性。
    Docker 的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如 VMware vCenter 提供完备的虚拟机管理能力。
  • 高可用和可恢复性。
    Docker 对业务的高可用支持是通过快速重新部署实现的。
    虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制, VMware 可承诺虚拟机 99.999% 高可用,保证业务连续性。
  • 快速创建、删除。
    虚拟化创建是分钟级别的,Docker 容器创建是秒级别的,Docker 的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间
  • 交付、部署。
    虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化。Docker 在 Dockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署。

DOCKER vs 传统虚拟机总结:

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

2.2 Docker 入门教程

入门一个技术的最好方法就是把手弄湿,做一个最简的实践。
阮一峰的《Docker 入门教程》,Docker 微服务教程教学文档通俗易懂,跟着实操一把吧。

2.3 Docker的基本概念(Image/Container/Repository)

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第4张图片

从上图我们可以看到,Docker 中包括三个基本的概念:
Image(镜像)
Container(容器)
Repository(仓库)

镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是 Docker 的核心。

Image(镜像)

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

镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,下面的这张图能够帮助读者理解镜像的定义:

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第5张图片

从左边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其他层都会有一个指针指向下一层。这些层是 Docker 内部的实现细节,并且能够在主机的文件系统上访问到。

统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角。

这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。我们可以在图片的右边看到这个视角的形式。

Container(容器)

容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第6张图片

由于容器的定义并没有提及是否要运行容器,所以实际上,容器 = 镜像 + 读写层。

Repository(仓库)

Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行。

但是, 如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry(仓库注册服务器)就是这样的服务。

有时候会把仓库(Repository)和仓库注册服务器(Registry)混为一谈,并不严格区分。

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

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

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

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

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

仓库又可以分为两种形式:

  • Public(公有仓库)
  • Private(私有仓库)

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

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

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

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

2.4 Docker的架构和原理

Docker 使用的是 C/S 结构,即客户端/服务器体系结构, Docker 客户端和服务端可以运行在一台机器上,我们可以通过 RESTful 、Stock 或网络接口与远程 Docker 服务端进行通信。

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第7张图片

Docker 的核心组件包括:
Docker Client
Docker Daemon
Docker Image
Docker Registry
Docker Container

Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。

客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 Socket 或 REST API 与远程的服务器通信。

Docker Client

Docker Client ,也称 Docker 客户端。它其实就是 Docker 提供命令行界面(CLI)工具,是许多 Docker 用户与 Docker 进行交互的主要方式。

客户端可以构建,运行和停止应用程序,还可以远程与 Docker_Host 进行交互。

最常用的 Docker 客户端就是 Docker 命令,我们可以通过 Docker 命令很方便地在 Host 上构建和运行 Docker 容器。

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第8张图片

Docker Daemon

Docker Daemon 是服务器组件,以 Linux 后台服务的方式运行,是 Docker 最核心的后台进程,我们也把它称为守护进程。

它负责响应来自 Docker Client 的请求,然后将这些请求翻译成系统调用完成容器管理操作。

该进程会在后台启动一个 API Server ,负责接收由 Docker Client 发送的请求,接收到的请求将通过 Docker Daemon 内部的一个路由分发调度,由具体的函数来执行请求。

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第9张图片

我们大致可以将其分为以下三部分:

  • Docker Server
  • Engine
  • Job

Docker Daemon 的架构如下所示:

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第10张图片

Docker Daemon 可以认为是通过 Docker Server 模块接受 Docker Client 的请求,并在 Engine 中处理请求,然后根据请求类型,创建出指定的 Job 并运行。

Docker Daemon 运行在 Docker Host 上,负责创建、运行、监控容器,构建、存储镜像。

运行过程的作用有以下几种可能:

  • 向 Docker Registry 获取镜像。
  • 通过 GraphDriver 执行容器镜像的本地化操作。
  • 通过 NetworkDriver 执行容器网络环境的配置。
  • 通过 ExecDriver 执行容器内部运行的执行工作。

由于 Docker Daemon 和 Docker Client 的启动都是通过可执行文件 Docker 来完成的,因此两者的启动流程非常相似。

Docker 可执行文件运行时,运行代码通过不同的命令行 Flag 参数,区分两者,并最终运行两者各自相应的部分。

启动 Docker Daemon 时,一般可以使用以下命令来完成:

docker --daemon = truedocker –d
docker –d = true

再由 Docker 的 main() 函数来解析以上命令的相应 Flag 参数,并最终完成 Docker Daemon 的启动。

下图可以很直观地看到 Docker Daemon 的启动流程:

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第11张图片

默认配置下,Docker Daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听。

我们可以照着如下步骤进行配置:

1、编辑配置文件/etc/systemd/system/multi-user.target.wants/docker.service,在环境变量 ExecStart 后面添加 -H tcp://0.0.0.0,允许来自任意 IP 的客户端连接。

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第12张图片

2、重启 Docker Daemon:

systemctl daemon-reload
systemctl restart docker.service

3、我们通过以下命令即可实现与远程服务器通信:

docker -H 服务器IP地址 info

-H 是用来指定服务器主机,info 子命令用于查看 Docker 服务器的信息。

Docker Image

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

镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将 Docker 镜像看成只读模板,通过它可以创建 Docker 容器。

镜像有多种生成方法:

  • 从无到有开始创建镜像
  • 下载并使用别人创建好的现成的镜像
  • 在现有镜像上创建新的镜像

我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作 Dockerfile ,通过执行 docker build 命令可以构建出 Docker 镜像。

Docker Registry

Docker Registry 是存储 Docker Image 的仓库,它在 Docker 生态环境中的位置如下图所示:

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第13张图片

运行 docker push、docker pull、docker search 时,实际上是通过 Docker Daemon 与 Docker Registry 通信。

Docker Container

Docker 容器就是 Docker 镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。

Docker Container 提供了系统硬件环境,我们可以使用 Docker Images 这些制作好的系统盘,再加上我们所编写好的项目代码,Run 一下就可以提供服务啦。

Docker 组件是如何协作运行容器

看到这里,我相信各位读者朋友们应该已经对 Docker 基础架构熟悉的差不多了,我们还记得运行的第一个容器吗?

现在我们再通过 hello-world 这个例子来体会一下 Docker 各个组件是如何协作的。

容器启动过程如下:
Docker 客户端执行 docker run 命令。
Docker Daemon 发现本地没有 hello-world 镜像。
Daemon 从 Docker Hub 下载镜像。
下载完成,镜像 hello-world 被保存到本地。
Docker Daemon 启动容器。

具体过程可以看如下这幅演示图:

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第14张图片

我们可以通过 Docker Images 可以查看到 hello-world 已经下载到本地:

我们可以通过 Docker Ps 或者 Docker Container ls 显示正在运行的容器,我们可以看到,hello-world 在输出提示信息以后就会停止运行,容器自动终止,所以我们在查看的时候没有发现有容器在运行。

我们把 Docker 容器的工作流程剖析的十分清楚了,我们大体可以知道 Docker 组件协作运行容器可以分为以下几个过程:
Docker 客户端执行 docker run 命令。
Docker Daemon 发现本地没有我们需要的镜像。
Daemon 从 Docker Hub 下载镜像。
下载完成后,镜像被保存到本地。
Docker Daemon 启动容器。

2.5 Docker常用命令

我们可以通过 docker -h 去查看命令的详细的帮助文档。在这里我只会讲一些日常我们可能会用的比较多的一些命令。

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第15张图片

具体的命令详解参考《【知识分享】Docker 命令大全》。

2.6 Dockerfile和Image镜像制作

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

我们可以通过下面这幅图来直观地感受下 Docker 镜像、容器和 Dockerfile 三者之间的关系:

【深度知识】DOCKER入门,框架原理,镜像制作和资源列表_第16张图片

我们从上图中可以看到,Dockerfile 可以自定义镜像,通过 Docker 命令去运行镜像,从而达到启动容器的目的。Dockerfile 是由一行行命令语句组成,并且支持已 # 开头的注释行。

一般来说,我们可以将 Dockerfile 分为四个部分:

  • 基础镜像(父镜像)信息指令 FROM。
  • 维护者信息指令 MAINTAINER。
  • 镜像操作指令 RUN 、EVN 、ADD 和 WORKDIR 等。
  • 容器启动指令 CMD 、ENTRYPOINT 和 USER 等。

以定制 nginx 镜像为例,这次我们使用 Dockerfile 来定制。

在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:

$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile

其内容为:

FROM nginx
RUN echo '

Hello, Docker!

' > /usr/share/nginx/html/index.html

这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM 和 RUN。

Dockerfile 常用的指令

更多的指令解释参考《Dockerfile 指令详解》, 里面包含以下指令说明:

  • COPY 复制文件
  • ADD 更高级的复制文件
  • CMD 容器启动命令
  • ENTRYPOINT 入口点
  • ENV 设置环境变量
  • ARG 构建参数
  • VOLUME 定义匿名卷
  • EXPOSE 声明端口
  • WORKDIR 指定工作目录
  • USER 指定当前用户
  • HEALTHCHECK 健康检查
  • ONBUILD 为他人做嫁衣裳

3.参考

(1)Docker 入门教程-阮一峰
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
【点评】简单,易懂,包含实践操作,体验好。

(2)Docker 微服务教程-阮一峰
http://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html
【点评】一个docker微服务wordpress案例,使用docker,Docker Compose实践。

(2)Docker — 从入门到实践
https://yeasy.gitbooks.io/docker_practice/
【点评】全面,质量高,关于Dockerfile的讲的不错。还涉及Kubernetes,Docker Compose的介绍。

(3)这可能是最为详细的Docker入门总结
https://juejin.im/entry/5beacface51d4507a717765f
【点评】有很多框架图,适合了解原理。

(4)Docker从入门到实践-W3CSchool
https://www.w3cschool.cn/reqsgr/

(5)Docker 教程 | 菜鸟教程
https://www.runoob.com/docker/docker-tutorial.html

你可能感兴趣的:(【深度知识】DOCKER入门,框架原理,镜像制作和资源列表)