(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 pull
或docker 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)。用户可控制容器与容器的网络、存储或其他底层子系统、宿主机的隔绝程度。
容器由镜像和创建容器时的设置来共同定义。容器被移除时,为持久化的修改都将消失。
- Images:镜像是只读模板(read-only template),包含了创建容器的指令。一个镜像通常基于另一个镜像,加入一些定制化。比如使用者基于
镜像与容器的关系,如同类与实例。
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
网友评论