Docker基础

2022-03-27  本文已影响0人  Dakini_Wind

有时候有些东西明明看过,面试还是想不起来,终归是纸上得来终觉浅。

Dockerfile

原理

Namespce

主要用来做资源隔离。Linux内核共实现了以下几种Namespce:

查询Docker容器的Namespace信息如下:

# 获取容器ID
docker ps

# 获取容器对应的进程PID
docker inspect f604f0e34bc2

# 查询PID对应的ns信息
ls -l /proc/58212/ns 
lrwxrwxrwx 1 root root 0 Jul 16 19:19 ipc -> ipc:[4026532278]
lrwxrwxrwx 1 root root 0 Jul 16 19:19 mnt -> mnt:[4026532276]
lrwxrwxrwx 1 root root 0 Jul 16 01:43 net -> net:[4026532281]
lrwxrwxrwx 1 root root 0 Jul 16 19:19 pid -> pid:[4026532279]
lrwxrwxrwx 1 root root 0 Jul 16 19:19 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jul 16 19:19 uts -> uts:[4026532277]

操作Namespace的方式如下:

# 进入指定的namespace
nsenter --target 58212 --mount --uts --ipc --net --pid -- env --ignore-environment -- /bin/bash

# 离开当前ns,并加入新的ns
unshare --mount --ipc --pid --net --mount-proc=/proc --fork /bin/bash

# 创建子进程,并将子进程放到新的ns中。父进程不变
# arg可选:CLONE_NEWUTS、CLONE_NEWUSER、CLONE_NEWNS、CLONE_NEWPID。CLONE_NEWNET
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

# 将当前进程放到已有的ns中
# nstype 用来指定 namespace 的类型,可以设置为 CLONE_NEWUTS、CLONE_NEWUSER、CLONE_NEWNS、CLONE_NEWPID 和 CLONE_NEWNET
int setns(int fd, int nstype);

# 使当前进程退出当前的 namespace,并加入到新创建的namespace中
int unshare(int flags);

CGroups

全称Control Group,主要用来限制资源使用。CGroups定义了下面一系列子系统,每个子系统用于控制某一类资源:

在 Linux 上,为了操作 Cgroup,有一个专门的 Cgroup 文件系统,位于/sys/fs/cgroup/目录下。目录结构如下所示:

drwxr-xr-x 5 root root  0 May 30 17:00 blkio
lrwxrwxrwx 1 root root 11 May 30 17:00 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 May 30 17:00 cpuacct -> cpu,cpuacct
drwxr-xr-x 5 root root  0 May 30 17:00 cpu,cpuacct
drwxr-xr-x 3 root root  0 May 30 17:00 cpuset
drwxr-xr-x 5 root root  0 May 30 17:00 devices
drwxr-xr-x 3 root root  0 May 30 17:00 freezer
drwxr-xr-x 3 root root  0 May 30 17:00 hugetlb
drwxr-xr-x 5 root root  0 May 30 17:00 memory
lrwxrwxrwx 1 root root 16 May 30 17:00 net_cls -> net_cls,net_prio
drwxr-xr-x 3 root root  0 May 30 17:00 net_cls,net_prio
lrwxrwxrwx 1 root root 16 May 30 17:00 net_prio -> net_cls,net_prio
drwxr-xr-x 3 root root  0 May 30 17:00 perf_event
drwxr-xr-x 5 root root  0 May 30 17:00 pids
drwxr-xr-x 5 root root  0 May 30 17:00 systemd

Docker操作CGroups的方式如下图所示:


操作cgroup

实践技巧

参考:
构建Docker镜像的原理_人人都是酸菜鱼又酸又菜又多余的博客-CSDN博客_docker镜像构建原理
uufree/ubook: 读书笔记 (github.com)

上一篇 下一篇

猜你喜欢

热点阅读