2

Linux命名空间一些笔记

 2 years ago
source link: https://chanjarster.github.io/post/linux/namespace/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Linux命名空间一些笔记

容器使用了 Linux Namespace 技术,通过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:

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

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

# 先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]

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

getent passwd [uid]
getent group [gid]

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

nsenter -t <pid> -a -r

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

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

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

pgrep --ns <pid> -a

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

lsns -t pid

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK