Docker容器完整启动流程(容器底层原理)

Docker容器完整启动流程(容器底层原理)
一、用户输入docker run命令组件docker CLI客户端/上层工具1、解析用户输入的全部参数镜像名称、-p 端口、挂载卷等2、通过REST API把请求发送给本地的dockerd守护进程二、dockerdDocker守护进程接受请求1、接收 CLI 发来的创建容器请求2、处理上层资源逻辑检查本地镜像如果镜像不存在则执行docker pull拉取镜像3、创建网络、数据卷、端口映射规则iptables DNAT 规则4、完成所有上层资源准备工作5、通过 gRPC 协议调用底层containerd下发 启动容器 任务三、containerd容器引擎接收任务1、containerd 是 Docker 底层容器生命周期管理器2、收到 dockerd 请求后不会直接调用 runc3、为这一个容器单独启动一个独立进程containerd-shim-runc-v2containerd是符合 OCI 标准的容器管理器负责上层容器全生命周期管理--镜像管理拉取、存储、删除镜像--容器生命周期调度创建、启动、停止、删除容器--容器存储、网络管理四、containerd-shim-runc-v2垫片shim进程1、shim调用 runc 工具发起容器创建2、最重要价值解耦容器进程 和 containerd 守护进程如果没有 shim一旦 containerd 进程重启 / 崩溃所有容器都会被回收杀死有 shimcontainerd 重启shim 继续运行容器持续正常运行不受影响3、充当容器内进程的父进程4、持续收集容器退出状态、OOM 杀死事件、信号、标准输出日志回传给 containerd5、转发操作系统信号docker stop、docker kill下发给容器内部程序containerd 启动容器时创建 containerd-shim 进程shim 脱离 containerd 由 systemd 托管实现进程生命周期解耦containerd 重启时shim 与容器持续运行containerd 重启完成后扫描现存 shim 并重新建立通信连接恢复对容器的管理五、runcOCI 标准容器运行时1、runc是直接和 Linux 内核交互的工具真正负责创建容器环境2.、调用 Linux 内核系统调用Namespace实现 PID、网络、挂载、用户等资源隔离Cgroup限制容器最大 CPU、内存、磁盘 IO 资源你学习的内存限制、OOM 机制就在这里生效3、 挂载镜像文件系统rootfs组装容器运行环境4、启动容器内部第一个主进程容器 1 号进程六、Linux内核Namespace隔离容器让容器看不见宿主机、其他容器资源Cgroups资源配额限制触发内存上限时触发 OOM Killer七、最终状态runc退出containerd-shim-runc-v2持续运行持续托管容器内进程整个容器正式运行。问题重启 containerd 容器不死为什么重启 docker 服务容器会停止解答containerd 依靠 containerd-shim 进程解耦容器生命周期单独重启 containerd 不会终止容器 而systemctl restart docker会重启 dockerddockerd 默认关闭时主动通知 containerd 停止所有容器开启 live-restore 参数可以禁止 dockerd 停止容器。容器能否在 docker 重启后自动拉起由容器--restart重启策略控制