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
结果如下:

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