Docker命令行分析-cp-v1.12.3
Docker的copy命令可以在容器与物理机之间拷贝内容。本次分析将介绍copy命令是如何实现的。
client端
在Docker client端,copy命令由runCopy()执行。runCopy()定义在/api/client/container/cp.go中:
Docker的copy命令可以在容器与物理机之间拷贝内容。本次分析将介绍copy命令是如何实现的。
在Docker client端,copy命令由runCopy()执行。runCopy()定义在/api/client/container/cp.go中:
在Docker的save, cp等命令,都使用到了文件打包传输的功能。所以,这次分析将介绍这方面的一个demo,demo的功能如下:
从服务端拷贝:
Docker的run命令可以运行一个容器,支持的过程分为两步:Create和Start。
先来看下Docker client端的run实现,实现函数为runRun(),定义在/pkg/client/container/run.go中:
kubelet通过DockerManager与docker交互,即DockerManager对于kubelet来说就是一种runtime。本次分析将介绍dockerManager。
DockerManager定义在/pkg/kbuelet/dockertools/docker_manager.go中:
dockerManager负责在kubelet中与docker打交道。dockerManager会把pod的相关信息转换成具体的docker实现,并管理docker容器。在介绍dockerManager之前,先介绍dockerManager会用到的一些其他概念:containerGC, ExecHandler, imageStatsProvider及instrumentedDockerInterface,当然,这里介绍的概念的实现在kubelet中都是最底层的实现,都是基于docker runtime的。
proberManager用来检测Kubernetes集群中Pod的健康状态。目前Kubernetes支持livenessProber和readinessProber两种:
podManager在kubelet中负责内存中pod及mirrorPod的维护,任何在本节点上创建或删除操作都会同步更新podManager,即可以认为podManager中存储了本节点上运行的pod的信息。这里要对mirrorPod做下说明,在kubernetes中,如果是static pod,则由kubelet直接创建,这时系统很难管理这部分pod;所以系统会在kubelet中创建一个static pod对应的mirrorPod,来表示static pod。
podManager定义在/pkg/kubelet/pod/pod_manager.go中:
一个pod的status如下:
本次分析将介绍kubelet的volumeManager。volumeManager负责维护volume挂载与ETCD中数据的一致性。
actualStateOfWorld代表了目前物理主机上volume的挂载状态,定义在/pkg/kubelet/volumemanager/cache/actual_state_of_world.go中: