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拥有。



浙公网安备 33010602011771号