# Docker基础入门

#### 容器介绍

**Docker是什么**

Docker是基于Linux内核实现，最早是采用了 LXC技术，后来Docker自己研发了runc技术运行容器。

它基于Google Go语言实现，采用客户端/服务端架构，使用API来管理和创建容器。

**虚拟机 VS Docker**

<figure><img src="/files/JKNEoy5106OkQEr6WMWE" alt=""><figcaption></figcaption></figure>

**Namespace**

* &#x20;内核命名空间属于容器非常核心的一部分，能够将操作系统进行拆分，使一个系统看起来像多个互相独立的操作系统一样。
* &#x20;Docker容器是由各种命名空间组合而成的，本质就是命名空间
* &#x20;每个容器都由自己的PID、NET、MNT、IPC、UTS构成。

主要通过以下技术实现容器运行空间的相互隔离:

| 隔离类型           | 功能                         | 系统调用参数         | 内核版本   |
| -------------- | -------------------------- | -------------- | ------ |
| MNT Namespace  | 提供磁盘挂载点和文件系统的隔离能力          | CLONE\_NEWNS   | 2.4.19 |
| IPC Namespace  | 提供进程间通信的隔离能力,信号量、消息队列和共享内存 | CLONE\_NEWIPC  | 2.6.19 |
| UTS Namespace  | 提供主机名隔离能力                  | CLONE\_NEWUTS  | 2.6.19 |
| PID Namespace  | 提供进程隔离能力                   | CLONE\_NEWPID  | 2.6.24 |
| Net Namespace  | 提供网络隔离能力,包括网络设备,端口栈,端口等    | CLONE\_NEWNET  | 2.6.29 |
| User Namespace | 提供用户隔离能力                   | CLONE\_NEWUSER | 3.8    |

**安装Docker**

```bash
#Centos7安装
wget /etc/yum.repos.d/Centos-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/docker-ce.repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
yum -y install docker-ce
 
#Docker CE 镜像源站
https://developer.aliyun.com/article/110806
 
#查看进程关于Docker
ps aux|grep -E "containerd|docker"
```

**容器创建过程**

```bash
docker container run --name ctrl -it alpine:latest sh
```

<figure><img src="/files/UWAleCXPve80qlXffdNJ" alt=""><figcaption></figcaption></figure>

&#x20;

* &#x20;当执行如上命令时，Docker Client会将其转换为合适的API格式，并发送到的API端点。
* &#x20;daemon接收到创建容器的命令，会向containerd发出调用。
  * &#x20;虽然名字叫containerd但是它不负责创建新容器，而是指挥runc去做。
  * &#x20;containerd将Docker镜像转换为OCI bundle，并让runc基于此创建一个新的容器。
* &#x20;daemon使用一种CRUD风格的API，通过GRPC与containerd进行通信。
  * &#x20;(gRPC是google开发的一款高性能,开源和通用的RPC框架)
* &#x20;然后runc与操作系统内核接口进行通信，基于所必要的工具（Namespace、CGroup等）来创建容器。
  * &#x20;容器进程作为runc的子进程启动，启动完后runc将会退出。
* &#x20;shim是实现daemon的容器
  * &#x20;containerd指挥runc创建新容器，实际上创建容器时都会fork一个新的runc实例。
  * &#x20;一旦容器进程的父进程runc退出，相关联的containerd-shim就会成为容器的父进程。
  * &#x20;shim职责是保持所有STDIN和STDOUT流是开启状态，从而当daemon重启的时候，容器不会因为PIPE的关闭而终止，并且将容器退出状态反馈给daemon。

&#x20;

&#x20;

**Docker架构**

<figure><img src="/files/RfFJO8Cu8XMxrqSC7ccK" alt=""><figcaption></figcaption></figure>

* &#x20;Docker Client
  * &#x20;docker run命令实际调用了Docker API将命令发送到dockerd进而运行。
* &#x20;Docker daemon
  * &#x20;守护进程（dockerd）侦听Docker API发来的请求，作为服务端接受来自客户端的请求，主要功能包括镜像管理、镜像构建、REST API、身份验证、安全、核心网络以及编排。
  * &#x20;守护进程还可以与其他守护进程通信以及管理Docker服务。
* &#x20;Docker Registry（仓库）
  * &#x20;用于存储镜像，而Docker默认配置为在Docker Hub查找镜像
  * &#x20;Docker Hub是一个镜像仓库
  * &#x20;Harbor由vmware提供带Web界面自带认证功能的镜像私有仓库
* &#x20;Docker Objects
  * &#x20;Images（镜像）
* &#x20;运行容器前需要本地存在对应的镜像，如果不存在默认会从Docker Hub镜像仓库下载。
* &#x20;镜像是容器运行时的只读模板，每一个镜像由一系列的层（layers）组成，用文件系统FS来将这些层联合到单独的镜像中，允许独立文件系统中的文件和文件夹被透明覆盖，形成一个单独连贯的文件系统
  * &#x20;Containers
* &#x20;容器和文件夹类似，一个容器包含了所有的某个应用运行所需的环境
* &#x20;每一个容器都是从镜像创建的，不同的容器带有额外的可写层。
* &#x20;容器可以运行、开始、停止、移动和删除等操作。
* &#x20;runC
  * &#x20;runc是一个轻量级的针对Libcontainer进行了包装的命令行交互工具，取代了早期Docker架构中的LXC。
  * &#x20;runc只有一个作用，创建容器。


---

# 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://lzcloudsecurity.gitbook.io/yun-an-quan-gong-fang-ru-men/di-liu-zhang-yun-yuan-sheng-gong-fang/docker-ji-chu-ru-men.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.
