1. 借助 k8s client-go 连接 API Server,并进行简单的 list 操作,创建 deployment
  2. 如何在 pod 内创建 container
  3. 如何让 container 加入到某个 Pod 中,并共享 namespace
  4. 如何让 pod 内部的 tty 操作结果显示在用户端

docker exec 和 直接 nsenter 还是不太一样的:

  • docker exec, OCI-O 的实现是启动一个 grpc server,重定向 IO,等于是把 container 的 IO stream 重定向到 用户 cli
  • nsenter 则是启动一个 进程,然后加入到 container 的 ns
  • 所以 前者不需要知道 container 的 pid,而后者需要知道,所以后者需要执行 docker insepect 命令。

观察上图,分析原理,不难发现,容器内部的进程关系已然不是树。然而,为什么总是强调“树状”关系呢?答案是:树状的继承关系,有利于容器管理。以上文《docker logs 实现剖析》中卖的关子「docker exec的标准输出不会作为容器日志」为例,Docker Daemon 创建容器主进程时,负责接管主进程的标准输出,从而保证容器主进程下所有进程的标准输出被接管,然而 Docker Daemon 在新创建 docker exec 所需执行的进程时,后者的标准输出并未与容器主进程作关联,也并未被 Docker Daemon 特殊处理,故 docker exec 所执行进程的标准输出不会进入容器的日志文件中。

虽然 docker exec 所执行的进程也是容器的一部分,但是更准确的理解 Docker 容器的日志,可以是这样子的:Docker 容器的日志只负责应用本身的标准输出,不包括 docker exec 衍生进程的标准输出。

/var/lib/docker/containers/ContainerID/ContainerID.json