1.namespace
Linux Namespace是一种内核级别隔离系统资源的方法,来实现资源隔离的目的,可实现系统资源隔离的列表如下:(/proc/$$/ns)
Mnt
: 隔离文件系统挂载点
UTS
: 隔离主机名和域名信息
IPC
: 隔离进程间通信
PID
: 隔离进程的ID
net: 隔离网络资源
User
: 隔离用户和用户组的ID
用户可以在/proc/$$/ns
文件下看到本进程所属的Namespace
的文件信息
[root@localhost ~]# ll /proc/$$/ns
total 0
lrwxrwxrwx 1 root root 0 Jun 11 19:43 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jun 11 19:43 uts -> uts:[4026531838]
案例网络操作:
1.创建一个名称“linux"的网络名称空间,并启动。
[root@localhost 为"oldboyedu~]# ip netns add linux
[root@localhost ~]# ll /var/run/netns/linux
[root@localhost ~]# ip netns exec linux ip a
[root@localhost ~]# ip netns exec oldboyedu-linux ifconfig lo up
2.主机创建网络设备对,将"veth200"设备放到到自定义的"linux"网络名称空间,并配置IP地址。
[root@localhost ~]# ip link add veth100 type veth peer name veth200
[root@localhost ~]# ip link set veth200 netns oldboyedu-linux
[root@localhost ~]# ip netns exec oldboyedu-linux ifconfig veth200 172.31.100.200/24 up[root@localhost ~]# ifconfig veth100 172.31.100.100/24 up
3.配置完成后可以互通,添加网关,可跨网段ping通
[root@localhost ~]# ping 172.31.100.200
[root@localhost ~]# ip netns exec oldboyedu-linux ping 172.31.100.100
[root@localhost ~]# ip netns exec oldboyedu-linux ping 10.0.0.102
[root@localhost ~]# ip netns exec oldboyedu-linux route add default gw 172.31.100.100
[root@localhost ~]# ip netns exec oldboyedu-linux ping 10.0.0.10
2.OverlayFS
OverlayFS是一种堆叠文件系统,它依赖并建立在其它的文件系统之上(例如ext4fs和xfs等),并不直接参与磁盘空间结构的划分,仅仅将原来系统文件中的文件或者目录进行"合并一起",最后向用户展示"合并"的文件是在同一级的目录, 这就是联合挂载技术, 相对于AUFS (<1.12 早期使用的存储技术), OverlayFS速度更快,实现更简单。
Linux内核为Docker提供的OverlayFS驱动有两种:Overlay和Overlay2。而Overlay2是相对于Overlay的一种改进,在Inode利用率方面比Overlay更有效。
但是Overlay有环境需求:
(1)Docker版本17.06.02+;
(2)宿主机文件系统需要是EXT4或XFS格式;
OverlayFS实现方式:
OverlayFS通过三个目录:lower目录、upper目录、以及work目录实现。
lower:
一般对应的是只读数据。
upper:
可以进行读写操作的目录。
work:
目录为工作基础目录,挂载后会自动创建一个work子目录(实际测试手动卸载后该目录并不会被删除)
该目录主要是存储一些临时存放的结果或中间数据的工作目录。
值得注意的是,在使用过程中其内容用户不可见,最后联合挂载完成给用户呈现的统一视图称为merged目录。
OverlayFS结构分为三个层: LowerDir、Upperdir、MergedDir
LowerDir (只读)
只读的image layer,其实就是rootfs。
在使用Dockfile构建镜像的时候, Image Layer可以分很多层,所以对应的lowerdir会很多(源镜像)。
Lower 包括两个层:
(1)系统的init
1)容器在启动以后, 默认情况下lower层是不能够修改内容的, 但是用户有需求需要修改主机名与域名地址, 那么就需要添加init层中的文件(hostname, resolv.conf,hosts,mtab等文件), 用于解决此类问题;
2)修改的内容只对当前的容器生效, 而在docker commit提交为镜像时候,并不会将init层提交。
3)init文件存放的目录为/var/lib/docker/overlay2/<init_id>/diff
(2)容器的镜像层
不可修改的数据。
Upperdir (读写)
upperdir则是在lowerdir之上的一层, 为读写层。容器在启动的时候会创建, 所有对容器的修改, 都是在这层。比如容器启动写入的日志文件,或者是应用程序写入的临时文件。
MergedDir (展示)
merged目录是容器的挂载点,在用户视角能够看到的所有文件,都是从这层展示的。
3. CGroup
cgroup 是 Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。当我们将可用系统资源按特定百分比分配给 cgroup 时,剩余的资源可供系统上的其他 cgroup 或其他进程使用。在Linux系统中能够控制的资源列表如下:
cpu:
主要限制进程的cpu使用率。
cpuacct:
可以统计cgroups中的进程的cpu使用报告。
cpuset:
可以为cgroups中的进程分配单独的cpu节点或者内存节点。
memory:
可以限制进程的memory使用量。
blkio:
可以限制进程的块设备io。
devices:
可以控制进程能够访问某些设备。
net_cls:
可以标记cgroups中进程的网络数据包,然后可以使用tc模块(traffic control)对数据包进行控制。
net_prio:
这个子系统用来设计网络流量的优先级
freezer:
可以挂起或者恢复cgroups中的进程。
ns:
可以使不同cgroups下面的进程使用不同的namespace
hugetlb:
这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。