Docker 概述

157 阅读4分钟

1. Docker 架构

Docker 使用 client-server 架构,Docker client 和 Docker daemon 进程通信,后者负责构建、运行和分发 Docker 容器的繁重工作。Docker client 和 Docker daemon 可以在同一系统上运行,或者你可以将 Docker client 连接到远程的Docker daemon。Docker client 和 Docker daemon 使用 REST API 、UNIX 套接字或网络接口通信。另一个 Docker client 是 Docker Compose ,它允许您使用一组容器组成的应用程序。

Docker 架构图

1.1. Dokcer Daemon

Docker 守护进程 ( dockerd) 监听 Docker API 请求并管理 Docker 对象,例如镜像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。

1.2. Docker client

Docker client(docker)是许多 Docker 用户与 Docker 交互的主要方式。当您使用诸如 docker run之类的命令时,客户端将这些命令发送给 dockerd,由 dockerd 执行这些命令。docker 命令使用 Docker API。Docker client 可以与多个守护进程通信。

1.3. Docker registries

Docker registry 用来存储 Docker 镜像。Docker Hub是一个任何人都可以使用的公共注册中心,Docker 默认从 Docker Hub 上查找镜像。您可以运行私有的注册中心。

当您使用 docker pulldocker run 命令时,将从配置的注册中心拉取所需的镜像。当您使用 docker push 命令时,您的镜像将被推送到已配置的注册中心中。

1.4. Docker objects

当您使用 Docker 时,您是在创建和使用镜像、容器、网络、卷、插件和其他对象。本节是对其中一些对象的简要概述。

1.4.1. 镜像

镜像是一个只读模板,包含创建 Docker 容器的说明。通常,一个镜像基于另一个镜像,并进行一些额外的定制。例如,您可以构建一个基于 ubuntu 镜像的镜像,但是安装 Apache web 服务器和您的应用程序,以及使您的应用程序运行所需的配置细节。

您可以创建自己的镜像,也可以只使用其他人创建的并发布在注册中心的镜像。要构建自己的镜像,需要使用简单的语法创建一个 Dockerfile,用于定义创建镜像和运行镜像所需的步骤。Dockerfile 中的每条指令都会在镜像中创建一个层。当您更改 Dockerfile 并重建镜像时,只会重建那些已更改的层。与其他虚拟化技术相比,这是使镜像如此轻巧、小型和快速的部分原因。

1.4.2. 容器

容器是镜像的可运行实例。您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。您可以将容器连接到一个或多个网络,为其附加存储,甚至根据其当前状态创建新的镜像。

默认情况下,容器与其他容器及其主机相对隔离。您可以控制容器的网络、存储或其他底层子系统与其他容器或主机之间的隔离程度。容器由其镜像以及您在创建或启动它时提供给它的任何配置选项定义。当容器被移除时,未存储在持久存储中的对其状态的任何更改都会消失。

docker run 命令示例

下面的命令运行一个 ubuntu 容器,交互式地连接到本地命令行会话,并运行 /bin/bash

 docker run -i -t ubuntu /bin/bash

运行此命令时,会发生以下情况(假设您使用的是默认注册中心配置):

  1. 如果你本地没有 ubuntu 镜像,Docker 会从你配置的注册中心中提取它,就像你手动运行了docker pull ubuntu 一样。
  2. Docker 会创建一个新容器,就像您运行了 docker container create 命令一样。
  3. Docker 为容器分配一个读写文件系统,作为它的最后一层。这允许正在运行的容器在其本地文件系统中创建或修改文件和目录。
  4. Docker 创建一个网络接口来将容器连接到默认网络,因为您没有指定任何网络选项。这包括为容器分配 IP 地址。默认情况下,容器可以使用主机的网络连接连接到外部网络。
  5. Docker 启动容器并执行 /bin/bash。由于容器以交互方式运行并附加到您的终端(由于-i-t 标志),所以您可以在输出记录到终端时使用键盘提供输入。
  6. 当您键入exit以终止/bin/bash命令时,容器会停止但不会被移除。您可以重新启动或删除它。

2. 底层技术

Docker 是用Go 语言编写的,并利用 Linux 内核的几个特性来提供其功能。Docker 使用namespaces技术为容器提供隔离的工作空间。当您运行一个容器时,Docker 会为该容器创建一组 namespaces

这些 namespaces 提供了一层隔离。容器的每个方面都在单独的命名空间中运行,并且其访问权限仅限于该命名空间。