Docker 进程转储core

大多数docker为剪裁的nuix系统,很多的命令工具都没有,需要上传静编译好的busybox上传docker cp busybox-i486 8553e459dc85:\tmp与scp命令相似。

1、方法一

root也无权限,因为docker为了保证主机安全,docker开了很多安全设置,禁止ptrace,Docker 将gdb调试需要SYS_PTRACE属性被禁止掉了,所以gdb在调试的时候会显示ptrace被禁止。所以想在docker内部调试gdb解决办法就是create和run的时候带上以下参数。
采用超级权限模式
docker run --privileged ......
关闭seccomp
docker run --security-opt seccomp=unconfined
仅开放ptrace限制
docker run --cap-add=sys_ptrace
docker安全机制中中包括ASLR(Address space layout randomization),即docker里的内存地址和主机内存地址是不一样的。ASLR会导致GDB这种依赖地址的程序无法正常运作。
使用gdb转储时应该要注意gdb调试中gdb默认需要关闭linux的地址随机化功能,可以通过gdb 命令set disable-randomization off关闭。

set disable-randomization on		# 开启
set disable-randomization off		# 关闭
show disable-randomization		# 显示


最后,通过超级权限模式进入,正常转储进程coredump文件,

2、方法二
方法一中docker 运行时不能更改SYS_PTRACE且可能造成容器逃逸。所以可以才用以下方法,进入dockers,并且该 bash 并没有 SYS_PTRACE 权限的限制,可以非常方便的使用 gdb 了。

yum install util-linux -y   # 安装nsenter命令
docker inspect -f {{.State.Pid}} +容器名/容器id	# 查询容器pid
nsenter -m -u -i -n -p --target ${PID} bash	# 启动一个跟容器内进程共用同一个 namespace 的 bash

成功转储core

3、疑问:转储宿主机pid是否正确?
从宿主机上找到对应的进程,然后在宿主机上执行gdb attach。
宿主机进程与容器进程有以下特点
1、docker容器内的一个进程对应于宿主机器上的一个进程。
2、容器内的进程,与相对应的宿主进程,由相同的uid、gid拥有。

参考资料:https://visualgdb.com/gdbreference/commands/set_disable-randomization?spm=a2c6h.12873639.article-detail.6.558714108Mgy0Chttps://docs.docker.com.zh.xy2401.com/engine/security/seccomp/https://www.zsythink.net/archives/4321

posted @ 2023-07-14 15:55  打上花火✿  阅读(127)  评论(0)    收藏  举报