Docker底層架構之命名空間

2022-06-03 23:45:16 字數 969 閱讀 6929

命名空間是 linux 核心乙個強大的特性。每個容器都有自己單獨的命名空間,執行在其中的 應用都像是在獨立的作業系統中執行一樣。命名空間保證了容器之間彼此互不影響。相應的命名空間功能如下:

不同使用者的程序就是通過 pid 命名空間隔離開的,且不同命名空間中可以有相同 pid。所有的 lxc 程序在 docker 中的父程序為docker程序,每個 lxc 程序具有不同的命名空間。同時由 於允許巢狀,因此可以很方便的實現巢狀的 docker 容器。

有了 pid 命名空間, 每個命名空間中的 pid 能夠相互隔離,但是網路埠還是共享 host 的端 口。網路隔離是通過 net 命名空間實現的, 每個 net 命名空間有獨立的 網路裝置, ip 位址, 路 由表, /proc/net 目錄。這樣每個容器的網路就能隔離開來。docker 預設採用 veth 的方式,將 容器中的虛擬網絡卡同 host 上的一 個docker 網橋 docker0 連線在一起。

容器中程序互動還是採用了 linux 常見的程序間互動方法(interprocess communication - ipc), 包括訊號量、訊息佇列和共享記憶體等。然而同 vm 不同的是,容器的程序間互動實際上還是 host 上具有相同 pid 命名空間中的程序間互動,因此需要在 ipc 資源申請時加入命名空間信 息,每個 ipc 資源有乙個唯一的 32 位 id。

類似 chroot,將乙個程序放到乙個特定的目錄執行。mnt 命名空間允許不同命名空間的程序 看到的檔案結構不同,這樣每個命名空間 中的程序所看到的檔案目錄就被隔離開了。同 chroot 不同,每個命名空間中的容器在 /proc/mounts 的資訊只包含所在命名空間的 mount point。

uts(「unix time-sharing system」) 命名空間允許每個容器擁有獨立的 hostname 和 domain name, 使其在網路上可以被視作乙個獨立的節點而非 主機上的乙個程序。

每個容器可以有不同的使用者和組 id, 也就是說可以在容器內用容器內部的使用者執行程式而非主 機上的使用者

Docker技術底層架構剖析

docker 底層技術 docker底層的 2 個核心技術分別是namespaces 和control groups 在作業系統中,網路配置,程序,使用者,ipc 程序之間的呼叫 等資訊之間的操作,都是可以被所有程序檢視到的,除了這些資源資訊,我們還需要隔離程序之間能夠共享的資訊,而namespac...

Docker架構和底層技術簡介

開篇 docker engine包含的東西有 後台程序 dockerd rest api server cli 介面 dockerd docker的架構是c s架構,docker的client和server即 dockerd 之間通過rest api server進行通訊。dockerd主要是維護後...

Python命名空間總結 「命名空間之禪」

python中的命名空間,在使用點號.和不使用點號.兩種情況下使用變數名時,會有不同的處理方式。賦值語句 var value 僅僅是建立或改變當前作用域變數名,除非使用了global或者nonlocal關鍵字 引用語句 var 搜尋路徑如下 l local 在當前作用域下搜尋變數名var e 在所有...