17 July 2019
查看 docker 进程的 piddocker inspect -f {{.State.Pid}} xxx
lsnslsns -h
-n, --noheadings don't print headings
-p, --task print process namespaces
-t, --type namespace type (mnt, net, ipc, user, pid, uts)
# 列出进程号为 102044 的 net 和 mnt 命名空间
lsns -p 102044 -t net -t mnt
# 列出系统上所有 net 的命名空间
lsns -t net
nsenternsenter -h
--target
--mount[=]
--uts[=]
--ipc[=]
--net[=]
--pid[=]
--user[=]
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