暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
07白话容器基础(三):深入理解容器镜像
503
23页
0次
2019-10-11
5墨值下载
2019/2/27 极客时间 | 深入剖析Kubernetes
https://time.geekbang.org/column/article/17921 1/23
深入剖析Kubernetes
首页
|
07 | 白话容器基础(三):深入理解容器镜像
2018-09-07 张磊
朗读:张磊
时长 19:34 大小 8.97M
你好,我是张磊。我在今天这篇文章的最后,放置了一张 Kubernetes 的技能图谱,希望
对你有帮助。
在前两次的分享中,我讲解了 Linux 容器最基础的两种技术:Namespace 和 Cgroups。
希望此时,你已经彻底理解了“容器的本质是一种特殊的进程”这个最重要的概念。
而正如我前面所说的,Namespace 的作用是“隔离”,它让应用进程只能看到该
Namespace 内的“世界”;而 Cgroups 的作用是“限制”,它给这个“世界”围上了一
圈看不见的墙。这么一折腾,进程就真的被“装”在了一个与世隔绝的房间里,而这些房
间就是 PaaS 项目赖以生存的应用“沙盒”。
可是,还有一个问题不知道你有没有仔细思考过:这个房间四周虽然有了墙,但是如果容
器进程低头一看地面,又是怎样一副景象呢?
2019/2/27 极客时间 | 深入剖析Kubernetes
https://time.geekbang.org/column/article/17921 2/23
换句话说,容器里的进程看到的文件系统又是什么样子的呢?
可能你立刻就能想到,这一定是一个关于 Mount Namespace 的问题:容器里的应用进
程,理应看到一份完全独立的文件系统。这样,它就可以在自己的容器目录(比如
/tmp)下进行操作,而完全不会受宿主机以及其他容器的影响。
那么,真实情况是这样吗?
“左耳朵耗子”叔在多年前写的一篇关于 Docker 基础知识的博客里,曾经介绍过一段小
程序。这段小程序的作用是,在创建子进程时开启指定的 Namespace。
下面,我们不妨使用它来验证一下刚刚提到的问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#define _GNU_SOURCE
#include <sys/mount.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>
#define STACK_SIZE (1024 * 1024)
static char container_stack[STACK_SIZE];
char* const container_args[] = {
"/bin/bash",
NULL
};
int container_main(void* arg)
{
printf("Container - inside the container!\n");
execv(container_args[0], container_args);
printf("Something's wrong!\n");
return 1;
}
int main()
{
printf("Parent - start a container!\n");
int container_pid = clone(container_main, container_stack+STACK_SIZE, CLONE_NEWNS | S
waitpid(container_pid, NULL, 0);
printf("Parent - container stopped!\n");
return 0;
}
复制代码
of 23
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜