Linux命名空间一些笔记

容器通过 Linux Namespace 技术,对网络、PID、用户等等信息的隔离。

但是这种隔离并非物理隔离,只是一种逻辑上的隔离,如果你是root用户,Host上可以看到一切信息。

以PID Namespace来说,容器内进程的PID从1开始,但其在Host上的PID不仅可以看见,而且是另外一个值。

以用户 Namespace来说,容器内的用户UID和用户组GID,是可以和Host上的现有用户、用户组冲突的,比如容器内有个用户foo UID=1000,Host上有个用户 bar UID=1000,完全没有任何问题。

同时容器fs在Host的 /proc/<host pid>/root 目录下(参考这个),如果以 bar 用户 操作这个目录下需要foo 用户的文件/目录也是完全没有任何问题的,因为 bar的foo的UID相同。

下面是一些脚本

得到容器在Host上的PID:

1
docker inspect $container_id -f '{{.State.Pid}}'

探测容器用户、UID、用户组、GID:

1
2
3
4
5
6
# 先touch个一文件
$ docker exec $container_id touch /tmp/.pod_jvm_tools
# stat这个文件
$ docker exec $container_id stat -c '%u %U %g %G' /tmp/.pod_jvm_tools
1000  java-app 65535 nogroup
[uid] [usr]    [gid] [group]

检查当前系统有没有用户、用户组:

1
2
getent passwd [uid]
getent group [gid]

nsenter,进入某个PID的Namesapce,然后执行某些命令:

1
nsenter -t <pid> -a -r

runuser,以某用户某group身份执行某些命令:

1
runuser -u <usr> -g <group> -m -- cat /proc/<pid>/root/path/to/file

pgrep,列出同属某进程Namespace的所有其他进程:

1
pgrep --ns <pid> -a

lsns,显示每个容器的根namesapce,但实际用下来没有搞明白(可以参考这个这个),没有nsenter好用:

1
lsns -t pid

版权

评论