Linux 资源隔离
容器技术与资源隔离
容器是一种轻量级的虚拟化技术,它不需要模拟硬件创建虚拟机。在


After docker run
通过下面命令运行一个
docker run -i -t debian /bin/bash
这个命令背后都做了什么?
1. 如果本机没有debian 镜像,则会从你配置的Registry 里面拉取一个debian 的latest 版本的镜像,跟你运行了docker pull debian
效果一样。2. 创建容器。跟运行docker create
一样。3. 给容器分配一个读写文件系统作为该容器的final layer
,容器可以在它的文件系统创建和修改文件。4.Docker 为容器创建了一套网络接口,给容器分配一个ip 。默认情况下,容器可以通过默认网络连通到外部网络。5.Docker 启动容器并执行/bin/bash
。因为启动时指定了-i -t
参数,容器是以交互模式运行且attach 到本地终端,我们可以在终端上输入命令并看到输出。6. 运行exit 可以退出容器,但是此时容器并没有被删除,我们可以再次运行它或者删除它。
可以发现,容器的内核版本是跟宿主机一样的,不同的是容器的主机名是独立的,它默认用容器ps -ef
可以发现容器进程是隔离的,容器里面看不到宿主机的进程,而且它自己有
root@stretch:/home/vagrant# uname -r
4.9.0-6-amd64
root@stretch:/home/vagrant# docker run -it --name demo alpine /bin/ash
/ # uname -r ## 容器内
4.9.0-6-amd64
/ # ps -ef
PID USER TIME COMMAND
1 root 0:00 /bin/ash
7 root 0:00 ps -ef
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
这些隔离机制并不是
-
隔离性,
Linux Namespaces(Linux2.6.24 后引入) :命名空间用于进程(PID) 、网络(NET) 、挂载点(MNT) 、UTS、IPC 等隔离。容器内的应用只能在自己的命名空间中运行而且不会访问到命名空间之外。 -
控制组,Linux Control Groups(CGroups):用于限制容器使用的资源,包括内存,
CPU 等。使应用隔离运行的关键是让它们只使用你想要的资源。这样可以确保在机器上运行的容器都是良民(good multi-tenant citizens) 。群组控制允许Docker 分享或者限制容器使用硬件资源。 -
便携性,Union File Systems:
UnionFS 把多个目录结合成一个目录,对外使用,最上层目录为读写层( 通常只有1 个) ,下面可以有一个或多个只读层,见容器和镜像分层图。Docker 支持OverlayFS ,AUFS、DeviceMapper、btrfs 等联合文件系统,支持将不同目录挂载到同一个虚拟文件系统下的文件系统。 -
Container Format: Docker Engine 组合Namespaces ,CGroups 以及UnionFS 包装为一个容器格式,默认格式为libcontainer ,后续可能会加入BSD Jails 或Solaris Zones 容器格式的支持。