前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
docker-namespace
Docker的隔离性主要运用Namespace 技术,为什么需要隔离?看如下几个问题
- 怎么样保证每个容器都有不同的文件系统并且能互不影响?
- 一个docker主进程内的各个容器都是其子进程,那么实现同一个主进程下不同类型的子进程相互访问
- 每个容器怎么解决IP及端口分配的问题?
- 多个容器的主机名能一样吗?
- 每个容器都要不要有root用户?怎么解决账户重名问题?
namespace是Linux系统的底层概念,在内核层实现,有一些不同类型的命名空间被部署在核内
各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核
各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间
但是容器技术是在一个进程内实现运行指定服务的运行环境
并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离
命名空间种类
隔离类型 | 功能 | 系统调用参数 | 内核版本 |
---|---|---|---|
MNT Namespace | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | Linux 2.4.19 |
IPC Namespace | 提供进程间通信的隔离能力 | CLONE_NEWIPC | Linux 2.6.19 |
UTS Namespace(UNIX Timesharing System) | 提供主机名隔离能力 | CLONE_NEWUTS | Linux 2.6.19 |
PID Namespace(Process Identification) | 提供进程隔离能力 | CLONE_NEWPID | Linux 2.6.24 |
Net Namespace(network) | 提供网络隔离能力 | CLONE_NEWNET | Linux 2.6.29 |
User Namespace(user) | 提供用户隔离能力 | CLONE_NEWUSER | Linux 3.8 |
MNT Namespace
每个容器都要有独立的根文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境;
即一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在容器里面启动一个Nginx服务
此Nginx运行时使用的运行环境就是centos系统目录的运行环境
但是在容器里面是不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面
- chroot
CHROOT就是Change Root,也就是改变程序执行时所参考的根目录位置
CHROOT可以增进系统的安全性,限制使用者能做的事
IPC Namespace
一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问,但是不能跨容器直接访问其他容器的数据
UTS Namespace
UTS namespace(UNIX Timesharing System包含了运行内核的名称、版本、底层体系结构类型等信息)
用于系统标识,其中包含了主机名hostname和域名domainname
它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器
PID Namespace
Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程
那么在每个容器内也要有一个父进程来管理其下属的子进程
那么多个容器的进程通PID namespace进程隔离(比如PID编号重复、器内的主进程生成与回收子进程等)。
NET Namespace
每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP协议栈等,
Docker使用network namespace启动一个vethX接口、这样你的容器将拥有它自己的桥接ip地址
通常是docker0,而docker0实质就是Linux的虚拟网桥;
网桥是在OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。
User Namespace
各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎么隔离各个容器内的用户空间呢
User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID
只是会把用户的作用范围限制在每个容器内
即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统
即相互隔离、互补影响、永不相见。
docker-CGroup
在一个容器,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间
有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完
为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等,这里就要用到cgroup了
Linux Cgroups的全称是Linux Control Groups
它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等
此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。
Cgroups在内核层默认已经开启
查看centos的cGroup
grep CGROUP /boot/config-3.10.0-514.el7.x86_64
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NETPRIO_CGROUP=y
cgroup具体实现
ll /sys/fs/cgroup/
- blkio:块设备IO限制
- cpu:使用调度程序为 cgroup 任务提供 cpu 的访问
- cpuacct:产生 cgroup 任务的 cpu 资源报告
- cpuset:如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存
- devices:允许或拒绝 cgroup 任务对设备的访问
- freezer:暂停和恢复 cgroup 任务
- memory:设置每个 cgroup 的内存限制以及产生内存资源报告
- net_cls:标记每个网络包以供 cgroup 方便使用
- ns:命名空间子系统
- perf_event:增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程
[root@iz2zea9uyf6zq3g1ycpjpez ~]# ll //sys/fs/cgroup
总用量 0
drwxr-xr-x 5 root root 0 8月 15 2019 blkio
lrwxrwxrwx 1 root root 11 8月 15 2019 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 8月 15 2019 cpuacct -> cpu,cpuacct
drwxr-xr-x 6 root root 0 7月 29 10:29 cpu,cpuacct
drwxr-xr-x 3 root root 0 8月 15 2019 cpuset
drwxr-xr-x 5 root root 0 8月 15 2019 devices
drwxr-xr-x 3 root root 0 8月 15 2019 freezer
drwxr-xr-x 3 root root 0 8月 15 2019 hugetlb
drwxr-xr-x 6 root root 0 7月 29 10:29 memory
lrwxrwxrwx 1 root root 16 8月 15 2019 net_cls -> net_cls,net_prio
drwxr-xr-x 3 root root 0 8月 15 2019 net_cls,net_prio
lrwxrwxrwx 1 root root 16 8月 15 2019 net_prio -> net_cls,net_prio
drwxr-xr-x 3 root root 0 8月 15 2019 perf_event
drwxr-xr-x 3 root root 0 8月 15 2019 pids
drwxr-xr-x 5 root root 0 8月 15 2019 systemd