容器隔离性
容器的隔离性是其相对于传统虚拟机的一大优势,主要体现在以下几个方面:
-
文件系统隔离:每个容器都有自己的文件系统,这意味着容器之间不会直接影响彼此的文件和目录。通过使用镜像和分层文件系统,容器可以共享相同的基础镜像,同时在其上层进行独立的读写操作。
-
进程隔离:容器内部运行的进程在容器外部是不可见的。每个容器都有自己的进程空间,这使得容器之间的进程不会互相干扰。
-
网络隔离:每个容器都有自己的网络栈,包括IP地址、网络接口等。容器之间的网络通信通常需要通过端口映射或使用容器编排工具(如Kubernetes)配置网络策略。
-
资源隔离与限制:通过使用cgroups(控制组),可以限制容器使用的CPU、内存、磁盘I/O等资源。这防止了某个容器消耗过多的主机资源,从而影响其他容器或主机本身的性能。
-
命名空间隔离:Linux命名空间技术允许容器拥有自己的PID、网络、用户ID、挂载、IPC(进程间通信)等命名空间。这些命名空间的隔离确保了容器之间的环境是独立的。
-
安全隔离:容器通过使用安全模块(如AppArmor、SELinux)和内核特性(如Seccomp)来增强安全性,限制容器内的进程对系统的访问。
这些隔离特性使得容器能够在同一台主机上同时运行多个应用程序,而不会相互干扰,从而提高了资源利用率和应用的部署灵活性。
进入容器的网络命名空间
nsenter
是一个强大的工具,它允许您进入Linux的不同命名空间。这里--net
选项表示您想要进入网络命名空间 ,通过查询容器的PID号即可进入对应容器的网络命名空间。
nsenter --target <containerd_pid> --net
-
Docker PID查询
#docker inspect -f '{{ .State.Pid }}' <container_name_or_id> 或者 #docker inspect <container_name_or_id> |grep -i pid
注意*有时候查询出来的容器PID等于0,说明容器运行有问题,需要检查容器运行的程序日志
-
containerd PID查询
1、ctr -n k8s.io c ls #查询你需要的容器,记录容器ID
2、ctr -n k8s.io task ls |grep containerd_pid
或者
ctr -n k8s.io task ls |grep containerd_pid |awk '{print$2}'
#回显PID信息