# Docker 的运行机制

Docker是如何运行的。接下来，将从Docker的引擎与架构两个方面对Docker内部的运行与管理机制进行讲解。

* Docker的引擎
* Docker的架构

## Docker的引擎

Docker Engine（Docker引擎）是Docker的核心部分，使用的是客户端-服务器（C/S）架构模式，其主要组成部分如图所示：

![](/files/-LfnTKgkMXDmaJVtw73U)

可以看出，Docker Engine 中包含了三个核心组件（docker CLI，REST API和docker deemon），具体说明如下 ：

* **Docker CLI(command line interface）：**&#x8868;示Docker命令行接口 ，开发者可以在命令行中使用Docker相关执行与Docker守护进程进行交互，从而管理诸如image（镜像）、container（容器）、network（网络）和data volumes（数据卷）等实体。
* **REST API：**&#x8868;示应用程序API接口，开发者通过该API接口可以与Docker的守护进程进行交互，从而指示后台进行相关操作。
* **docker daemon：**&#x8868;示Docker的服务端组件，它是Docker架构中运行在后台的一个守护进程，可以接受并处理来自命令行接口（Docker CLI）及API接口（REST API）的指令，然后进行相应的后台操作。

对于开发者而言，既可以使用编写好的脚本文件通过REST API来实现与Docker进行交互，也可以直接使用Docker相关指令，通过命令行接口与Docker进行交互，而其他一些Docker应用则是通过底层API和CLI进行交互。

## Docker的架构

Docker使用C/S架构，通过Docker的具体架构，了解Docker的整个运行流程。接下来通过官方的架构图对Docker架构进行详细说明。

> Client 通过接口与Server进程通信实现容器的构建，运行和发布。client和server可以运行在同一台集群，也可以通过跨主机实现远程通信。

![](/files/-LfnTKgmKhK87Xw92fT4)

从图上可以看出，Docker架构主要包括Client、DOCKER\_HOST和Register三部分，这三部分的具体说明如下：

### **1.Client（客户端）**

Client即Docker客户端，也就是**Docker CLI（**&#x44;ocker命令行接&#x53E3;**）。**&#x5F00;发者通过和客户端使用Docker的相关指令与 Docker守护进程进行交互，从而进行Docker镜像的创建、拉取和运行等操作。

### **2.DOCKER\_HOST(Docker主机)**

DOCKER\_HOST即Docker内部引擎运行的主机，主要指Docker daemon(Docker守护进程)。可以通过守护进程与客户端还有Docker的镜像仓库（Registry）进行交互，从而管理Images（镜像）和Containers(容器)等。

### **3.Registry（注册中心）**

Registry即Docker注册中心，实质就是Docker的**镜像仓库，**&#x9ED8;认使用的是Docker官方远程注册中心Docker Hub，也可以使用开发者搭建的本地仓库。Registory中包含了大量的镜像，这些镜像可以是官方基础镜像，也可以是其他开发者上传的镜像 。

### **其他**

我们在实际使用Docker时，除了会涉及以上3个主要部分外，还会涉及很多Docker Objects（Docker 对象），例如：Image(镜像)、Containers（容器）、Networks（网络）、Volumes（数据卷）、Plugin（插件）等。其中常见的两个对象Image(镜像)和Containers（容器）。

**Image(镜像)**

Docker镜像就是一个只读模板，包括了一些创建Docker容器的操作指令。通常情况下，一个Docker镜像是基于另一个基础镜像创建的，并且新创建 镜像会额外包含一些功能配置。例如：开发者可以依赖一个Ubuntu的基础镜像创建一个新镜像，并可以在新镜像中安装Apache等软件或其他应用程序。

**Containers（容器）**

Docker容器属于镜像的一个可运行实例（镜像与容器的关系其实与 编程语言中的类与对象相似），开发者可以通过 API接口或者CLI命令接口来 创建、运行、停止、移动、删除一个容器，也可以将一个容器连接到一个或多个网络中，将数据存储与容器进行关联。

参考资料：

[几张图帮你理解 docker 基本原理及快速入门](https://www.cnblogs.com/SzeCheng/p/6822905.html)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docker.shujuwajue.com/docker-de-yun-xing-ji-zhi.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
