前言
前面我们通过3篇博客介绍了什么是容器、Docker隐喻和Docker简史,主要目的是了解Docker的前世今生和Docker所基于的虚拟化容器技术,这有助于我们真正理解Docker是什么。
什么是Docker?
docker的官网介绍
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production.
Docker 是一个用于开发、发布和运行应用程序的开源平台。 Docker 使您能够将应用程序与宿主机物理架构分离,以便您可以快速交付软件。使用 Docker,您可以像管理应用程序一样管理基础设施。通过使用Docker来快速交付、测试和部署代码,可以显著缩短代码编写到交付生产环境之间的时间。
容器的基本了解
容器规范
容器不光是 Docker,还有其他容器,比如 CoreOS 的 rkt。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含 Docker、CoreOS、Google在内的若干公司共同成立了一个叫 Open Container Initiative(OCI) 的组织,其目是制定开放的容器规范。
容器 runtime
runtime 是容器真正运行的地方。runtime 需要跟操作系统 kernel 紧密协作,为容器提供运行环境。
- lxc、runc 和 rkt 是目前主流的三种容器 runtime。
- lxc 是 Linux 上老牌的容器 runtime。Docker 最初也是用 lxc 作为 runtime。
- runc 是 Docker 自己开发的容器 runtime,符合 oci 规范,也是现在 Docker 的默认 runtime。
- rkt 是 CoreOS 开发的容器 runtime,符合 oci 规范,因而能够运行 Docker 的容器。
容器管理工具
光有 runtime 还不够,用户得有工具来管理容器。容器管理工具对内与 runtime 交互,对外为用户提供 interface,比如 CLI。这就好比除了 JVM,还得提供 java 命令让用户能够启停应用。
- lxd 是 lxc 对应的管理工具。
- runc 的管理工具是 docker engine。docker engine 包含后台 deamon 和 cli 两个部分。我们通常提到 Docker,一般就是指的 docker engine。
- rkt 的管理工具是 rkt cli。
容器定义工具
容器定义工具允许用户定义容器的内容和属性,这样容器就能够被保存,共享和重建。
- docker image 是 docker 容器的模板,runtime 依据 docker image 创建容器。
- dockerfile 是包含若干命令的文本文件,可以通过这些命令创建出 docker image。
- ACI (App Container Image) 与 docker image 类似,只不过它是由 CoreOS 开发的 rkt 容器的 image 格式。
容器 OS
由于有容器 runtime,几乎所有的 Linux、MAC OS 和 Windows 都可以运行容器。但这不并没有妨碍容器 OS 的问世。
容器 OS 是专门运行容器的操作系统。与常规 OS 相比,容器 OS 通常体积更小,启动更快。因为是为容器定制的 OS,通常它们运行容器的效率会更高。
目前已经存在不少容器 OS,CoreOS、atomic 和 ubuntu core 是其中的杰出代表。
Docker的架构和术语
Docker 使用client/server架构。Docker客户端与 Docker守护进程通信,后者负责构建、运行和分发 Docker 容器等一些列工作。Docker 客户端和守护程序可以在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护程序使用 REST API,通过 UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许使用由一组容器组成的应用程序。
Docker客户端(client)
Docker 客户端是用户与 Docker 交互的主要方式。当使用诸如docker run之类的命令时,客户端会将这些命令发送到dockerd执行它们,该docker命令最终会调用服务端的Docker API。Docker 客户端可以与多个守护进程通信。
Docker 守护程序(daemon)
Docker 守护程序 ( dockerd) 监听 Docker API 请求并管理Docker对象,例如镜像、容器、网络和卷等。守护进程还可以与其他守护进程通信以管理 Docker 服务。
Docker 注册表(registry)
Docker注册表存储 Docker镜像的服务。Docker Hub 是一个任何人都可以使用的公共注册表,并且 Docker 默认配置在 Docker Hub 上查找镜像。您甚至可以运行自己的私有注册表。
当使用docker pull 或者docker run命令时,将从配置的注册表中提取所需的镜像。当使用该docker push命令时,镜像会被推送到配置的注册表中。
可以将Docker Hub这样的注册表理解成是Git Hub,Git Hub上存储的是各种代码仓库(repository),并且提供代码的存储、查询。Docker Hub就存储的是各种镜像仓库(repository),提供镜像的存储和查询。
Docker 镜像仓库(repository)
Docker镜像仓库是拥有相同镜像名称但tag不同的镜像集合。就像Git Hub上一个代码库,保存的是一个服务的代码,代码发布可以被打上不同的tag。
DockerFile
dockerfile就是集装箱装箱操作手册,里面要装什么货物、要如何摆放都在这个手册里。
# syntax=docker/dockerfile:
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
要构建自己的镜像,需要使用简单的语法创建一个Dockerfile(装箱操作手册) ,用于定义创建和运行镜像所需的步骤。Dockerfile 中的每条指令都会在镜像中创建一个层。当更改 Dockerfile 并重建镜像时,仅重建那些已更改的层。与其他虚拟化技术相比,这是镜像更加轻量、小巧和快速的部分原因。
镜像(image)
镜像是一个只读模板,其中包含创建 Docker 容器的说明。通常,一个镜像基于另一个镜像,并带有一些自定义内容。我们可以创建自己的镜像,也可以只使用其他人创建并在注册表中发布的镜像。
容器(container)
Docker 容器是实时运行的 Docker 镜像实例。 Docker 镜像是只读文件,而容器是实时的瞬态可执行内容。 用户可以与它们进行交互,管理员可以使用 docker 命令调整其设置和条件。
Docker底层技术
Docker 是用Go 编程语言编写的,并利用 Linux 内核的几个特性来提供功能支持。Docker 使用一种称为命名空间namespaces的技术来提供隔离的工作空间,叫做容器。当运行容器时,Docker 会为该容器创建一组命名空间。
这些命名空间提供了一层隔离。容器的各种资源都在单独的命名空间中运行,并且它的访问权限仅限于该命名空间。
Namespaces(命名空间)
Docker使用名称空间来为容器提供隔离的工作空间。当一个容器运行时,Docker就会为该容器创建一系列的名称空间,并且名称空间提供一层隔离。当一个容器都运行在相对隔离的环境下,对其他名称空间是相对受限的。
Control groups(控制组)
基于Linux系统的Docker引擎也依赖另一项叫Control groups(cgroups,控制组)的技术。控制组可以对程序进行资源限定,并允许Docker引擎在容器间进行硬件资源共享以及随时进行限制和约束,例如:开发者可以限制某种特定容器 可用内存。
Union file systems (联合文件系统)
联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持将文件系统的修改作为一次提交来一层层地叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下。不同Docker容器可以共享一些基础的文件系统层,与自己独有的改动层一起使用,可以大大提高存储效率。Docker目前支持的联合文件系统包括AUFS, btrfs, devicemapper, overlayfs, vfs, zfs。
总结
本章主要对Docker的基础架构、术语和依赖的底层技术进行简单描述和解释,参照码头物流对Docker有一个整体认知,接下来我们将对Docker所依赖的底层技术进行验证,有助于我们后续深入学习Docker。
本文参考:
Docker Docs
什么是Docker?
Docker进步之路
docker registry与repository的区别
评论区