Docker 特性與原理
首先看看Docker提供了哪些特性:
交互式Shell:Docker可以分配一個虛擬終端并關聯到任何容器的標準輸入上,例如運行一個一次性交互shell 文件系統(tǒng)隔離:每個進程容器運行在完全獨立的根文件系統(tǒng)里 寫時復制:采用寫時復制方式創(chuàng)建根文件系統(tǒng),這讓部署變得極其快捷,并且節(jié)省內存和硬盤空間 資源隔離:可以使用cgroup為每個進程容器分配不同的系統(tǒng)資源 網絡隔離:每個進程容器運行在自己的網絡命名空間里,擁有自己的虛擬接口和IP地址 日志記錄:Docker將會收集和記錄每個進程容器的標準流(stdout/stderr/stdin),用于實時檢索或批量檢索 變更管理:容器文件系統(tǒng)的變更可以提交到新的映像中,并可重復使用以創(chuàng)建更多的容器。無需使用模板或手動配置從以上特性分別看實現原理
1. 交互式Shell
首先我們允許一個交互式的容器
$docker run -i -t <image name> /bin/bash
這樣就建立了一個到容器內的交互式連接,看到的是如下的命令行:
root@df3880b17407:/#
這里我們啟動了一個容器,以bash作為其根進程.
root@df3880b17407:/# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 18164 2020 ? S 06:06 0:00 /bin/bash
可以看到,在這個容器中,bash 的 PID為 1,而實體機平常情況下,是這樣的:
root@ubuntu:~# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 24716 2612 ? Ss Sep04 0:01 /sbin/init
大家都知道,所有進程的共同祖先都是 PID=1的進程
所以在容器中,所有以后創(chuàng)建的進程都是通過/bin/bash 創(chuàng)建的,PID=1的 bash是容器中所有進程的祖先理解了這點后,對容器的理解就很簡單了.
2. 文件系統(tǒng)隔離
對于一個正在運行的容器,其文件系統(tǒng)都是一個從根目錄開始的虛擬文件系統(tǒng),在容器中看到的是這樣的:
root@df3880b17407:/# ll /total 68drwxr-xr-x 2 root root 4096 Jul 22 22:51 bindrwxr-xr-x 2 root root 4096 Apr 10 22:12 bootdrwxr-xr-x 3 root root 4096 Jul 22 22:49 devdrwxr-xr-x 85 root root 4096 Sep 5 06:49 etcdrwxr-xr-x 2 root root 4096 Apr 10 22:12 homedrwxr-xr-x 16 root root 4096 Jul 22 22:50 libdrwxr-xr-x 2 root root 4096 Aug 12 03:30 lib64drwxr-xr-x 2 root root 4096 Jul 22 22:48 mediadrwxr-xr-x 2 root root 4096 Apr 10 22:12 mntdrwxr-xr-x 2 root root 4096 Jul 22 22:48 optdr-xr-xr-x 356 root root 0 Sep 5 06:06 procdrwx------ 2 root root 4096 Jul 22 22:51 rootdrwxr-xr-x 7 root root 4096 Sep 5 07:23 rundrwxr-xr-x 2 root root 4096 Aug 12 03:30 sbindrwxr-xr-x 2 root root 4096 Jul 22 22:48 srvdr-xr-xr-x 13 root root 0 Sep 5 06:06 sysdrwxrwxrwt 2 root root 4096 Sep 5 06:55 tmpdrwxr-xr-x 20 root root 4096 Sep 5 06:11 usrdrwxr-xr-x 19 root root 4096 Sep 5 06:11 var
其實真是情況是這樣的,容器中的文件系統(tǒng)都是掛載到了真是系統(tǒng)中的一個目錄下面.
/var/lib/docker/containers/<image-long-id>/rootfs
這個配置是怎么來的呢,其實所有容器的管理都是通過lxc來管理的,lxc的配置文件放在
/var/lib/docker/containers/<image-long-id>/config.lxc
文件中有字段表示容器掛載到哪個文件目錄, 比如我的是這樣的:
新聞熱點
疑難解答