Open Container Initiative(OCI)目前有2個標準:runtime-spec以及image-spec。前者規定了如何運行解壓過的filesystem bundle。OCI規定了如何下載OCI鏡像並解壓到OCI filesystem bundle,這樣OCI runtime就能夠運行OCI bundle了。OCI(當前)至關於規定了容器的images和runtime的協議,只要實現了OCI的容器就能夠實現其兼容性和可移植性。implements中列出了部分OCI標準的實現。本文不討論windows下的實現,具體參見Open Container Initiative Runtime Specificationhtml
system bundle是個目錄,用於給runtime提供啓動容器必備的配置文件和文件系統。標準的容器bundle包含如下內容:node
config.json:該文件包含了容器運行的配置信息,該文件必須存在bundle的根目錄,且名字必須爲config.json
容器的根目錄,能夠由config.json中的root.path指定
下面使用runc來運行一個容器,runc是根據OCI標準生成的一個cli工具。前面兩個命令用於提取filesystem,最後一個用於生成config.json,二者組織在一塊兒就是一個filesystem bundlelinux
# mkdir rootfs # docker export $(docker create busybox) | tar -C rootfs -xvf -
# runc spec
使用runc來運行這個bundle,可使用state查看該容器的狀態git
# runc run busybox # runc state busybox { "ociVersion": "1.0.0", "id": "busybox", "pid": 41732, "status": "running", "bundle": "/home/test", "rootfs": "/home/test/rootfs", "created": "2018-12-25T14:41:58.82202891Z", "owner": ""
OCI runtime包含runtime,runtime-linux,config,config-linuxgithub
ociVersion:建立容器時的OCI版本
因爲runc實現了OCI runtime,使用runc state查看上述busybox能夠獲得state相關的信息docker
{ "ociVersion": "1.0.0", "id": "busybox", "pid": 41732, "status": "running", "bundle": "/home/test", "rootfs": "/home/test/rootfs", "created": "2018-12-25T14:41:58.82202891Z", "owner": "" }
state <container-id>,參見上述state描述
create <container-id> <path-to-bundle>,runtime應該提供檢測id惟一性的功能。該操做中會用到config.json除process以外的配置屬性(由於process實在start階段用到的)。實現中可能會與本規範不一致,如在create操做以前實現了pre-create
start <container-id>,執行config.json的process中定義的程序,若是process沒有設定,則返回錯誤
kill <container-id> <signal>,向一個非running狀態的容器發送的信號會被忽略。此操做用於向容器進程發送信號
delete <container-id>,嘗試刪除一個非stopped的容器會返回錯誤。容器刪除後其id可能會被後續的容器使用
# runc delete busybox
cannot delete container busybox that is not stopped: running
// Linux is platform-specific configuration for Linux based containers. Linux *Linux `json:"linux,omitempty" platform:"linux"` // Solaris is platform-specific configuration for Solaris based containers. Solaris *Solaris `json:"solaris,omitempty" platform:"solaris"` // Windows is platform-specific configuration for Windows based containers. Windows *Windows `json:"windows,omitempty" platform:"windows"` // VM specifies configuration for virtual-machine-based containers. VM *VM `json:"vm,omitempty" platform:"vm"`
consoleSize:指定terminal的長寬規格,width和height
根據平臺不一樣支持以下配置json
POSIX process 支持設置POSIX和Linux平臺windows
Linux process:數組
apparmorProfile:指定進程的apparmor文件
capabilities:指定進程的capabilities
noNewPrivileges:設置爲true後能夠防止進程獲取額外的權限(如使得suid和文件capabilities失效),該標記位在內核4.10版本以後能夠在/proc/$pid/status中查看NoNewPrivs的設置值。更多參見no_new_privs
oomScoreAdj
:給進程設置oom_score_adj值,進程的oom涉及如下3個文件,oom_adj和oom_score_adj功能相似,oom_adj主要用於兼容老版本,oomScoreAdj的功能就是設置/proc/$PID/oom_score_adj中的值(範圍-1000~1000),系統經過該值和oom_score來決定kill進程的優先級。oom_score爲只讀文件,oom經過對系統全部進程的oom_score進行排序,值越大,越可能在內存不足時被kill掉。(參見linux oom機制分析和oom介紹)/proc/$PID/oom_adj /proc/$PID/oom_score /proc/$PID/oom_score_adj
能夠經過以下命令查看系統全部進程的oom_score網絡
ps -eo pid,comm,pmem --sort -rss | awk '{"cat /proc/"$1"/oom_score" | getline oom; print $0"\t"oom}'
selinuxLabel
:設置進程的SELinux 標籤,即MAC值Path Type /proc proc /sys sysfs /dev/pts devpts /dev/shm tmpfs
可使用resources字段來配置cgroup,注意:只有在須要更新cgroup的時候才配置該字段內容
"cgroupsPath": "/myRuntime/myContainer", "resources": { "memory": { "limit": 100000, "reservation": 200000 }, "devices": [ { "allow": false, "access": "rwm" } ] }
Device whitelist:用於配置設備白名單
Memory:具體能夠參見cgroup memory
CPU:具體能夠參見cgroup CPU
Block IO:
Huge page limits:
pageSize
:大頁大小Network:
name:網卡名稱
priority:網卡優先級
PIDs:
limit:cgroup限制的pid的數目
RDMA
Sysctl:容許在容器運行過程當中修改內核參數
Seccomp:在linux內核中爲應用提供了一種沙盒機制。更多參見seccomp
seccomp
defaultAction:seccomp的默認動做,容許值類型爲syscalls[].action
architectures:系統調用的平臺,以下
SCMP_ARCH_X86
SCMP_ARCH_X86_64
SCMP_ARCH_X32
SCMP_ARCH_ARM
SCMP_ARCH_AARCH64
SCMP_ARCH_MIPS
SCMP_ARCH_MIPS64
SCMP_ARCH_MIPS64N32
SCMP_ARCH_MIPSEL
SCMP_ARCH_MIPSEL64
SCMP_ARCH_MIPSEL64N32
SCMP_ARCH_PPC
SCMP_ARCH_PPC64
SCMP_ARCH_PPC64LE
SCMP_ARCH_S390
SCMP_ARCH_S390X
SCMP_ARCH_PARISC
SCMP_ARCH_PARISC6
syscalls:匹配seccomp的系統調用,該屬性可選
name:系統調用的名稱,至少有一個
action:seccomp的動做規則。libseccomp v2.3.2中以下:
SCMP_ACT_KILL
SCMP_ACT_TRAP
SCMP_ACT_ERRNO
SCMP_ACT_TRACE
SCMP_ACT_ALLOW
args:
index (uint, REQUIRED) - 系統調用的index
value (uint64, REQUIRED) - 系統調用參數的值
valueTwo (uint64, OPTIONAL) - 系統調用參數的值
op (string, REQUIRED) - 系統調用參數的動做。 libseccomp v2.3.2以下
SCMP_CMP_NE
SCMP_CMP_LT
SCMP_CMP_LE
SCMP_CMP_EQ
SCMP_CMP_GE
SCMP_CMP_GT
SCMP_CMP_MASKED_EQ
Rootfs Mount Propagation
rootfsPropagation:設置rootfs的mount Propagation類型,slave,private或shared
Masked Paths
maskedPaths:容器沒法讀取該設置的路徑
"maskedPaths": [
"/proc/kcore" ]
Readonly Paths
readonlyPaths:容器只讀該設置的路徑
TIPS:
參考:
https://cizixs.com/2017/11/05/oci-and-runc/
https://github.com/opencontainers/runtime-spec/blob/master/config.md
https://github.com/opencontainers/runtime-spec/blob/master/specs-go/config.go