容器实战高手课
01
在容器中,1 号进程永远不会响应 SIGKILL 和 SIGSTOP 这两个特权信号;
对于其他的信号,如果用户自己注册了 handler,1 号进程可以响应。
SIGTERM 可以程序自己注册,所以 1 号进程是可以响应的
02
进程 “活着” 的时候只有两个状态:运行态(TASK_RUNNING)和睡眠态(TASK_INTERRUPTIBLE,TASK_UNINTERRUPTIBLE)
如果你想让容器里的进程避免过多僵尸进程,1需要限制容器的pids.max 是容器需要做的,2是程序的父进程要处理子进程进行回收
进程退出会调用do_exit() 它有两个状态 EXIT_DEAD EXIT_ZOMBIE,僵尸进程会处于EXIT_ZOMBIE
03
如何实现 graceful shutdown
容器的第一个进程 也就是 init 进程,如果你做docker stop时 init进程收到的是 SIGTERM 你的进程注册了 SIGTERM 他就会自动退出,但是在容器里你的子进程收到的是 SIGKILL 这个signal是不允许被注册的,所以当你的init收到SIGTERM要转发给子进程让他们去退出
08
通过查看 syslog 看是否有 oom-kill
grep -C 10 oom-kill syslog
系统总的可用页面数乘以进程的 OOM 校准值 oom_score_adj,再加上进程已经使用的物理页面数,计算出来的值越大,那么这个进程被 OOM Kill 的几率也就越大。
要么调大内存,要么修bug
09
在linux里 内存 rss 是程序真正使用的内存,page cache是文件缓存,当内存达到max时 也可以继续申请,会释放page的内存
cgroup v2 memory.stat anon 是rss ,file是page cache
11
overlayfs 就是 unionfs 的一种实现,overlayfs主要是给容器镜像使用,分为 lowerlay 和 upperlay 还有workerlay,lowerlay仅仅可读,一般写操作都放在 upperlay
12
overlayfs 没有专门限制磁盘使用量的实现,如果你的磁盘是xfs是可以通过xfs的quota来限制,docker 自己也有磁盘使用限制
15
容器中有些网络参数是默认继承宿主机,而有些是会写入默认值,所以当你需要变更网络参数时 要在你的程序没启动时进行修改,如果你的应用已经启动,变更后已经连接的tcp要重新连接才会生效,容器提供了 sysctl 来在容器里应用启动之前修改,这样就会是你想要的网络参数
16
容器和宿主机网络通信是走docker0这个网卡,宿主机和容器是通过一对网卡pair来连接,容器pair->宿主机pai—>docker0->eth0 转发
19
其实 Linux capabilities 就是把 Linux root 用户原来所有的特权做了细化,可以更加细粒度地给进程赋予不同权限
getcap $(which ping)
setcap -r $(which ping)