本节所要实现的功能是改变init程序的执行路径,并且实现容器文件系统与镜像的隔离.
记得在NewParentProcess函数的cmd那里加一句
cmd.Dir = "/root/busybox"本节的目的是进一步进行容器与镜像的隔离.使得在容器内对文件系统的操作不会影响到镜像
上一节我们通过pivot_root实现了把init初始进程的文件系统换为宿主机的/root/busybox目录,但问题是,在容器内对文件系统进行修改的时候,宿主机下的目录也会发生改变,达不到隔离效果.
alex@alex:~/writeDocker$ sudo ./writeDocker run -ti sh [sudo] password for alex: {"level":"info","msg":"init come on","time":"2019-10-01T14:26:00Z"} {"level":"info","msg":"command all is sh","time":"2019-10-01T14:26:00Z"} {"level":"info","msg":"Current location is /root/busybox","time":"2019-10-01T14:26:00Z"} {"level":"info","msg":"Find path /bin/sh","time":"2019-10-01T14:26:00Z"} # ls bin dev etc home proc root sys tmp usr var # mkdir alex # ls alex bin dev etc home proc root sys tmp usr var # exit sh: 7: Cannot set tty process group (No such process) alex@alex:~/writeDocker$ sudo su root@alex:/home/alex/writeDocker# cd /root/busybox root@alex:~/busybox# ls alex bin dev etc home proc root sys tmp usr var其实root/busybox就是容器的镜像层,如果多个容器的共享一个镜像层,会造成容器之间互相看到对方的文件.我们使用AUFS来解决这个问题.
AUFS是一种联合挂载文件系统. 只可读的busybox作为镜像层,然后创建一个可读写的writeLayer作为容器层,所有容器的操作都会发生在容器层. 然后创建mnt文件夹作为挂载点,
设当前根目录为/aufs 然后在容器内创建一个test.txt,再看看writeLayer和busybox文件夹有什么变化
# touch test.txt # ls bin dev etc home proc root sys test.txt tmp usr var root@alex:/aufs# ls busybox busybox.tar mnt writeLayer root@alex:/aufs# cd busybox root@alex:/aufs/busybox# ls bin dev etc home proc root sys tmp usr var root@alex:/aufs/busybox# cd ../writeLayer root@alex:/aufs/writeLayer# ls test.txt root@alex:/aufs/writeLayer# cd ../mnt root@alex:/aufs/mnt# ls bin dev etc home proc root sys test.txt tmp usr var可以看到busybox作为只读层,(镜像层),其实是不会变化的,而在读写层的writeLayer,就会保存着修改/新建的文件. 那么实际上容器的文件系统是挂载在/mnt这个文件夹里面的,这个文件夹使用AUFS联合挂载了/writeLayer与/busybox.
然后在退出容器的时候,会删除mnt与writeLayer这两个中间文件夹.而作为镜像层的busybox不会发生改变
https://www.jianshu.com/p/ecbdcc98db76