架构师开始给我分配这样一个任务的时候我还以为是嵌套在docker里面创建docker,其实不然,毕竟最后形成的架构,是要创建和启动的docker在一个层级被管理。
这里我们可以看到docker启动之后,会有一个dockerd的守护进程,一个containerd管理进程。注意dockerd进程绑定监听在了/var/run/docker.sock文件上,很明显,docker之间通讯使用的unix_local套接字。这里可以把dockerd看做是服务端,客户端可以是两种:
1.我们的docker命令工具,命令交互
2.docker remote api,https的协议交互
这两种客户端连接的目标其实就是/var/run/docker.sock,好的,思路解决就在这里。
第一步,我们创建docker的时候只需要-v /var/run/docker.sock:/var/run/docker.sock。我试过,如果直接挂载整个目录/var/run,那么创建的docker是起不来的,还有创建的docker --net没有限制,不管是host还是bridge都可以。
第二步,映射了docker.sock到docker后,在这个docker里面想要创建和启动新的docker,必须要有客户端来给宿主主机的dockerd服务端发送请求,这个时候我们只需要拷贝docker命令工具到docker里就可以了。
总结,其实就是之前docker命令工具客户端在宿主主机,dockerd服务端守护进程也在宿主主机。后来,我们知道它们是通过/var/run/docker.sock通信的,那么我们就给宿主主机和docker映射这个文件,保证它们的通信。然后把docker命令工具客户端给docker,那么就可以了。
在docker内部创建和启动新的docker
最新推荐文章于 2024-08-08 16:40:44 发布