docker exec 是如何实现交互的
docker exec 命令的作用是进入到“容器内部”,并执行一些命令,那么它是如何实现把“容器内部”的 io 重定向到我们的终端(bash) 的呢? 基本原理 首先,要明白容器所依赖的内核 namespace 的概念,其实不存在“容器内部”,只要两个进程在相同的 namespace,那它们就相互可见,从用户的角度来说,也就是进入了容器內部。 nsenter nsenter 是一个命令行工具,它可以运行一个 binary,并且把它加入到指定的 namespace 中。 用法如下, nsenter -h nsenter -a -t <pid> <command> nsenter -m -u -i -n -p -t <pid> <command> 假设有一个 redis container 正在运行,通过 docker inspect --format {{.State.Pid}} 获取 pid, 假设为 2929。 然后运行 nsenter 命令: # nsenter -a -t 2929 ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND redis 1 0.0 0.0 52968 7744 ? Ssl May17 0:19 redis-server *:6379 root 93 0.0 0.0 7640 2748 ? R+ 05:47 0:00 ps aux 可以看到,ps 命令输出了 “容器內部” 的进程: redis 和 ps,符合我们的预期。 ...