linux 命名空间的相关命令 - (sunznx) 振翅飞翔
17 July 2019

查看 docker 进程的 pid

docker inspect -f {{.State.Pid}} xxx

lsns

lsns -h
-n, --noheadings       don't print headings
-p, --task <pid>       print process namespaces
-t, --type <name>      namespace type (mnt, net, ipc, user, pid, uts)

# 列出进程号为 102044 的 net 和 mnt 命名空间
lsns -p 102044 -t net -t mnt

# 列出系统上所有 net 的命名空间
lsns -t net

nsenter

nsenter -h
--target <pid>
--mount[=<file>]
--uts[=<file>]
--ipc[=<file>]
--net[=<file>]
--pid[=<file>]
--user[=<file>]

lsns -p 102044
        NS TYPE  NPROCS    PID USER    COMMAND
4026531837 user     214      1 root    /usr/lib/systemd/systemd --switched-root --system --deserialize 22
4026533663 ipc        2 100870 root    /pause
4026533666 net        2 100870 root    /pause
4026533727 mnt        1 102044 polkitd redis-server *:637
4026533728 uts        1 102044 polkitd redis-server *:637
4026533729 pid        1 102044 polkitd redis-server *:637

# NPROCS  number of processes in the namespace
# PID     lowest PID in the namespace

首先观察到 102044 这个进程本身实际上只有 mnt, uts, pid 这三个命名空间,user, ipc, net 这三个命名空间是从其他进程共享过来的

# 进入命名空间,但不使用命名空间的 net 和 mnt 命名空间 (不使用 mnt 命名空间的好处是可以使用宿主机的命令行工具)
nsenter nsenter -t 102044 --ipc --uts --pid ps -aux

# 进入命名空间,并且使用命名空间的 net 和 mnt 命名空间
nsenter nsenter -t 102044 --ipc --uts --net --pid --mount ps -aux


nsenter nsenter -t 102044 \
  --ipc=/proc/102044/ns/ipc --uts=/proc/102044/ns/uts \
  --net=/proc/102044/ns/net --pid=/proc/102044/ns/pid \
  --mount=/proc/102044/ns/mnt --user=/proc/102044/ns/user

ip netns 只进入网络命令空间最简单的方法

# 链接单个 docker 容器
mkdir -p /var/run/netns
ln -s /proc/102044/ns/net /var/run/netns/102044
ip netns exec 102044 ip addr show

# 链接所有 docker 容器
ln -s /var/run/docker/netns/* /var/run/netns/

挂载 docker 目录

ls /proc/$PID/root
bindfs /proc/$PID/root /media