我需要知道它是如何工作的以及它如何找到当前容器以及它默认查找容器的位置。
不要错误地理解这个问题。 我对docker ps命令非常熟悉。
需要这个,以便能够在运行时间内摄取其他容器,而守护进程没有注意到差异。
答案 0 :(得分:2)
TLDR; docker守护程序将容器列表保存在内存中
在docker ps
上,不需要文件系统访问
在docker create/run/start
上,容器列表可以从/var/lib/docker/aufs
中找到的图层派生(如果您使用的是aufs storage driver)
容器本身位于/var/lib/docker/containers/{id}
下
由于issue 15047的影响,在启动docker守护程序时会加载该路径。之后,这是在内存中管理的。
docker ps
要求api/client/ps.go#L59
中的容器:
containers, err := cli.client.ContainerList(options)
它询问api/client/lib/container_list.go#L45
resp, err := cli.get("/containers/json", query, nil)
这是在api/server/router/container/container.go#L34
local.NewGetRoute("/containers/json", r.getContainersJSON),
然后询问api/server/router/container/container_routes.go#L48
containers, err := s.backend.Containers(config)
api/server/router/container/backend.go#L58
Containers(config *daemon.ContainersConfig) ([]*types.Container, error)
由daemon/list.go#L83-L86
中的docker守护程序实现:
// Containers returns the list of containers to show given the user's filtering.
func (daemon *Daemon) Containers(config *ContainersConfig) ([]*types.Container, error) {
return daemon.reduceContainers(config, daemon.transformContainer)
}
守护程序包含容器列表:daemon/list.go#L37-L40
// List returns an array of all containers registered in the daemon.
func (daemon *Daemon) List() []*container.Container {
return daemon.containers.List()
}
来自contStore
:daemon/daemon.go#L123-L132
func (c *contStore) List() []*container.Container {
containers := new(History)
c.Lock()
for _, cont := range c.s {
containers.Add(cont)
}
c.Unlock()
containers.sort()
return *containers
}
type contStore struct {
s map[string]*container.Container
sync.Mutex
}