Docker基本原理与概念

2020-12-02  本文已影响0人  睡不醒的大橘

一. 容器与虚拟机的区别

二. Docker隔离性

命名空间
  1. 进程ID(pid)
  2. 网络(net)
  3. 文件系统/挂载(mnt)
  4. 进程间通信(IPC)
  5. 用户(user)
  6. UTS
Control group

三、Docker 镜像

镜像分层
镜像仓库

四、Docker 引擎

容器启动过程
  1. 当使用 Docker 命令行工具执行docker container run时,
    Docker 客户端会将其转换为合适的 API 格式,并发送到正确的 API 端点。

  2. 一旦 daemon 接收到创建新容器的命令,它就会向 containerd 发出调用。(Docker daemon 使用一种 CRUD 风格的 API,通过 gRPC 与 containerd 进行通信。)

  3. containerd 将 Docker 镜像转换为 OCI bundle,并让 runc 基于此创建一个新的容器。

  4. runc 与操作系统内核接口进行通信,基于所有必要的工具(Namespace、CGroup等)来创建容器。容器进程作为 runc 的子进程启动,启动完毕后,runc 将会退出。

模型的优势
  1. 保持所有 STDIN 和 STDOUT 流是开启状态,从而当 daemon 重启的时候,容器不会因为管道(pipe)的关闭而终止。
  2. 将容器的退出状态反馈给 daemon。

五、Docker网络

Docker 网络架构
CNM
  1. 沙盒是一个独立的网络栈。其中包括以太网接口、端口、路由表以及 DNS 配置。
  2. 终端就是虚拟网络接口。就像普通网络接口一样,终端主要职责是负责创建连接。在 CNM 中,终端负责将沙盒连接到网络。
  3. 网络是 802.1d 网桥(类似大家熟知的交换机)的软件实现。因此,网络就是需要交互的终端的集合,并且终端之间相互独立。

容器 A 只有一个接口(终端)并连接到了网络 A。容器 B 有两个接口(终端)并且分别接入了网络 A 和网络 B。容器 A 与 B 之间是可以相互通信的,因为都接入了网络 A。但是,如果没有三层路由器的支持,容器 B 的两个终端之间是不能进行通信的。

需要重点理解的是,终端与常见的网络适配器类似,这意味着终端只能接入某一个网络。因此,如果容器需要接入到多个网络,就需要多个终端。

虽然容器 A 和容器 B 运行在同一个主机上,但其网络堆栈在操作系统层面是互相独立的,这一点由沙盒机制保证。

Libnetwork
驱动

如果说 Libnetwork 实现了控制层和管理层功能,那么驱动就负责实现数据层。比如,网络连通性和隔离性是由驱动来处理的,驱动层实际创建网络对象也是如此,其关系如下图所示。


单机桥接网络
接入现有网络
覆盖网络

六、Docker Volume

  1. 块存储:相对性能更高,适用于对小块数据的随机访问负载。目前支持 Docker 卷插件的块存储例子包括 HPE 3PAR、Amazon EBS 以及 OpenStack 块存储服务(Cinder)。
  2. 文件存储:包括 NFS 和 SMB 协议的系统,同样在高性能场景下表现优异。支持 Docker 卷插件的文件存储系统包括 NetApp FAS、Azure 文件存储以及 Amazon EFS。
  3. 对象存储:适用于较大且长期存储的、很少变更的二进制数据存储。通常对象存储是根据内容寻址,并且性能较低。支持 Docker 卷驱动的例子包括 Amazon S3、Ceph 以及 Minio。
上一篇下一篇

猜你喜欢

热点阅读