首页 > 网站 > 建站经验 > 正文

Docker 特性与原理详细介绍与解析

2019-11-02 16:14:48
字体:
来源:转载
供稿:网友

Docker 特性与原理

首先看看Docker提供了哪些特性:

交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell 文件系统隔离:每个进程容器运行在完全独立的根文件系统里 写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间 资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源 网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址 日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索 变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置

从以上特性分别看实现原理

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的进程

所以在容器中,所有以后创建的进程都是通过/bin/bash 创建的,PID=1的 bash是容器中所有进程的祖先理解了这点后,对容器的理解就很简单了.

2. 文件系统隔离

对于一个正在运行的容器,其文件系统都是一个从根目录开始的虚拟文件系统,在容器中看到的是这样的:

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

其实真是情况是这样的,容器中的文件系统都是挂载到了真是系统中的一个目录下面.

/var/lib/docker/containers/<image-long-id>/rootfs

这个配置是怎么来的呢,其实所有容器的管理都是通过lxc来管理的,lxc的配置文件放在

/var/lib/docker/containers/<image-long-id>/config.lxc

文件中有字段表示容器挂载到哪个文件目录, 比如我的是这样的:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表