-
Notifications
You must be signed in to change notification settings - Fork 0
/
dockerxi-lie-zhi.html
300 lines (257 loc) · 17.4 KB
/
dockerxi-lie-zhi.html
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="CatsAction" />
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary">
<meta name="keywords" content="UnionFS, aufs, overlay2, Device mapper, Docker, Docker, " />
<meta property="og:title" content="Docker系列之 - 技术原理(UnionFS,Namespace,Cgroup) "/>
<meta property="og:url" content="./dockerxi-lie-zhi.html" />
<meta property="og:description" content="Docker是时下很流行的容器技术,它用到的技术主要是Cgroup,Namespace,UnionFS。 Cgroup为系统中所运行任务(进程)的用户定义组群分配资源,比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。 Namespace进行进程隔离,使容器拥有自己的rootfs和hostname …" />
<meta property="og:site_name" content="CatsAction's blog" />
<meta property="og:article:author" content="CatsAction" />
<meta property="og:article:published_time" content="2017-12-01T00:00:00+08:00" />
<meta name="twitter:title" content="Docker系列之 - 技术原理(UnionFS,Namespace,Cgroup) ">
<meta name="twitter:description" content="Docker是时下很流行的容器技术,它用到的技术主要是Cgroup,Namespace,UnionFS。 Cgroup为系统中所运行任务(进程)的用户定义组群分配资源,比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。 Namespace进行进程隔离,使容器拥有自己的rootfs和hostname …">
<title>Docker系列之 - 技术原理(UnionFS,Namespace,Cgroup) ·
CatsAction's blog
</title>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="./theme/image/logo.ico" />
<link rel="stylesheet" type="text/css" href="./theme/css/elegant.prod.css" media="screen">
<link rel="stylesheet" type="text/css" href="./theme/css/custom.css" media="screen">
</head>
<body>
<div id="content">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="./"><span class=site-name>CatsAction's blog</span></a>
<div class="nav-collapse collapse">
<ul class="nav pull-right top-menu">
<li >
<a href=
.
>Home</a>
</li>
<li ><a href="./categories.html">Categories</a></li>
<li ><a href="./tags.html">Tags</a></li>
<li ><a href="./archives.html">Archives</a></li>
<li><form class="navbar-search" action="./search.html" onsubmit="return validateForm(this.elements['q'].value);"> <input type="text" class="search-query" placeholder="Search" name="q" id="tipue_search_input"></form></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<article itemscope>
<div class="row-fluid">
<header class="page-header span10 offset2">
<h1>
<a href="./dockerxi-lie-zhi.html">
Docker系列之
<small class="subtitle">
技术原理(UnionFS,Namespace,Cgroup)
</small>
</a>
</h1>
</header>
</div>
<div class="row-fluid">
<div class="span8 offset2 article-content">
<p id="list-of-translations">
This post is also available in:
<a href="./dockerxi-lie-zhi.html">en</a></p>
<p>Docker是时下很流行的容器技术,它用到的技术主要是Cgroup,Namespace,UnionFS。</p>
<ul>
<li>Cgroup为系统中所运行任务(进程)的用户定义组群分配资源,比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。</li>
<li>Namespace进行进程隔离,使容器拥有自己的rootfs和hostname。同时使IPC、网络和其他进程隔离。</li>
<li>UnionFS打包容器运行时的各种依赖和库,发布成镜像。在容器启动时挂载成/目录,保证了容器运行的环境的统一,方便部署和管理。</li>
</ul>
<p><img alt="dockers_architecture" src="./images/dockers_architecture.png"></p>
<h4>Namespace</h4>
<p>Linux Namespace是Linux提供的一种内核级别环境隔离的方法。Namespace提供如下功能。</p>
<ul>
<li>把自身pid印射为0,并看不到其他任何的pid,这样自身的pid成为系统内唯一存在pid,看起来就像新启动了系统</li>
<li>用户名隔离,可以把用户名设置为“root”</li>
<li>hostname隔离,可以另取一个hostname,成为新启动进程的hostname</li>
<li>IPC隔离,隔离掉进程之间的互相通信</li>
<li>网络隔离,隔离掉进程和主机之间的网络 </li>
<li>可以自定义rootfs,比如我们把整个ubuntu发行版的可执行文件以及其他文件系统都放在目录/home/admin/ubuntu/下,当我们重定义rootfs = /home/admin/ubuntu后,则该文件地址被印射为"/"</li>
</ul>
<p>如何基于Linux Namespace创建一个隔离的进程,可以参考<a href="https://coolshell.cn/articles/17010.html">DOCKER基础技术:LINUX NAMESPACE</a></p>
<h4>Cgroup</h4>
<p>Cgroups 是 Linux 内核提供的一种机制,这种机制可以根据特定的行为,把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。<br>
通俗的来说,cgroups 可以限制、记录、隔离进程组所使用的物理资源(包括:CPU、memory、IO 等),为容器实现虚拟化提供了基本保证,是构建 Docker 等一系列虚拟化管理工具的基石。Cgoup的详细知识,可以查看陈皓的博客<a href="https://coolshell.cn/articles/17049.html">DOCKER基础技术:LINUX CGROUP</a></p>
<h4>UnionFS</h4>
<p>UnionFS是Union File System的简写。它可以把多个目录联和挂载到同一个目录下。而目录的物理位置是分开的。UnionFS允许只读和可读写目录并存,就是说可同时删除和增加内容。<br>
UnionFS应用的地方很多,比如在多个磁盘分区上合并不同文件系统的主目录,或把几张CD光盘合并成一个统一的光盘目录(归档)。另外,具有写时复制(copy-on-write)功能UnionFS
可以把只读和可读写文件系统合并在一起,虚拟上允许只读文件系统的修改可以保存到可写文件系统当中。 例如把一张CD/DVD和一个硬盘目录给联合mount在一起,然后,你就可以对这个只读的
CD/DVD上的文件进行修改(当然,修改的文件存于硬盘上的目录里)。
关于UnionFS的操作示例,可以查看<a href="https://coolshell.cn/articles/17061.html">AUFS</a>。<br>
Docker最开始采用AUFS作为文件系统,但由于AUFS未并入Linux内核,考虑到兼容性问题,在Docker 0.7版本中引入了存储驱动, 目前,Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五种存储驱动。可以使用<code>Docker info</code>查看。</p>
<div class="highlight"><pre><span></span>xufan in ~ λ docker info
Client:
Debug Mode: <span class="nb">false</span>
Server:
Containers: <span class="m">40</span>
Running: <span class="m">39</span>
Paused: <span class="m">0</span>
Stopped: <span class="m">1</span>
Images: <span class="m">16</span>
Server Version: <span class="m">19</span>.03.5
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: <span class="nb">true</span>
Native Overlay Diff: <span class="nb">true</span>
Logging Driver: json-file
Cgroup Driver: cgroupfs
</pre></div>
<p>上面是我MacOS系统的输出,使用的overlay2。Backing FIlesystem表明操作系统层面的文件系统使用的是extfs。
关于五种驱动的介绍和对比,可参考<a href="http://dockone.io/article/1513">Docker五种存储驱动原理及应用场景和性能测试对比</a></p>
<h4>常见UnionFS</h4>
<ul>
<li>AUFS</li>
<li>overlay</li>
</ul>
<p>AUFS和Overlay都是联合文件系统,但AUFS有多层,而Overlay只有两层,所以在做写时复制操作时,如果文件比较大且存在比较低的层,则AUSF可能会慢一些。而且Overlay并入了linux kernel mainline,AUFS没有,所以可能会比AUFS快。</p>
<h4>overlay和overlay2</h4>
<p>overlay共享数据方式是通过硬连接,而overlay2是通过每层的lower文件。</p>
<h4>docker的镜像rootfs,和layer的设计</h4>
<p>为了让容器运行时一致,docker将依赖的操作系统、各种lib依赖整合打包在一起(即镜像),然后容器启动时,作为它的根目录(根文件系统rootfs),使得容器进程的各种依赖调用都在这个根目录里,这样就做到了环境的一致性。<br>
Docker镜像的设计中,引入了层(layer)的概念,用户制作镜像的每一步操作,都会生成一个层,也就是一个增量rootfs(一个目录)。下层作为上层的依赖,提供只读的环境。上层需要修改下层文件时,先复制一份到本层,修改发布后作为镜像成为其他容器的依赖。</p>
<hr />
<aside>
<nav>
<ul class="articles-timeline">
<li class="previous-article">« <a href="./rabbitmqxi-lie-di-san-pian.html"
title="Previous: RabbitMQ系列第三篇 - 分布式部署">RabbitMQ系列第三篇 <small class="subtitle">分布式部署</small></a></li>
<li class="next-article"><a href="./dockerxi-lie-zhi.html"
title="Next: Docker系列之 - 概念及入门">Docker系列之 <small class="subtitle">概念及入门</small></a> »</li>
</ul>
</nav>
</aside>
</div>
<section id="article-sidebar" class="span2">
<h4>Published</h4>
<time itemprop="dateCreated" datetime="2017-12-01T00:00:00+08:00">12
1, 2017</time>
<!---->
<h4>Category</h4>
<a class="category-link"
href="./categories.html#docker-ref">Docker</a>
<h4>Tags</h4>
<ul class="list-of-tags tags-in-article">
<li><a href="./tags.html#aufs-ref">aufs
<span>1</span>
</a></li>
<li><a href="./tags.html#device-mapper-ref">Device mapper
<span>1</span>
</a></li>
<li><a href="./tags.html#docker-ref">Docker
<span>4</span>
</a></li>
<li><a href="./tags.html#overlay2-ref">overlay2
<span>1</span>
</a></li>
<li><a href="./tags.html#unionfs-ref">UnionFS
<span>1</span>
</a></li>
</ul>
<h4>Stay in Touch</h4>
<div id="sidebar-social-link">
<a href="mailto:[email protected]" title="My Email Address" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="Mail" role="img" viewBox="0 0 512 512"><rect width="512" height="512" rx="15%" fill="#328cff"/><path d="m250 186c-46 0-69 35-69 74 0 44 29 72 68 72 43 0 73-32 73-75 0-44-34-71-72-71zm-1-37c30 0 57 13 77 33 0-22 35-22 35 1v150c-1 10 10 16 16 9 25-25 54-128-14-187-64-56-149-47-195-15-48 33-79 107-49 175 33 76 126 99 182 76 28-12 41 26 12 39-45 19-168 17-225-82-38-68-36-185 67-248 78-46 182-33 244 32 66 69 62 197-2 246-28 23-71 1-71-32v-11c-20 20-47 32-77 32-57 0-108-51-108-108 0-58 51-110 108-110" fill="#fff"/></svg>
</a>
<a href="https://github.com/boyaziqi" title="catsaction Github Repository" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="GitHub" role="img" viewBox="0 0 512 512"><rect width="512" height="512" rx="15%" fill="#1B1817"/><path fill="#fff" d="M335 499c14 0 12 17 12 17H165s-2-17 12-17c13 0 16-6 16-12l-1-50c-71 16-86-28-86-28-12-30-28-37-28-37-24-16 1-16 1-16 26 2 40 26 40 26 22 39 59 28 74 22 2-17 9-28 16-35-57-6-116-28-116-126 0-28 10-51 26-69-3-6-11-32 3-67 0 0 21-7 70 26 42-12 86-12 128 0 49-33 70-26 70-26 14 35 6 61 3 67 16 18 26 41 26 69 0 98-60 120-117 126 10 8 18 24 18 48l-1 70c0 6 3 12 16 12z"/></svg>
</a>
<a href="https://www.linkedin.com/feed/" title="My LinkedIn" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="LinkedIn" role="img" viewBox="0 0 512 512" fill="#fff"><rect width="512" height="512" rx="15%" fill="#0077b5"/><circle cx="142" cy="138" r="37"/><path stroke="#fff" stroke-width="66" d="M244 194v198M142 194v198"/><path d="M276 282c0-20 13-40 36-40 24 0 33 18 33 45v105h66V279c0-61-32-89-76-89-34 0-51 19-59 32"/></svg>
</a>
</div>
<h4>Friendship Link</h4>
<ul class="list-of-tags tags-in-article">
<li>
<a href="https://leetcode-cn.com/" title="力扣中国站点" target="_blank" rel="nofollow noopener noreferrer">
LeetCode
</a>
</li>
<li>
<a href="https://coolshell.cn/about" title="陈皓酷壳" target="_blank" rel="nofollow noopener noreferrer">
CoolShell
</a>
</li>
<li>
<a href="https://www.infoq.cn/" title="InfoQ" target="_blank" rel="nofollow noopener noreferrer">
InfoQ
</a>
</li>
<li>
<a href="https://www.nowcoder.com/" title="牛客网" target="_blank" rel="nofollow noopener noreferrer">
牛客网
</a>
</li>
</ul>
</section>
</div>
</article>
</div>
<div class="span1"></div>
</div>
</div>
</div>
<footer>
<div>
<span class="site-name">CatsAction's blog</span> - It's a wonderful world
</div>
<div id="fpowered">
Powered by: <a href="http://getpelican.com/" title="Pelican Home Page" target="_blank" rel="nofollow noopener noreferrer">Pelican</a>
Theme: <a href="https://elegant.oncrashreboot.com/" title="Theme Elegant Home Page" target="_blank" rel="nofollow noopener noreferrer">Elegant</a>
</div>
</footer> <script src="//code.jquery.com/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
<script>
(function () {
if (window.location.hash.match(/^#comment-\d+$/)) {
$('#comment_thread').collapse('show');
}
})();
window.onhashchange=function(){
if (window.location.hash.match(/^#comment-\d+$/))
window.location.reload(true);
}
$('#comment_thread').on('shown', function () {
var link = document.getElementById('comment-accordion-toggle');
var old_innerHTML = link.innerHTML;
$(link).fadeOut(200, function() {
$(this).text('Click here to hide comments').fadeIn(200);
});
$('#comment_thread').on('hidden', function () {
$(link).fadeOut(200, function() {
$(this).text(old_innerHTML).fadeIn(200);
});
})
})
</script>
</body>
<!-- Theme: Elegant built for Pelican
License : MIT -->
</html>