Docker内核技术原理之Namespace
Docker的空间隔离使用的是namespace(空间),它是内核提供的一种空间隔离,在一个空间下,每个进程看到的视图是一致的,相应的如果不在一个空间下看到资源视图是不一致的,举个例子,如果两个进程在同一个网络命令空间下,那么他们看到的网络信息(网卡、IP、路由等)是一样的,可以通过localhost的方式互相访问。常用的有6种namespace,在Linux 内核4.6之后又添加了Cgroup这namespace,5.6 之后又添加了时钟namespace。
这里有个小细节,上面表格创建Mount Namespace的系统调用参数是CLONE_NEWNS,而不是CLONE_NEWMOUNT。从字面理解是创建一个命名空间的意思,这是由于历史原因导致的,因为Mount Namespace是第一个namespace,内核的开发者可能也没有预料到后续还有其它的namespace的加入,所以就先把CLONE_NEWNS给占用了。
可见,namespace的隔离其实并不充分,除了上面的隔离能力,其他的都一样。譬如,时钟在内核5.6版本之前,所有容器和操作系统都共享同一个时钟,如果修改了操作系统的时间,所有容器都时间都会变化。
namespace实现原理也非常简单,每个进程(task_struct)都有一个关于namespace的属性nsproxy,表示自己所属的namespace。
struct task_struct { ... /* namespaces */ struct nsproxy *nsproxy;
其中的nsproxy就是指向各种namespace的一个代理。如下所示:
当新进程被创建后会继承其父进程的namespace,这就是为啥一个容器里面的所有进程都共享namespace。在Linux集群上面,通过读取“/proc/进程ID/ns/”下的文件可以获取到每个进程对应的namespace。
(版权归原作者所有,侵删)
本文链接:http://www.yunweipai.com/40097.html
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/84003.html
Dockerlinux相关文章
- Docker常见的几个问题处理
- 修改Docker容器内的MySQL服务密码,并成功完成可视化工具登录【绝对有效】
- Docker容器网络
- docker安装 - 在线&离线
- docker安装nginx
- docker的使用
- Docker容器:“我竟可以是个饭盒?!”
- 【Docker学习系列】Docker学习1-docker安装
- Docker服务的查看服务状态命令(systemctl status docker)
- Docker服务的拉取镜像命令(docker pull 镜像名称)
- Docker查看容器命令(docker ps)
- Docker关闭容器命令(docker stop)
- chaincode生命周期对docker的操作(更新中...)
- 「 【Docker】用docker运行2048小游戏(玩转docker) 」
- 「 【Docker】设置docker加速器(如何使docker下载速度变快) 」
- 「 使用docker for windows关于迁移目录的教程 」
- 【好玩儿的Docker项目】10分钟搭建一个巨好用的粘贴板工具——MicroBin
- 【学习笔记】Docker学习笔记
- 【Docker 系列】docker 学习 三
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running
- 使用Docker安装Redis并配置成功(docker安装redis)
- 分布式Docker部署Redis分布式集群环境(dockerredis)
- docker-镜像管理
- flannel 的连通与隔离 – 每天5分钟玩转 Docker 容器技术(61)
- 如何共享数据?- 每天5分钟玩转 Docker 容器技术(41)
- docker managed volume – 每天5分钟玩转 Docker 容器技术(40)
- 镜像的缓存特性 – 每天5分钟玩转 Docker 容器技术(14)
- Docker 1.12:游戏改变者
- Docker、Kubernetes 和 Apache Mesos 对比中的一些误区
- 使用 Docker 轻松安装 MySQL 数据库(docker安装mysql)
- 的docker容器创建并使用Docker容器启动Redis数据库(创建并启动名为redis)