虽然Docker是通过namespace隔离技术实现容器间进程的隔离,但在运行Docker的主机中,Docker容器内的进程与主机内运行的进程是在同一个namespace(假设叫A)的。虽然在Docker容器内应用进程的父进程都是pid为1的那个进程(这些进程都是单独的namespace,这个namespace与前面提到的namespace不是同一个,此处假设为B),但在namespace A中Docker内容器实际的父进程都是Docker daemon,由于父进程具有对子进程管理的能力,而子进程不能影响到父进程也不能影响到其他namespace的进程,所以能实现进程隔离。

由于Docker容器内的进程与主机内运行的进程是在同一个namespace,所以在主机中使用ps -ef命令可以查找出当前系统中运行的所有进程,这些进程包含了完整的与Docker有关的所有进程,在这个namespace中,这些进程的父进程(不管是父进程还是父父进程)都包含Docker daemon,因此可以从Docker容器某进程的pid开始,一直找到主机的init进程。

有时我们需要根据docker容器进程的pid找到这个容器的容器id,这时通过Linux系统自带的基础命令是无法完成这一操作的。但要想通过pid获取容器id,办法还是有的。其中有两种可行的办法。

第一种根据:docker inspect <CONTAINER ID>可以获取容器的pid,通过docker ps可以获取容器的容器id,因此可以将这两个命令结合在一起,利用下面的命令行就可以解决:

docker inspect -f '``.`State`.`Pid` ``.`Id`' $(docker ps -a -q) | grep <pid>

    但是第一种有一个缺陷,那就是如果这个进程恰好是容器内进程的子进程,那么这个进程就不会再在主机的namespace中出现,因为只有容器的pid为1的进程才会在主机的namespace中出现。因此就必须使用第二种方法。

第二种:在Docker Version 1.11后,增加了“containerd”,根据这个特性的实现方式可以直接通过此进程的父进程的cmdline找到它的容器id。这个方法的缺点就是不适用于Docker Version 1.11之前的版本。

根据这两种特性,编写了一个Python脚本,用于发现:

1.查找pid所对应的容器id,并打印容器的详细信息

2.获取此进程的进程树和含有命令行的进程树

脚本中还隐藏了一种根据进程推导出进程所占用端口号的函数。这个功能在此脚本中用处不大,但在别处有用处。

由于脚本内容比较长,因此可以从Gitub上获取此脚本:https://github.com/DingGuodong/LinuxBashShellScriptForOps/tree/master/projects/LinuxSystemOps/SoftwareManagement/docker。

运行效果图(如果看不清,请使用新标签页打开图片查看原图)如下:

Docker Server Version < 1.11

一个第一种方法失败的例子。

此时,就有必要借助第二种方法实现(如果看不清,请使用新标签页打开图片查看原图)。

题外话:

    关于init进程,“init进程是所有Linux进程的父进程”,这句话其实是错的!也许应该说init进程是所有Linux用户空间进程的父进程,pid 2 [kthreadd]是Linux系统内核空间进程的父进程。除了2以外,3、4、5等也是特殊进程pid,它们的父进程都不是init。除此之外,0也是一个特殊的进程,用于进程调度。

tag: 通过pid获得容器id,容器namespace,如何查找容器id

--end--

通过Docker进程pid获取容器id相关推荐

  1. java pid 获取句柄_获取进程pid、根据进程pid获取线程pid、获取线程进程句柄

    ======================================= 获取进程pid ======================================= #include &qu ...

  2. 通过进程pid获取窗口句柄HWND,然后可以通过sendmessage进行交互通讯

    //通过pid获取窗口句柄 HWND GetHwndByPid(DWORD dwProcessID) {HWND h = GetTopWindow(0);HWND retHwnd = NULL;whi ...

  3. 《docker+k8s微服务容器化实践》笔记2

    5-3 集群环境搭建_A  5-4 集群环境搭建_B  5-5 集群环境搭建_C 这次开始动手操作,首先是Mesos的安装,怎么来安装Mesos.源码:https://github.com/limin ...

  4. centos 7 中安装 docker和创建 tomcat容器并部署web应用

    在 CentOS 7 中安装 Docker 和创建 Tomcat 容器并部署Web应用 一般部署Web应用都需要安装数据库,比如 MySQL 和 Redis,MySQL 和 Redis 属于多个Web ...

  5. C# API之常用操作窗口类函数详解[查找所有窗口、获取目标句柄的类名、获取窗口文本、获取当前活动窗口、通过窗口句柄获取线程ID、获取指定窗口位置]

    /// <summary>/// 查找所有窗口(只要是在进程里面的)/// 如果不限制类名或者标题使用null代替/// </summary>/// <param nam ...

  6. linux docker ps -a,docker ps-docker ps a-docker ps无反应-docker ps是什么意思-docker ps命令解析-docker进程ps-嗨客网...

    Docker ps命令概述 docker ps 命令可以用来列出 Docker ps命令语法 haicoder(www.haicoder.net)# docker ps [OPTIONS] Docke ...

  7. 【六袆 - linux】docker 第二次运行容器;docker第二次运行mysql容器;docker第二次启动mysql;

    遇到问题 解决问题 1.输入 docker ps -a,查看容器id 2.运行该容器 参考博文 docker进入容器报 Error response from daemon: Container 68 ...

  8. Docker的配置与容器的拉取镜像、端口映射

    Docker的配置与容器的拉取镜像.端口映射 VM虚拟机的配置(linux redhat系统) 配置网络和软件源 docker docker容器介绍 虚拟机与容器技术对比 建立并配置容器 docker ...

  9. Python 技术篇-通过进程名获取进程pid实例演示,使用psutil库获取进程id

    psutil.process_iter() 方法可以返回进程列表信息,再通过匹配名称,获取进程的 pid 即可. import psutildef get_pid(name):'''作用:根据进程名获 ...

最新文章

  1. iframe几种常用代码片段
  2. linux生日_代码简介:让我们用25个Linux事实来庆祝Linux的25岁生日。
  3. 近期论文中的数据集整理0409
  4. C++ 自由存储区是否等价于堆?
  5. 怎么看b树是几阶_数据库原理基础:设计B树与B+树的目的以及二者的优劣
  6. python模块化编程_Python模块化编程
  7. 怎么选PMP培训机构?
  8. Python案例实操3-电影数据分析
  9. 定向灰盒fuzzing工具BEACON
  10. 同位语从句 vs 定语从句 区别
  11. 步进电机控制Proteus仿真
  12. 电力电子转战数字IC——路科MCDF全览(持续更新)
  13. 增量学习 (Incremental Learning)
  14. Springboot游戏道具在线交易平台毕业设计源码171956
  15. 2014年24如何改变球段魔尺视频教程
  16. 信息奥赛一本通1312:【例3.4】昆虫繁殖
  17. html 自适应模板 (webview)
  18. 2019全球智博会将于苏州召开,三大重磅奖项候选项目火热征集中...
  19. HTML5小游戏之五子棋
  20. matlab软件推广海报,海报制作软件下载-posterlabs海报制作工具下载1.0 官方版-西西软件下载...

热门文章

  1. python沙箱逃逸小结
  2. 全球Top10最佳移动统计分析sdk
  3. windows下phpstorm的常用快捷键及使用技巧
  4. citirx for wincor configuration (citrix 7.5 setup with WI)
  5. C++/面试 - 四种类型转换(cast)的关键字 详解 及 代码
  6. 如何将Spring Bean注入到JSF Converter
  7. ubuntu系统颜色更改
  8. 热门事件和书籍中资料管理中国
  9. 量子计算机退相干问题怎么办,量子退相干
  10. 《深度学习》李宏毅 -- task7总结