1. 程式人生 > >Docker與Kubernetes系列(五): Docker的原理1_Linux Namespace

Docker與Kubernetes系列(五): Docker的原理1_Linux Namespace

šLinux Namespace 有如下種類,官方文件在這裡《Namespace in Operation

分類 系統呼叫引數 相關核心版本
Mount namespaces CLONE_NEWNS
šUTS namespaces CLONE_NEWUTS
IPC namespaces CLONE_NEWIPC
PID namespaces CLONE_NEWPID


  1. UTS: hostname
  2. IPC: 程序間通訊 
  3. PID: "chroot"程序樹
  4. NS: 掛載點,首次登陸Linux
  5. NET: 網路訪問,包括介面
  6. USER: 將本地的虛擬user-id對映到真實的user-id

主要是š三個系統呼叫

  • šclone() – 實現執行緒的系統呼叫,用來建立一個新的程序,並可以通過設計上述引數達到隔離。
  • šunshare() – 使某程序脫離某個namespace
  • šsetns() – 把某程序加入到某個namespace

二、幾種Namespace

clone()系統呼叫

首先,我們來看一下一個最簡單的clone()系統呼叫的示例,(後面,我們的程式都會基於這個程式做修改):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 #define _GNU_SOURCE #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <sched.h> #include <signal.h> #include <unistd.h> /* 定義一個給 clone 用的棧,棧大小1M */ #define STACK_SIZE (1024 * 1024) staticcharcontainer_stack[STACK_SIZE];
charconstcontainer_args[] = { "/bin/bash", NULL }; intcontainer_main(void* arg) { printf("Container - inside the container!\n"); /* 直接執行一個shell,以便我們觀察這個程序空間裡的資源是否被隔離了 */ execv(container_args[0], container_args); printf("Something's wrong!\n"); return1; } intmain() { printf("Parent - start a container!\n"); /* 呼叫clone函式,其中傳出一個函式,還有一個棧空間的(為什麼傳尾指標,因為棧是反著的) */ intcontainer_pid = clone(container_main, container_stack+STACK_SIZE, SIGCHLD, NULL); /* 等待子程序結束 */ waitpid(container_p