在这篇文章中,我研究了容器是如何在一些特定的Linux技术之上实现的,包括命名空间和控制组。图1:有助于容器的Linux技术(NivedVelayudhan,CCBY-SA4.0)这些Linux技术构成了在系统上构建和运行容器进程的基础:命名空间控制组(cgroups)SeccompSELinux1。命名空间命名空间命名空间为容器提供了一个隔离层,使它们能够看到看似独占的Linux文件系统。这限制了进程可以访问的内容,从而限制了它可以获得的资源。Docker或Podman等容器技术在创建容器时使用Linux内核中的几个命名空间:[nivedv@homelab~]$dockercontainerrunalpineping8.8.8.8[nivedv@homelab~]$sudolsns-p29413NSTYPENPROCSPIDUSERCOMMAND4026531835cgroup2991root/usr/lib/systemd/systemd--switched...4026531837user2781root/usr/lib/systemd/systemd--switched...4026533105mnt129413rootping8.8.8.84026533106uts129413rootping8.8.8.84026533107ipc129413rootping8.8.8.84026533108pid129413rootping8.8.8.84026533110net129413rootping8.8.8.8用户用户(user)Namespacesisolateusersandgroups在一个容器内。这是通过为容器分配与主机系统不同的UID和GID范围来实现的。用户命名空间使软件能够以根用户身份在容器内运行。如果入侵者攻击容器然后逃到宿主机,他们只能以受限的非root身份运行。挂载mount(mnt)命名空间允许容器拥有自己的文件系统层次结构视图。在Linux系统的/proc//mounts位置可以找到各个容器进程的挂载点。UTSUnix分时系统Unix分时系统(UTS)命名空间允许容器拥有唯一的主机名和域名。运行容器时,即使使用--name标志,也会使用随机ID作为主机名。您可以使用unshare命令查看其工作原理。nivedv@homelab~]$dockercontainerrun-it--namenivedalpinesh/#hostname9c9a5edabdd6/#nivedv@homelab~]$sudounshare-ushsh-5.0#hostnameisolated.hostnamesh-5.0#hostnameisolated.hostnamesh-5.0#sh-5.0#exitexit[nivedv@homelab~]$hostnamehomelab.redhat.comIPC进程间通信进程间通信(IPC)命名空间允许不同的容器进程通过访问共享内存或使用共享消息队列进行通信。[root@demo/]#ipcmk-M10MSharedmemoryid:0[root@demo/]#ipcmk-M20MSharedmemoryid:1[root@demo/]#[root@demo/]#ipcs------MessageQueues--------keymsqidownerpermsused-bytesmessages------SharedMemorySegments--------keyshmidownerpermsbytesnattchstatus0xd1df416a0root6441048576000xbd487a9d1root644209715200------SemaphoreArrays---------keysemidownerpermsnsemsPIDensurerunningprocessIDProcessID(PID)Processesinside容器与外界隔绝。当您在容器内运行ps命令时,由于这种命名空间隔离,您只能看到在容器内运行的进程,而不是在主机上运行的进程。网络(net)命名空间允许容器拥有自己的网络接口、IP地址、路由表、端口号等视图。容器如何与外界通信?您创建的所有容器都连接到一个特殊的虚拟网络接口以进行通信。[nivedv@homelab~]$dockercontainerrun--rm-italpinesh/#ping8.8.8.8PING8.8.8.8(8.8.8.8):56databytes64bytesfrom8.8.8.8:seq=0ttl=119time=21.643ms64bytesfrom8.8.8.8:seq=1ttl=119time=20.940ms^C[root@homelab~]#iplinkshowveth84ea6fcveth84ea6fc@if22:
