关于docker的理解随记

1.容器其实不是什么新技术,说白了就是namespace对资源进行隔离,再加UFS实现分层镜像,以及cgroup实现资源限制。这些技术,都是linux中已有的技术,并且有些技术很早以前就有了。html

2.上面说了,容器就是用了隔离+分层+限制技术,因此和虚拟机是彻底不一样的东西,虚拟机那是真真正正的一个操做系统。linux

3.在/roc/pid/ns下,保存着每个进程对应的namespace,一共6种,分别是:① 进程通讯ns(ipc)、② 挂载ns(mnt)、③pid ns、④网络ns(net)、⑤用户ns(user)、⑥隔离hostname和NIS domain name的uts。nginx

一个进程属于哪一个namespace,那么就创建一个连接到该namespace。好比下面,我有一个容器,它里面有两个进程,7344和7327:docker

$ docker top nginx  1 ↵
UID PID PPID C STIME TTY TIME CMD
root 7344 7327 0 22:07 pts/0 00:00:00 nginx: master process nginx -g daemon off;
101 7376 7344 0 22:07 pts/0 00:00:00 nginx: worker process

看一下这两个在同一个容器中的进程他们的namespace以及cgroup:shell

sudo ls -l /proc/7344/ns                                        2 ↵
total 0
lrwxrwxrwx 1 root root 0 Jan 16 22:08 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 16 22:08 ipc -> 'ipc:[4026532496]'
lrwxrwxrwx 1 root root 0 Jan 16 22:08 mnt -> 'mnt:[4026532494]'
lrwxrwxrwx 1 root root 0 Jan 16 22:07 net -> 'net:[4026532499]'
lrwxrwxrwx 1 root root 0 Jan 16 22:08 pid -> 'pid:[4026532497]'
lrwxrwxrwx 1 root root 0 Jan 16 22:08 pid_for_children -> 'pid:[4026532497]'
lrwxrwxrwx 1 root root 0 Jan 16 22:08 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 16 22:08 uts -> 'uts:[4026532495]'
udo ls -l /proc/7376/ns                                          ✔
total 0
lrwxrwxrwx 1 101 101 0 Jan 16 22:10 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 101 101 0 Jan 16 22:10 ipc -> 'ipc:[4026532496]'
lrwxrwxrwx 1 101 101 0 Jan 16 22:10 mnt -> 'mnt:[4026532494]'
lrwxrwxrwx 1 101 101 0 Jan 16 22:10 net -> 'net:[4026532499]'
lrwxrwxrwx 1 101 101 0 Jan 16 22:10 pid -> 'pid:[4026532497]'
lrwxrwxrwx 1 101 101 0 Jan 16 22:10 pid_for_children -> 'pid:[4026532497]'
lrwxrwxrwx 1 101 101 0 Jan 16 22:10 user -> 'user:[4026531837]'
lrwxrwxrwx 1 101 101 0 Jan 16 22:10 uts -> 'uts:[4026532495]'

发现是相同的,说明他们是在同一个namespace中的。segmentfault

 

而后咱们来看看普通的进程(容器外的),zsh和systemd这连个进程:网络

sudo ls -l /proc/1/ns                                           2 ↵
[sudo] password for xlinliu: 
total 0
lrwxrwxrwx 1 root root 0 Jan 16 22:06 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 16 22:06 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0 Jan 16 22:06 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 Jan 16 22:06 net -> 'net:[4026532000]'
lrwxrwxrwx 1 root root 0 Jan 16 22:06 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 16 22:06 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Jan 16 22:06 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 16 22:06 uts -> 'uts:[4026531838]'
ls -l /proc/$$/ns                                                 ✔
total 0
lrwxrwxrwx 1 xlinliu xlinliu 0 Jan 16 22:05 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 xlinliu xlinliu 0 Jan 16 22:05 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 xlinliu xlinliu 0 Jan 16 22:05 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 xlinliu xlinliu 0 Jan 16 22:05 net -> 'net:[4026532000]'
lrwxrwxrwx 1 xlinliu xlinliu 0 Jan 16 22:05 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 xlinliu xlinliu 0 Jan 16 22:05 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 xlinliu xlinliu 0 Jan 16 22:05 user -> 'user:[4026531837]'
lrwxrwxrwx 1 xlinliu xlinliu 0 Jan 16 22:05 uts -> 'uts:[4026531838]'

发现也是同样的,说明他们也是在赞成namespace下。另外咱们还能够看到有一个 pid_for_children ,这是什么呢?这是由于pid namespace是能够嵌套的,父级能够看到子级的进程的pid,但子级看不到父集,正式由于这样,因此咱们在宿主机中,是能够看到全部容器的进程的,而且每一个进程都有pid。 好比上面的nginx容器,他的CMD进程在容器里的pid是1,可是在宿主机中也能够看到它,pid是7344。dom

 

 

 

参考:spa

1 DOCKER基础技术:LINUX NAMESPACE(上) 以及 DOCKER基础技术:LINUX NAMESPACE(下)操作系统

Linux Namespace和Cgroup

DOCKER基础技术:AUFS

DOCKER基础技术:DEVICEMAPPER

linux 网络虚拟化: network namespace 简介

相关文章
相关标签/搜索