四、容器的命名空间:解决冲突的方式一

1.几种常见的冲突

容器之间是共享系统内核的,所以很容易产生冲突,下面是一些常见问题的冲突:

  • 两个程序想要绑定到相同的网络端口。
  • 两个程序都使用相同的临时文件名和文件锁。
  • 两个程序想要使用不同版本且全局已安装的库。
  • 同一程序的两个副本要使用相同的PID文件。
  • 第二个安装的程序修改了另一个程序正在使用的环境变量,导致第一个程序中断。

2.解决冲突

那么docker是如何解决这些冲突的呢?

Docker通过Linux的命名空间、根文件系统和虚拟网络组件等工具解决了这些软件冲突,所有这些工具都用来为每个容器提供隔离。这里我们先说命名空间,后续再学习根文件系统和虚拟网络组件。

Docker为每个容器创建一个PID命名空间

Linux为每个运行的进程都生成一个进程标识符,即PID。Linux提供了工具可以创建多个PID命名空间,每个空间都有自己的一套PID。docker为每个容器创建了一个命名空间。不同命名空间的PID可能相同,但不影响程序的运行。下面就通过命令观察一下不同容器内的PID情况,使用docker exec命令在运行的容器中运行额外的进程。ps命令可以显示出容器内的所有进程。

docker exec mailer ps
docker exec agent ps

结果如下:


image.png

可以看到,mailer和agent都有一个PID=1的进程,通常编号1的PID进程是init系统进程。虽然PID相同,但是两个进程互不影响,因为它们在不同的命名空间中。想象一下,如果没有PID命名空间,多个容器和宿主机共用一套PID,就需要在容器之间做大量的信息同步工作,非常麻烦。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,521评论 0 27
  • Docker容器技术已经发展了好些年,在很多项目都有应用,线上运行也很稳定。整理了部分Docker的学习笔记以及新...
    __七把刀__阅读 11,629评论 0 58
  • 文/tangsl(简书作者) 原文链接:http://www.jianshu.com/p/2b993a4b913e...
    西葫芦炒胖子阅读 3,947评论 0 5
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,323评论 0 23
  • 我不惊艳,但我不丑! 岁月或许会给女人留下了皱纹,但是从未带走属于我的气质,我希望那是知性的、有教养的、有光彩的美...
    云洛洛阅读 185评论 0 0

友情链接更多精彩内容