首页 >> 评测 >> Namespace、Cgroup和rootfs三大实是组成Docker

Namespace、Cgroup和rootfs三大实是组成Docker

2025-11-16 12:16:15

077) │ │ ├─{go}(23059) │ │ ├─{go}(23060) │ │ ├─{go}(23061) │ │ ├─{go}(23074) │ │ └─{go}(23079)

负载近期的PID

# echo $$23078

验证一下从父近期和三子近期到底在同一UTC Namespace

# readlink /proc/23075/ns/utsuts:[4026531838]# readlink /proc/23078/ns/utsuts:[4026532284]

可以看见它们无论如何亦然同一个UTC Namespace中都。

由于UTC Namespace对hostname继续做了受控,所以在这个生态系统中都简化hostname确实不严重影响直接游戏机。

在shell生态系统下发布立即

# hostname -b golang# hostnamegolang

在直接生态系统下发布立即

# hostnamecontainer

可以看见,直接的hostname无论如何未被氢心的简化严重影响到。

1.2、IPC Namespace

IPC全名是为Inter-Process Communication,是Unix/Linux下近期通信的一种方式则,IPC有共享内存、信号量、消息队列等法则。为了受控近期,也不可把ipc Namespace受控开,这样,只有同一个定名自由空数间下的近期才必须互相通信。

package mainimport ( "os" "os/exec" "syscall")func main() { cmd := exec.Command("sh") cmd.SysProcAttr = Maxsyscall.SysProcAttr{ Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC, } cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { panic(err) }}

我们在先之前的code极少继续做一点删去,减低CLONE_NEWIPC,希望始创IPC Namespace。

在宿游戏机上打开一个shell

# 检视现阶段的ipc Message Queues# ipcs -q源泉源泉 Message Queues 源泉源泉--key msqid owner perms used-bytes messages# 在1]始创一个ipc的队列,队列id为0# ipcmk -QMessage queue id: 0# 检视刚刚一完工后的1]队列的讯息# ipcs -q源泉源泉 Message Queues 源泉源泉--key msqid owner perms used-bytes messages0xad7e5e0d 0 root 644 0 0

然后,我们于是又可执行main.go,在sh下检视ipc队列

# go run main.gosh# ipcs -q源泉源泉 Message Queues 源泉源泉--key msqid owner perms used-bytes messages

可以看见,在一新始创的Namespace看不到宿游戏机仍然始创的message queue。比如说,在一新始创的Namespace底下始创的队列,在1]中都也无法看见。

1.3、PID Namespace

PID Namespace是用来受控近期ID的,同一个近期,在Namespace底下和在直接有着各不相同的近期PID。

package mainimport ( "os" "os/exec" "syscall")func main() { cmd := exec.Command("sh") cmd.SysProcAttr = Maxsyscall.SysProcAttr{ Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID, } cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { panic(err) }}

掺入一个CLONE_NEWPID,代表fork出来的三子近期始创自己的PID Namespace。

用pstree -pl在宿游戏机上检视近期柏树,见到相符的PID,然后在PID Namespace扫描PID

# 一个shell中都行驶# go run main.gosh# echo $$1# 另一个shell中都检视近期柏树# pstree -plsshd(1194)─┬─sshd(22904)───bash(22915)───go(23192)─┬─main(23212)─┬─sh(23215)

可以看见在PID Namespace扫描PID为1,理论上23212这个PID被等价为1。

这底下不可用ps检视,因为ps和top等立即是采用 /proc的素材。

1.4、Mount Namespace

应用程序行驶时可以将机腹点和系统会分离,采用这个功能性,我们可以达到chroot的功能性。

Mount Namespace用来受控各个近期看见的机腹点网格,在各不相同的Namespace的近期中都,看见的缓存会的层次是不一样的。

在Mount Namespace中都加载mount()和unmount()极少极少只但会严重影响近期Namespace内的缓存会,对1]缓存会是不严重影响的。

package mainimport ( "os" "os/exec" "syscall")func main() { cmd := exec.Command("sh") cmd.SysProcAttr = Maxsyscall.SysProcAttr{ Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS, } cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { panic(err) }}

比如说减低一点小删去syscall.CLONE_NEWNS,然后行驶code,检视/proc的机密文件素材。

# ls /proc1 15766 16043 20 22915 23456 27601 43 8050 crypto kallsyms mounts sys10 15770 16061 20803 23 23498 27889 44 828 devices kcore mtrr sysrq-trigger1045 15782 16079 20822 23192 235 27999 45 9 diskstats keys net sysvipc1051 15800 16097 20878 23212 23521 30 46 94 dma key-users pagetypeinfo timer_list1061 15887 16115 20882 23215 23524 31 468 955 driver kmsg partitions timer_stats1062 15906 1612 20896 233 23526 31770 472 957 execdomains kpagecount sched_debug tty11 15907 16185 20914 23339 236 32 478 acpi fb kpageflags schedstat uptime1194 15908 17 20999 23387 24 33 540 buddyinfo filesystems loadavg scsi version13 15910 18 21 234 241 350 59 bus fs locks self vmallocinfo14 15999 19 22 23442 247 372 6 cgroups interrupts mdstat slabinfo vmstat15 16 19352 227 23444 257 4 7 cmdline iomem meminfo softirqs zoneinfo15750 16012 19898 22900 23446 258 403 760 consoles ioports misc stat15754 16021 2 22904 23453 27588 41 8 cpuinfo irq modules swaps

因为这底下的/proc还是宿游戏机的,所以我们用mount到Namespace底下

# mount -t proc proc /proc# ls /proc1 devices ioports locks sched_debug sysvipc4 diskstats irq mdstat schedstat timer_listacpi dma kallsyms meminfo scsi timer_statsbuddyinfo driver kcore misc self ttybus execdomains keys modules slabinfo uptimecgroups fb key-users mounts softirqs versioncmdline filesystems kmsg mtrr stat vmallocinfoconsoles fs kpagecount net swaps vmstatcpuinfo interrupts kpageflags pagetypeinfo sys zoneinfocrypto iomem loadavg partitions sysrq-trigger

可以看见,二进制少了很多,这样就必须行驶ps立即了

# ps -efUID PID PPID C STIME TTY TIME CMDroot 1 0 0 13:53 pts/1 00:00:00 shroot 5 1 0 13:59 pts/1 00:00:00 ps -ef

可以看见,sh近期时PID为1的近期,近期Mount Namespace的mount和直接自由空数间是受控的。

1.5、User Namespace

User Namespace主要是受控Gmail的Gmail四组ID,理论上,一个近期的User ID和Group ID在定名自由空数间皆可以是各不相同的。

比如,在宿游戏机上以一个非rootGmail始创的User Namespace,在User Namespace底下被等价为rootGmail。

package mainimport ( "os" "os/exec" "syscall")func main() { cmd := exec.Command("sh") cmd.SysProcAttr = Maxsyscall.SysProcAttr{ Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER, } cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { panic(err) }}

比如说减低syscall.CLONE_NEWUSER。

首先以rootGmail行驶应用程序

# 检视近期Gmail和Gmail四组# iduid=0(root) gid=0(root) groups=0(root)

我的系统会是CentOS7,所以在可执行之前不可继续做一些兼职。

# 不可开启User Namespace# grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"# 重启# reboot# echo 640> /proc/sys/user/max_user_namespaces

以后就可以正常行驶应用程序了

# go run main.gosh$ iduid=65534 gid=65534 groups=65534

可以看见,它们的UID各不相同,所述User Namespace生效了。

1.6、Network Namespace

Network Namespace用以受控网络自然资源(/proc/net、IP地址端口、调制解调器、路由等),让每个桶内都有自己统一的(各种并不一定)网络电可选,每个网络定名自由空数间都有自己的队列,iptables。

package mainimport ( "log" "os" "os/exec" "syscall")func main() { cmd := exec.Command("sh") cmd.SysProcAttr = Maxsyscall.SysProcAttr{ Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWUSER | syscall.CLONE_NEWNET, } cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { panic(err) }}

首先在宿游戏机上检视自己的网络电可选

# ifconfigeth0: flags=4163 mtu 1500 inet 172.27.158.184 netmask 255.255.240.0 broadcast 172.27.159.255 inet6 fe80::216:3eff:fe19:d2fc prefixlen 64 scopeid 0x20 ether 00:16:3e:19:d2:fc txqueuelen 1000 (Ethernet) RX packets 4583 bytes 3471561 (3.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 2986 bytes 1983980 (1.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1000 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

可以看见有eth0和lo网络电可选,然后行驶应用程序

# go run main.gosh$ ifconfigsh$

我们辨认出,在Network Namespace底下什么网络电可选都未,这样Network Namespace和宿游戏机二者之数间网络是受控的。

二、Linux Cgoups

Linux Cgoups全名是是Linux Control Group,它的主要作用就是放宽一个近期四组必须采用的自然资源上限,包内括CPU、内存、磁盘、网络等。

在Linux中都,Cgroups给Gmail曝露出来的可用连接器是缓存会,即它以机密文件和清单的方式则四该组织在/sys/fs/cgroup正向下。

# mount -t cgroupcgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)

可以看见,在/sys/fs/cgroup上头有很多cpu、memory这样的三子清单,也就称作三可选会subsystem,它是一四组自然资源操纵可选,一般相关联如下几项:

net_cls:将cgroup中都近期诱发的网络包内定义,以便Linux的tc(traffic controller)可以根据定义区别出来自某个cgroup的包内并继续做限流或监视net_prio:另设cgroup中都近期诱发的网络流量的可用性memory:操纵cgroup中都近期的内存征用cpuset:在多氢机器上另设cgroup中都近期可以采用的cpu和内存freezer:挂起起(suspend)和完全恢复(resume)cgroup中都的近期blkio:另设对块电可选(如SSD)输入负载的访问操纵cpu:另设cgroup中都近期的CPU征用cpuacct:总和cgroup中都近期的CPU征用devices:操纵cgroup中都近期对电可选的访问2.1、机腹cgroup

我们始创并机腹一个cgroup

# mkdir cgroup-test# mount -t cgroup -o none,name=cgroup-test cgroup-test ./cgroup-test# ls ./cgroup-test/cgroup.clone_children cgroup.event_control cgroup.procs cgroup.sane_behavior notify_on_release release_agent tasks

机腹后我们能看见系统会在这个清单下聚合了一些可选的机密文件:

cgroup.clone_children:cpuset的subsystem但会加载这个装配机密文件,如果这个值是1(可选是0),三子cgroup才但会承袭从父cgroup的cpuset的装配cgroup.event_control:监视状态变化和四组删除事件的装配机密文件cgroup.procs:柏树中都近期节点cgroup的近期四组IDnotify_on_release和release_agent:notify_on_release上标这个cgroup最后一个近期引退时到底可执行了release_agent,release_agent则是一个正向,一般而言用作近期引退后修整不于是又采用的cgrouptask:上标该cgroup下的近期ID,如果把一个近期ID擦除tasks机密文件中都,便但会将相应的近期自四组到这个cgroup中都2.2、一完工后三子cgroup# mkdir cgroup-1# mkdir cgroup-2# lscgroup-1 cgroup.clone_children cgroup.procs notify_on_release taskscgroup-2 cgroup.event_control cgroup.sane_behavior release_agent# tree.├── cgroup-1│ ├── cgroup.clone_children│ ├── cgroup.event_control│ ├── cgroup.procs│ ├── notify_on_release│ └── tasks├── cgroup-2│ ├── cgroup.clone_children│ ├── cgroup.event_control│ ├── cgroup.procs│ ├── notify_on_release│ └── tasks├── cgroup.clone_children├── cgroup.event_control├── cgroup.procs├── cgroup.sane_behavior├── notify_on_release├── release_agent└── tasks

在机腹清单下始创机密驱动器时,Unix会但会把机密驱动器标示出为三子cgroup,但会承袭从父cgroup的特性

2.3、掺入近期

把近期ID擦除到cgroup节点的tasks机密文件中都

[cgroup-1]# echo $$1186[cgroup-1]# sh -c "echo $$>> tasks"[cgroup-1]# cat /proc/1186/cgroup12:name=cgroup-test:/cgroup-111:pids:/10:devices:/9:cpuacct,cpu:/8:blkio:/7:hugetlb:/6:freezer:/5:perf_event:/4:cpuset:/3:memory:/2:net_prio,net_cls:/1:name=systemd:/user.slice/user-0.slice/session-1.scope

可以看见,近期近期1186仍然被自四组到cgroup-test:/cgroup-1中都了

2.4、放宽自然资源

我们来写一个脚本

# while : ; do : ; done Max[1] 1448

采用top立即检视,可以看见CPU仍然填满

# top%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

然后我们通过cgroup放宽这个近期自然资源

# mount | grep cpucgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)# cd /sys/fs/cgroup/cpu# lsaegis cgroup.event_control cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us notify_on_releaseassist cgroup.procs cpuacct.usage cpu.cfs_quota_us cpu.shares release_agentcgroup.clone_children cgroup.sane_behavior cpuacct.usage_percpu cpu.rt_period_us cpu.stat tasks# 始创一个cgroup# mkdir test-limit-cpu MaxMax cd test-limit-cpu/# 另设cpu征用容量,并不一定在每100ms时数间内,该近期不可采用20ms的CPU时数间# echo 20000> cpu.cfs_quota_us# 将近期近期掺入进cgroup中都# echo 1448> tasks

通过top立即检视

# top%Cpu(s): 20.5 us, 0.7 sy, 0.0 ni, 78.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

可以看见计算机的CPU采用率立刻翻倍了20%。

2.5、Docker采用Cgroup

Linux Cgroup的设计者还是比较非常简单的,就是在三子清单系统会缘故一四组放宽自然资源机密文件的四组合。而对于Docker来说,只不可在每个三可选会上头,为每个桶内始创一个操纵四组(一完工后清单),然后在启动桶内近期后,把这个近期的PID发给到对应操纵四组的tasks机密文件中都即可。

# docker run -itd -m 128m busybox3da89b011026f40a22b22c9b9b8e15e5fb85045c6aa72f7b54406f141cd63157# cd /sys/fs/cgroup/memory/docker/3da89b011026f40a22b22c9b9b8e15e5fb85045c6aa72f7b54406f141cd63157/# cat memory.limit_in_bytes134217728

可以看见,Docker通过为每个桶内始创cgroup,并通过cgroup去装配自然资源放宽和自然资源监视。

2.6、应用程序付诸package mainimport ( "fmt" "io/ioutil" "os" "os/exec" "path" "strconv" "syscall")const cgroupMountPath = "/sys/fs/cgroup/cpu"func main() { if os.Args[0] == "/proc/self/exe" { // 桶内近期 fmt.Printf("current pid %d", syscall.Getpid()) cmd := exec.Command("sh", "-c", "while : ; do : ; done") cmd.SysProcAttr = Maxsyscall.SysProcAttr{} cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() if err != nil { panic(err) } } cmd := exec.Command("/proc/self/exe") cmd.SysProcAttr = Maxsyscall.SysProcAttr{ Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS, } cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Start() if err != nil { panic(err) } // 想得到fork出来近期等价在直接定名自由空数间的pid fmt.Printf("%v", cmd.Process.Pid) // 在系统会可选始创机腹了 cpu subsystem 上始创cgroup pidCgroup := path.Join(cgroupMountPath, "testcpulimit") os.Mkdir(pidCgroup, 0775) // 将桶内近期自四组到这个cgroup中都 ioutil.WriteFile(path.Join(pidCgroup, "tasks"), []byte(strconv.Itoa(cmd.Process.Pid)), 0644) // 放宽cgroup采用 ioutil.WriteFile(path.Join(pidCgroup, "cpu.cfs_quota_us"), []byte("20000"), 0644) cmd.Process.Wait()}

通过对cgroup的装配,将桶内中都sh近期的CPU征用放宽到了20ms(20%)。

# top%Cpu(s): 26.4 us, 1.4 sy, 0.0 ni, 72.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND2668 root 20 0 113284 1208 1028 R 20.0 0.1 0:17.37 sh三、Union File System

Union File System简称是UnionFS,把其他缓存会联合到一个联合机腹点的缓存会服务项目。

可能你但会对之之前写到的Mount Namespace诱发误用,Mount Namespace是桶内近期对缓存会"机腹点"的本质,这就并不一定,只有机腹这个可用发生后,近期的网格才但会被改变。在此之之前,一新始创的桶内但会直接承袭宿游戏机的各个机腹点。

3.1、chroot

在LinuxUnix会中都,chroot立即可以change root file system,即改变近期的源机密文件到你选定的右边。

它的采用法则也很非常简单。

假设,我们如今有一个$HOME/test清单,一定会把它作为/bin/bash近期的源机密文件

1、首先始创一个test清单和几个lib机密驱动器

# mkdir -p test# mkdir -p test/{bin,lib64,lib}

2、把bash立即拷贝到test清单下的bin正向下

# cp -v /bin/{bash,ls} $HOME/test/bin‘/bin/bash’ -> ‘/root/test/bin/bash’‘/bin/ls’ -> ‘/root/test/bin/ls’

3、把bash立即不可的所有so机密文件拷贝到对应的lib正向下。可以采用ldd立即见到so机密文件

# T=$HOME/test# list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')"# for i in $list; do cp -v "$i" "${T}${i}"; done

4、最后可执行chroot立即,把$HOME/test清单作为/bin/bash近期的源机密文件

# chroot $HOME/test /bin/bash

这时,可执行./bin/ls /立即,就但会看见返回的是$HOME/test清单下的素材,而不是宿游戏机的素材。

对于被chroot的近期来说,它察觉到自己的源机密文件仍然被简化了

3.2、aufs

aufs全名是是Advanced Multi-Layered Unification Filesystem,主要功能性就是将多个各不相同右边的清单联合机腹到同一个清单下。

例如,有两个机密驱动器A和B,他们分别有两个机密文件

# tree.├── A│ ├── a│ └── x└── B ├── b └── x

然后,用联合机腹的方式则,将这两个清单机腹到公共清单C上

# mkdir C# mount -t aufs -o dirs=./A:./B none ./C# tree ./C./A├── a├── b└── x3.3、docker采用的aufs

检视docker采用的存储器

# docker info Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs Cgroup Version: 1

可以看见docker采用的是overlay2,docker在Linux上共享几种存储器驱动应用程序:

Driver

叙述

overlay2

是所有支持者的Linux免费软件的首选存储器驱动应用程序

fuse-overlayfs

极少适用范围于不共享rootless支持者的游戏机上行驶docker

btrfs和zfs

允许文职选项,如始创“快照”

vfs

为了检测,并不可采用任何写时粘贴,机动性较负,一般不用以生产厂

aufs

适用范围于ubuntu18.06或格外早新版本

deviemapper

不可direct-lvm,零装配但机动性负,是以之前的CentOS和RHEL中都的存储器驱动应用程序

overlay

上新overlay驱动应用程序用以不支持者“multiple-lowerdir”功能性的Linux

我们拉取比如说然后检视

# docker pull centos# docker image inspect centos"GraphDriver": { "Data": { "MergedDir": "/var/lib/docker/overlay2/25b7b27521d0dfa478b9173e0f39b726d914cebfb12a011d97093bf79f48201a/merged", "UpperDir": "/var/lib/docker/overlay2/25b7b27521d0dfa478b9173e0f39b726d914cebfb12a011d97093bf79f48201a/diff", "WorkDir": "/var/lib/docker/overlay2/25b7b27521d0dfa478b9173e0f39b726d914cebfb12a011d97093bf79f48201a/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59" ] }

此时于是又rootfs的layers只有一层,最后,以centos比如说为基础比如说,始创一个changed-centos的比如说。

FROM centosRUN echo "Hello World"> /tmp/newfile

然后编译比如说

# docker build -t changed-centos .Sending build context to Docker daemon 5.632kBStep 1/2 : FROM centos 源泉> 5d0da3dc9764Step 2/2 : RUN echo "Hello World"> /tmp/newfile 源泉> Running in 56f851769616Removing intermediate container 56f851769616 源泉> 9c6d811a36cdSuccessfully built 9c6d811a36cdSuccessfully tagged changed-centos:latest

然后检视聚合的比如说讯息

# docker image inspect changed-centos"GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/25b7b27521d0dfa478b9173e0f39b726d914cebfb12a011d97093bf79f48201a/diff", "MergedDir": "/var/lib/docker/overlay2/1962f3c14c7b78c087c80042cd0076686137a2bf4ae4d989d797813569a895a0/merged", "UpperDir": "/var/lib/docker/overlay2/1962f3c14c7b78c087c80042cd0076686137a2bf4ae4d989d797813569a895a0/diff", "WorkDir": "/var/lib/docker/overlay2/1962f3c14c7b78c087c80042cd0076686137a2bf4ae4d989d797813569a895a0/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59", "sha256:4f3b7a0aae6d9b57d111bd1eb2e99ca900a36e2370b47266859e6ca4d97dd1f0" ] }

可以看见layers一自订一层

# docker history changed-centosIMAGE CREATED CREATED BY SIZE COMMENT9c6d811a36cd 2 minutes ago /bin/sh -c echo "Hello World"> /tmp/newfile 12B 5d0da3dc9764 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B 3 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB

从负载中都可以看见,image layer最上层极少12B大小,理论上changed-centos比如说极少征用了12B的磁盘自由空数间。

四、总结

本文主要介绍了Docker行驶的三大基石:Namespace、Cgroup和rootfs。

认识到这些素材就必须清晰地忘记docker和各种并不一定机的区别了,理论上行驶在Docker底下的近期仍然不可宿游戏机的支持者,比如Linux新版本等。

武汉专业治疗精神病医院
盘锦治疗精神病医院
长春治疗皮肤病最好的医院
天津整形美容
痤疮食疗
近视
急支糖浆和强力枇杷露哪个好
宝宝流鼻血

上一篇: Log Structured Merge Trees(LSM) 数学模型

下一篇: 阿里又出真的啦

相关阅读
每经热评丨“印钞生娃”可能造成极大的新问题

每经评论家 杜恒峰在最近公开配布的一份万字厚度研究课题中,任泽平敦促“国际货币基金组织印钞2万亿建立不育基金会”,以大幅提高“10年多生5000万人口”的目标,纾缓理论上中华人

2025-11-16 00:16:15
百度又一甜宠剧未播先火,高颜值CP太养眼,看到男主:全网心动!

更进一步有很多甜宠剧都紧接著的播出,像《今夕何夕》和《狼臣子》都是深受影迷青睐的甜宠剧,更是是《狼臣子》,李沁、王大陆和肖战在剧中的令人难忘显出让影迷看完还就让看。今日《狼臣子》还在在在模拟器红

2025-11-16 00:16:15
勇夺年度B级车出货量冠军,凯美瑞才是YYDS

制单单的2.5L Dynamic Force Engine涡轮引擎,该涡轮引擎绝热来得高达40%,增压器13:1;凯美瑞双擎搭载的同款涡轮引擎,但增压器降低至14:1,绝热降低至41%,虽然是大自然吸

2025-11-16 00:16:15
小米这次终于要眼看了?

拍电影天空都是饱和度相当高的风格。但瓜子12 Pro拍电影出来的相片,宽容度反而要更高一点警惕看对面绿的部分,机哥这大当中午艳阳高照拍电影的三幅。相对来说,瓜

2025-11-16 00:16:15
向更高目的进发

原标题:向更高目的进发 国家会展里面心(杭州),观众与进韩光吉祥物“进宝”合影留念。进韩光显出了现状新一轮性停止使用的竭力,始终如一了里面外投资者信心。 本报记者

2025-11-16 00:16:15