docker中nsenter使用介绍
$ nsenter --help 用法: nsenter [options] <program> [<argument>...] Run a program with namespaces of other processes. 选项: -t, --target <pid> 要获取名字空间的目标进程 -m, --mount[=<file>] enter mountnamespace -u, --uts[=<file>] enter UTSnamespace (hostname etc) -i, --ipc[=<file>] enter System V IPCnamespace -n, --net[=<file>] enter networknamespace -p, --pid[=<file>] enter pidnamespace -U, --user[=<file>] enter usernamespace -S, --setuid <uid> set uid in enterednamespace -G, --setgid <gid> set gid in enterednamespace --preserve-credentialsdo not touch uids or gids -r, --root[=<dir>] set the root directory -w, --wd[=<dir>] set the working directory -F, --no-fork 执行 <程序> 前不 fork -Z, --follow-context set SELinux context according to --target PID -h, --help 显示此帮助并退出 -V, --version 输出版本信息并退出
示例:
$ docker inspect -f {{.State.Pid}} 容器名或者容器id 如下: $ docker inspect -f {{.State.Pid}} 7b7af641a02d 20560 $ docker inspect -f {{.State.Pid}} consul_client 20560 输入该命令便进入到容器中 $ nsenter --target 上面查到的进程id --mount --uts --ipc --net --pid 解释nsenter指令中进程id之后的参数的含义: * –mount参数是进去到mount namespace中 (文件系统) * –uts参数是进入到uts namespace中 (主机名与域名) * –ipc参数是进入到System V IPC namaspace中 (信号量、消息队列和共享内容) * –net参数是进入到network namespace中 (网络设备、网络栈、端口) * –pid参数是进入到pid namespace中 (进程编号) * –user参数是进入到user namespace中 (用户和用户组)
可以用curl命令试试能不能curl通其他应用:
nsenter -t Pid -m -n curl 域名:端口号
docker隔离应用应用涉及到的六大名称空间
1、pid 命名空间(进程ID)
不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。所有的 LXC 进程在 Docker 中的父进程为 Docker 进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。
2、net 命名空间(网络)
有了 pid 命名空间,每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备,IP 地址,路由表,/proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默认采用 veth 的方式,将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起。
3、ipc 命名空间(进程间通信)
容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC), 包括信号量、消息队列和共享内存等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同 pid 命名空间中的进程间交互,因此需要在 IPC 资源申请时加入命名空间信息,每个 IPC 资源有一个唯一的 32 位 id。
4、mnt 命名空间(挂载文件系统)
类似 chroot,将一个进程放到一个特定的目录执行。mnt 命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个命名空间中的容器在 /proc/mounts 的信息只包含所在命名空间的 mount point。
5、UTS 命名空间(主机名/域名)
UTS(“UNIX Time-sharing System”) 命名空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。
6、user 命名空间(用户)
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。
查看docker的连接
由于使用DOCKER的时候,ESTABLISHED连接不会出现在netstat中,在运行中的docker容器中列出打开的套接字的方法 ,查找docker的进程号:
查看连接:
$ sudo nsenter -t <Pid> -n netstat | grep ESTABLISHED 示例: $ nsenter -t 1829 -n netstat |grep ESTABLISHED tcp 0 0 localhost:60353 localhost:epmd ESTABLISHED tcp 0 0 localhost:epmd localhost:60353 ESTABLISHED tcp 0 0 localhost.localdo:15672 192.168.56.1:59679 ESTABLISHED tcp6 0 0 172.17.0.2:amqp 192.168.56.1:59898 ESTABLISHED tcp6 21 0 172.17.0.2:amqp 192.168.56.1:59571 ESTABLISHED
本文转自:https://blog.csdn.net/qq_21127151/article/details/119882396