【docker】小技巧:在宿主机器上直接查看docker容器的进程

最近看了这篇文章:Understanding how uid and gid work in Docker containers,了解到:html

  1. docker容器内的一个进程对应于宿主机器上的一个进程
  2. 容器内的进程,与相对应的宿主进程,由相同的uid、gid拥有。也就是说,若是在容器内主进程属于用户uid=1000,那么这个容器进程在宿主机器上也属于用户uid=1000。容器内的用户uid=1000就是容器外的用户uid=1000,也是其余容器内的用户uid=1000。上面连接的文章介绍了不少这样的例子。

让咱们来验证这两点mysql

docker容器内的一个进程对应于宿主机器上的一个进程

在个人Ubuntu上没有安装、更没有运行mysql,可是我经过docker启动了一个mysql容器。此时,我可以经过在宿主机器上的命令行ps aux | grep mysql看到mysql的进程:sql


咱们能在宿主机器上看到mysqld建立的进程,验证了第一点。docker

容器内的进程,与相对应的宿主进程,由相同的uid、gid拥有

如今咱们验证一下【在宿主机器上的进程拥有者uid、gid】是否是等于【在容器内的进程拥有者uid、gid】。ubuntu

在宿主机器上的进程拥有者uid、gid

在上面的ps aux | grep mysql输出中,显示进程ID是25138,【容器进程拥有者的用户名】是guest-v+,看不到uid。而且,咱们没法经过id guest-v+查看用户信息,由于这个用户名是虚拟的。segmentfault

在搜索一番之后,我发现ps命令很是强大,几乎能给你全部须要的进程信息!设置几个参数就能让它输出咱们想要的进程信息:bash

ps --pid 25138 -O uid,uname,gid,group,ppid

上面的参数表示,我要查看pid为25138的进程,而且除了默认的列之外,多展现几列:uid,uname,gid,group,ppid
输出以下:

终于找到了!【在宿主机器上的进程拥有者uid】是999,groupid也是999。(PPID(parent pid)展现了父进程的pid,有了它,你能够继续查看父进程的信息)ui

ps manuals中,能找到这个命令的更多用法、更多能够展现的列:
clipboard.png

在容器内的进程拥有者uid、gid

接下来,让咱们查看【在容器内的进程拥有者uid】。
经过docker exec -it 容器名称 bash,在容器内运行一个bash。
根据我以前的博客,执行apt-get update && apt-get install procps,在容器内安装ps(大部分容器为了精简,没有预装ps)。
使用ps ax -O uid,uname,gid,group,ppid,查看容器内的全部进程:

能够看到,在容器内,msqld进程的拥有者uid也是999,groupid也是999。spa

【在宿主机器上的进程拥有者uid】和【在容器内的进程拥有者uid】都是999,gid同理,咱们已经验证了第二点。命令行

相关文章
相关标签/搜索