深入容器内部进行调试和检查,展示了从宿主机进入容器命名空间的全过程
命令执行流程总结
- 获取容器主进程 PID
docker inspect 31f5684037af | grep -i pid
# 结果:容器主进程 PID = 18616
- 验证进程存在
ps -ef | grep 18616
# 确认进程存在,是 CoreDNS 容器
- 查看进程的命名空间
lsns --task 18616
# 显示该进程属于哪些命名空间(cgroup、user、net、uts、ipc、mnt、pid)
NS TYPE NPROCS PID USER COMMAND
4026531835 cgroup 468 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 18
4026531837 user 468 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 18
4026533187 net 2 18534 root /pause
4026533262 uts 2 18534 root /pause
4026533263 ipc 2 18534 root /pause
4026533340 mnt 1 18616 root /bin/coredns -conf /etc/coredns/Corefile
4026533341 pid 1 18616 root /bin/coredns -conf /etc/coredns/Corefile
- 进入所有命名空间
nsenter -t 18616 --all
# --all 参数表示进入该进程的所有命名空间
# 执行后,shell 直接进入了容器内部
- 容器内操作验证
ip addr show # 查看容器网络(IP: 192.168.0.22)
ps aux # 查看容器内进程(PID 从 1 开始)
ls # 查看容器文件系统