概述 容器化技术在当前云计算、微服务等体系下大行其道,而 Docker 便是容器化技术的典型,对于容器化典型的技术,我们有必要弄懂它,所以这篇文章,我会来分析下 Docker 是如何实现隔离技术。..

一、Docker隔离技术实现
1.1 概述
容器化技术在当前云计算、微服务等体系下大行其道,而 Docker 便是容器化技术的典型,对于容器化典型的技术,我们有必要弄懂它,所以这篇文章,我会来分析下 Docker 是如何实现隔离技术的,Docker 与虚拟机又有哪些区别呢?接下来,我们开始逐渐揭开它的面纱。
1.2 从运行一个容器开始
我们开始运行一个简单的容器,这里以 busybox 镜像为例,它是一个常用的Linux工具箱,可以用来执行很多Linux命令,我们以它为镜像启动容器方便来查看容器内部环境。 执行命令: docker run -it --name demo_docker busybox /bin/sh 这条命令的作用是:启动一个 busybox 镜像的 Docker 容器。-it 参数表示给容器提供一个输入/输出的交互环境(TTY)。/bin/sh 表示容器交互运行的命令或程序。
1.3 进程的隔离
执行成功后我们就会进入到了 Docker 容器内部,我们执行 ps -ef 查看进程
1 | / # ps -ef |
root 5866 5642 0 01:19 pts/4 00:00:00 /usr/bin/docker-current run -it –name demo_docker busybox /bin/sh
1 | root 5952 5759 0 01:20 pts/11 00:00:00 grep --color=auto busybox |
这里我们可以知道,对于宿主机```bash docker run执行命令启动的只是一个进程,它的```bash
pid
1 | Namespace |
这里我们看到输出在宿主机看来,这个程序的```bash PID是bash 6061 `,在克隆的子进程来看,它的bash
PID
1,我们执行```bash ps -ef查看一下进程列表```bash
1 | [root luozhou]# ps -ef |
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 01:46 pts/2 00:00:00 /bin/bash
root 10 1 0 01:48 pts/2 00:00:00 ps -ef
我们发现确实只有容器内部的进程在运行了,再执行```bash top命令```bash
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 115576 2112 1628 S 0.0 0.1 0:00.00 bash
11 root 20 0 161904 2124 1544 R 0.0 0.1 0:00.00 top
1 | 结果也只有2个进程的信息。 |
overlay /var/lib/docker/overlay2/9c9318031bc53dfca45b6872b73dab82afcd69f55066440425c073fe681109d3/merged overlay rw,context=”system_u:object_r:container_file_t:s0:c740,c923”,relatime,lowerdir=/var/lib/docker/overlay2/l/FWESUOVO6DYTXBBJIQBPUWLN6K:/var/lib/docker/overlay2/l/XPKQU6AMUX3AKLAX2BR6V4JQ3R,upperdir=/var/lib/docker/overlay2/9c9318031bc53dfca45b6872b73dab82afcd69f55066440425c073fe681109d3/diff,workdir=/var/lib/docker/overlay2/9c9318031bc53dfca45b6872b73dab82afcd69f55066440425c073fe681109d3/work 0 0
这里```bash overlay挂载并没有和容器id关联起来,所以我们直接根据容器id是找不到bash `挂载信息的,这里借助了bash
context去关联的,所以我们通过```bash就找到了我们挂载的地址啦。我们进入目录看看结果```bash
1 | [root l]# ls /var/lib/docker/overlay2/9c9318031bc53dfca45b6872b73dab82afcd69f55066440425c073fe681109d3/merged |
bin dev etc home proc root run sys tmp usr var
1 | 我们发现这个和我们容器的目录是一致的,我们在这个目录下创建一个新的目录,然后看看容器内部是不是会出现新的目录。  |
100000
1 | [root]# cat cpu.cfs_quota_us |
20000
发现这里我们的容器启动设置参数一样,也就是说通过这里的文件值来限制容器的cpu使用情况。这里需要注意的是,不同的Linux版本 Docker Cgroup 文件位置可能不一样,有些是在 `/sys/fs/cgroup/cpu/docker/ID/` 下。
#### 1.6 与传统虚拟机技术的区别
经过前面的进程、文件系统、资源限制分析,详细各位已经对 Docker 的隔离原理有了基本的认识,那么它和传统的虚拟机技术有和区别呢?这里贴一个网上的Docker和虚拟机区别的图
这张图应该可以清晰的展示了虚拟机技术和 Docker 技术的区别了,虚拟机技术是完全虚拟出一个单独的系统,有这个系统去处理应用的各种运行请求,所以它实际上对于性能来说是有影响的。而 Docker 技术 完全是依赖 Linux 内核特性 Namespace 和Cgroup 技术来实现的,本质来说:你运行在容器的应用在宿主机来说还是一个普通的进程,还是直接由宿主机来调度的,相对来说,性能的损耗就很少,这也是 Docker 技术的重要优势。
Docker 技术由于 还是一个普通的进程,所以隔离不是很彻底,还是共用宿主机的内核,在隔离级别和安全性上没有虚拟机高,这也是它的一个劣势。
#### 1.7 总结
这篇文章我通过实践来验证了 Docker 容器技术在进程、文件系统、资源限制的隔离原理,最后也比较了虚拟机和 Docker 技术的区别,总的来说 Docker技术由于是一个普通的宿主机进程,所以具有性能优势,而虚拟机由于完全虚拟系统,所以具备了高隔离性和安全性的优势,两者互有优缺点。不过容器化是当下的趋势,相信随着技术的成熟,目前的隔离不彻底的问题也能解决,容器化走天下不是梦。
http://people.redhat.com/vgoyal/papers-presentations/vault-2017/vivek-overlayfs-and-containers-presentation-valult-2017.pdf
https://docs.docker.com/v17.09/engine/userguide/storagedriver/overlayfs-driver/
https://lwn.net/Articles/259217
本文标题: Docker是如何实现隔离
发布时间: 2021年09月29日 00:00
最后更新: 2025年12月30日 08:54
原始链接: https://haoxiang.eu.org/85df6954/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

