Docker基本架构, 2022-10-25

(2022.10.25 Tues)
Docker采用了client-server架构,i.e., C/S architecture。Docker客户端(client)连接Docker后台进程(daemon),由后台进程执行 构建、运行分发容器等重任务。客户端与守护进程可在同一系统上运行,也可以分布在不同的主机上。客户端与守护进程通过 REST API通信(Docker engine API),构建与UNIX套接字(socket)或网络接口之上。Docker Compose是Docker客户端之一,可管理多个容器。

架构示意图

dockerarchitecture.png
  • Docker daemon:Docker守护进程(dockerd)监听Docker API中的请求,并管理Docker对象诸如镜像、容器、网络和volumes。不同的守护进程之间也可通信用于管理Docker服务。
  • Docker client:Docker客户端(docker)是用户与Docker交互的主要方式。用户在客户端使用docker run等命令时,客户端发送命令到dockerd,并由dockerd执行命令。docker命令使用Docker API。每个Docker客户端可与多个不同的守护进程通信。
  • Docker桌面:Docker桌面是不同操作系统上的应用,用户 可 通过该应用来构建和分享容器化应用和微服务。Docker桌面包括守护进程dockerd,客户端docker,Docker Compose,Docker Content Trust,Kubernetes和Credential Helper。通过命令ps -ef | grep dockerd来查看后台进程的信息。
  • Docker记录簿(registries):Docker registry存储Docker镜像。Docker Hub是每人可用的公开记录簿,且Docker被默认设置连接Docker Hub中的镜像。用户可建立private registry。当用户使用docker pulldocker run命令时,从设置的registry中拉取镜像。使用docker push命令,用户镜像将被推送到预先设置的registry。
  • Docker对象:使用Docker时,用户创建和使用镜像(images),容器(containers),网络,volumns,plugins和其他对象。这里介绍两种主要对象。
    • Images:镜像是只读模板(read-only template),包含了创建容器的指令。一个镜像通常基于另一个镜像,加入一些定制化。比如使用者基于ubuntu镜像建立新镜像,同时加入Apache web服务器和自己的应用,以及保证应用运行的配置信息。
      用户可以自己创建镜像,也可以从registry获得别人创建的镜像。使用Dockerfile创建自己的镜像,其中通过简单语法定义创建和执行镜像的命令,每个命令创建镜像中的一层(layer)。当使用者创建Dockerfile并重新构建镜像时,只有变化的层被重建。这种设置使得镜像相比其他虚拟化技术,构建过程轻量且快。
    • Containers:容器是镜像的一个可运行实例(instance)。通过Docker API或CLI来创建、启动、停止、转移、删除一个容器。容器可以连接一个或多个网络,外挂存储(attach storage to it),甚至可以基于当前状态创建新镜像。
      默认情况下,容器与其他容器和宿主机(host machine)良好隔绝(well isolated)。用户可控制容器与容器的网络、存储或其他底层子系统、宿主机的隔绝程度。
      容器由镜像和创建容器时的设置来共同定义。容器被移除时,为持久化的修改都将消失。

镜像与容器的关系,如同类与实例。

docker run命令运行案例

docker run -i -t ubuntu /bin/bash

该指令运行了一个ubuntu容器,并打开了其中的bash,可用于执行交互命令(interactively to local command-line session)。执行该命令,使用默认 registry设置,会执行如下判断:

  • 如果本地没有ubuntu镜像 ,Docker从配置的registry出pull镜像,如同使用者手动执行docker pull ubuntu
  • Docker创建新镜像,如果使用手动创建镜像命令docker container create
  • Docker为容器分配读写文件系统(read-write filesystem)作为最终层,允许一个运行的容器创建和修改文件和本地文件系统的路径(directory)。
  • Docker创建一个网络接口(network interface)用于将容器与默认网络相连,考虑到该命令中并未指定网络选项。其中包括将IP地址分配给容器。默认情况下,容器可通过宿主机的网络连接到外部网络。
  • Docker启动容器并执行/bin/bash。因选项中指定了交互模式和打开terminal,可在其中执行命令。
  • 在terminal中执行exit命令,容器停止,但并未被移除。使用者可再次使用 ,或移除(remove)。

底层技术

Docker使用Go语言实现,利用了Linux内核的诸多特性。DOcker使用了namespaces技术以提供隔离工作空间(isolated workspace),也就是容器。当用户运行容器,Docker为该容器创建了一系列namespaces

namespaces提供了隔离层(layer of isolation)。一个容器的 每个方面都运行一个独立的namespace,并且接入namespace受限(its access is limited to that namespace)。

Reference

1 docs 点 docker 点 com - Docker overview

你可能感兴趣的:(Docker基本架构, 2022-10-25)