一旦"程序"被執行起來,它就從磁盤上的二進制文件,變成node
一、計算機內存中的數據 二、寄存器裏的值 三、堆棧中的指令 四、被打開的文件 五、以及各類設備的狀態信息的一個集合。
像這樣一個程序運行起來後的計算機執行環境的綜合,就是咱們今天的主角:進程docker
一、就是經過約束和修改進程的動態表現,從而爲其創造出一個"邊界"ubuntu
二、Cgroups 技術是用來製造約束的主要手段bash
三、Namespace 技術則是用來修改進程視圖的主要方法。網絡
[root@luoahong ~]# docker run -it busybox /bin/sh Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 57c14dd66db0: Pull complete Digest: sha256:7964ad52e396a6e045c39b5a44438424ac52e12e4d5a25d94895f2058cb863a0 Status: Downloaded newer image for busybox:latest / # ps PID USER TIME COMMAND 1 root 0:00 /bin/sh 6 root 0:00 ps
請幫我啓動一個容器,在容器裏執行 /bin/sh,而且給我分配一個命令行終端跟這個容器交互性能
原本,每當咱們在宿主機上運行了一個 /bin/sh 程序,操做系統都會給他分配一個進程編號,好比PID=100
這個編號是進程的惟一標識,就像員工的工牌同樣,因此PID=100,能夠粗略地理解爲這個/bin/sh是咱們公司裏的第
100號員工,而第1號員工就天然是比爾 · 蓋茨這樣統領全局的人物。ui
而除了咱們剛剛用到的 PID Namespace,Linux操做系統還提供了 Mount、UTS、IPC、
Network 和 User 這些 Namespace用來對各類不一樣的進程上下文進行「障眼法」操做spa
其實是在建立容器進程時,指定了這個進程所須要啓用的一組 Namespace 參數。這樣,容器就只能「看」到當前
Namespace 所限定的資源、文件、設備、狀態,或者配置而對於宿主機以及其餘不相關的程序,它就徹底看不到了。操作系統
這時,這些進程就會以爲本身是各自 PID Namespace,裏的第 1 號進程,只能看到各自 Mount Namespace裏掛載命令行
用來對各類不一樣的進程上下文進行「障眼法」操做
Namespace 技術實際上修改了應用進程看待整個計算機"視圖"被操做系統作了限制,只能"看到"某些指定的內容
「敏捷」和「高性能」是容器相較於虛擬機最大的優點,也是它可以在 PaaS 這種更細粒度的資源管理平臺上大行其道的重要緣由
優勢:「敏捷」和「高性能」
缺點:隔離的不完全
不能被Namespace 化的資源和對象 好比時間
[root@luoahong container]# pwd /sys/fs/cgroup/cpu/container [root@luoahong container]# while : ; do : ; done & [1] 1447 [root@luoahong container]# cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us -1 [root@luoahong container]# cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us 100000 [root@luoahong container]# echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us [root@luoahong container]# echo 1447 > /sys/fs/cgroup/cpu/container/tasks
docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash $ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_period_us 100000 $ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_quota_us 20000
[root@k8s-master ~]# docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash root@beac9236771e:/# cd /sys/fs/cgroup/cpu/ root@beac9236771e:/sys/fs/cgroup/cpu# ls cgroup.clone_children cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat cpuacct.usage notify_on_release cgroup.event_control cpu.cfs_period_us cpu.rt_period_us cpu.shares cpuacct.stat cpuacct.usage_percpu tasks root@beac9236771e:/sys/fs/cgroup/cpu# cat cpu.cfs_period_us 100000 root@beac9236771e:/sys/fs/cgroup/cpu# cat cpu.cfs_quota_us 20000 root@beac9236771e:/sys/fs/cgroup/cpu# pwd /sys/fs/cgroup/cpu $ mount -l | grep tmpfs none on /tmp type tmpfs (rw,relatime) [root@k8s-master cpu]# mount -l | grep tmpfs devtmpfs on /dev type devtmpfs (rw,nosuid,size=1006112k,nr_inodes=251528,mode=755) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev) tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755) tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=203192k,mode=700)
這就意味着這個 Docker 容器,只能使用到 20% 的cpu帶寬