Linuxkit中Redis进程已运行但找不到对应容器的问题咨询
问题背景
我在研究Linuxkit项目时,使用redis-os.yml示例创建了镜像。启动redis-os后,Redis运行正常,但看不到对应的Redis服务器容器,无法确定其位置:
pstree输出:
(ns: getty) linuxkit-f6b2836a15cb:~# pstree init-+-containerd---7*[{containerd}] |-containerd-shim-+-tini---rungetty.sh-+-rungetty.sh---login---sh | | `-rungetty.sh---login---sh---bash--+ | `-11*[{containerd-shim}] `-containerd-shim-+-redis-server---3*[{redis-server}] `-11*[{containerd-shim}]
runc list输出:
(ns: getty) linuxkit-f6b2836a15cb:~# runc list ID PID STATUS BUNDLE CREATED OWNER 000-dhcpcd 0 stopped /containers/onboot/000-dhcpcd 2022-08-12T21:38:05.40297821Z root
netstat输出:
(ns: getty) linuxkit-f6b2836a15cb:~# netstat -natp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 421/redis-server tcp 0 0 :::6379 :::* LISTEN 421/redis-server
问题: Redis容器在哪里?如何访问其配置文件或进入容器文件系统?
解答
为什么看不到Redis容器?
Linuxkit中的Redis是以service容器的方式运行的,这类容器由containerd托管,进程通过containerd-shim维持运行,而runc list仅显示由runc直接管理的容器实例,因此Redis容器不会出现在该命令的结果中,但从pstree输出能确认redis-server进程确实处于容器命名空间内。
定位Redis容器并访问其资源的方法
使用containerd客户端查看容器
Linuxkit默认采用containerd作为容器运行时,使用ctr命令可以查看所有容器和任务:# 列出所有容器 ctr containers list # 列出所有运行中的任务 ctr tasks list执行后会找到Redis对应的容器名称或ID。
进入Redis容器的命名空间
已知Redis进程PID为421,通过nsenter命令进入该进程的命名空间,即可获得容器内部的操作环境:nsenter -t 421 -m -u -i -n -p sh该命令会挂载目标进程的挂载、UTS、IPC、网络和PID命名空间,等同于进入容器内部。
查找并访问Redis配置文件
进入容器命名空间后,Redis配置文件通常位于/etc/redis/redis.conf,直接查看即可:cat /etc/redis/redis.conf如果不确定配置文件路径,可通过进程参数确认:
ps aux | grep redis-server输出内容会显示
redis-server加载的配置文件路径。直接访问容器文件系统目录
Linuxkit的容器文件系统存储在/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/目录下,每个快照对应一个容器的文件系统:# 获取Redis容器的快照ID ctr containers info <redis容器名称> | grep snapshot # 访问快照对应的文件系统 ls /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/<快照ID>/fs
内容的提问来源于stack exchange,提问作者Satish

