zoukankan      html  css  js  c++  java
  • 030、实现容器的底层技术(2019-01-25 周五)

     
     
    为了更好的理解容器的特性,本节我们将讨论容器的底层实现技术。
     
    cgroup 和 namespace 是最重要的两种技术。cgroup 实现资源限额namespace 实现资源隔离
     
    cgroup
     
    全程 Control Group 。Linux操作系统通过 cgroup 可以设置进程使用CPU、MEM 和 IO 资源的限额。就是我们前面学习的参数
        --cpu-shares
        -m
        --device-write-bps
     
    root@docker-lab:~# docker run -it --cpu-shares 512 progrium/stress -c 1    #    启动容器,设置cpu.shares 512
    stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd
    stress: dbug: [1] using backoff sleep of 3000us
    stress: dbug: [1] --> hogcpu worker 1 [7] forked
     
     
    root@docker-lab:~# docker ps    #    查看容器ID
    CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
    980b3b38e444        progrium/stress     "/usr/bin/stress --v…"   About a minute ago   Up About a minute                       vigilant_mahavira
    root@docker-lab:~# ls /sys/fs/cgroup/cpu/docker/    #    在cgroup目录中查找容器对应的目录,容器长ID命名
    980b3b38e44419fca0df8681101274a16a75a2bf426f7cfb6354a73953a42cfe  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.shares  notify_on_release
    cgroup.clone_children                                             cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.stat    tasks
    root@docker-lab:~# cat /sys/fs/cgroup/cpu/docker/980b3b38e44419fca0df8681101274a16a75a2bf426f7cfb6354a73953a42cfe/cpu.shares    #    查看cgroup中设置的 cpu.shares 值
    512
    root@docker-lab:~#
     
     
    root@docker-lab:~# ll /sys/fs/cgroup/    #    查看cgroup 中的所有内容
    total 0
    drwxr-xr-x 13 root root 340 Jun 14  2018 ./
    drwxr-xr-x  9 root root   0 Jun 14  2018 ../
    dr-xr-xr-x  6 root root   0 Jun 14  2018 blkio/
    lrwxrwxrwx  1 root root  11 Jun 14  2018 cpu -> cpu,cpuacct/
    lrwxrwxrwx  1 root root  11 Jun 14  2018 cpuacct -> cpu,cpuacct/
    dr-xr-xr-x  6 root root   0 Jun 14  2018 cpu,cpuacct/
    dr-xr-xr-x  3 root root   0 Jun 14  2018 cpuset/
    dr-xr-xr-x  6 root root   0 Jun 14  2018 devices/
    dr-xr-xr-x  3 root root   0 Jun 14  2018 freezer/
    dr-xr-xr-x  3 root root   0 Jun 14  2018 hugetlb/
    dr-xr-xr-x  6 root root   0 Jun 14  2018 memory/
    lrwxrwxrwx  1 root root  16 Jun 14  2018 net_cls -> net_cls,net_prio/
    dr-xr-xr-x  3 root root   0 Jun 14  2018 net_cls,net_prio/
    lrwxrwxrwx  1 root root  16 Jun 14  2018 net_prio -> net_cls,net_prio/
    dr-xr-xr-x  3 root root   0 Jun 14  2018 perf_event/
    dr-xr-xr-x  6 root root   0 Jun 14  2018 pids/
    dr-xr-xr-x  6 root root   0 Jun 14  2018 systemd/
    root@docker-lab:~# ll /sys/fs/cgroup/cpu/docker/980b3b38e44419fca0df8681101274a16a75a2bf426f7cfb6354a73953a42cfe/    #    查看容器 cgroup cpu 相关内容
    total 0
    drwxr-xr-x 2 root root 0 Jan 29 09:28 ./
    drwxr-xr-x 3 root root 0 Jan 29 09:20 ../
    -rw-r--r-- 1 root root 0 Jan 29 09:26 cgroup.clone_children
    -rw-r--r-- 1 root root 0 Jan 29 09:20 cgroup.procs
    -r--r--r-- 1 root root 0 Jan 29 09:22 cpuacct.stat
    -rw-r--r-- 1 root root 0 Jan 29 09:22 cpuacct.usage
    -r--r--r-- 1 root root 0 Jan 29 09:22 cpuacct.usage_percpu
    -rw-r--r-- 1 root root 0 Jan 29 09:22 cpu.cfs_period_us
    -rw-r--r-- 1 root root 0 Jan 29 09:22 cpu.cfs_quota_us
    -rw-r--r-- 1 root root 0 Jan 29 09:20 cpu.shares
    -r--r--r-- 1 root root 0 Jan 29 09:22 cpu.stat
    -rw-r--r-- 1 root root 0 Jan 29 09:26 notify_on_release
    -rw-r--r-- 1 root root 0 Jan 29 09:26 tasks
    root@docker-lab:~# ll /sys/fs/cgroup/memory/docker/980b3b38e44419fca0df8681101274a16a75a2bf426f7cfb6354a73953a42cfe/    #    查看容器 cgroup memory 相关内容
    total 0
    drwxr-xr-x 2 root root 0 Jan 29 09:28 ./
    drwxr-xr-x 3 root root 0 Jan 29 09:20 ../
    -rw-r--r-- 1 root root 0 Jan 29 09:27 cgroup.clone_children
    --w--w--w- 1 root root 0 Jan 29 09:20 cgroup.event_control
    -rw-r--r-- 1 root root 0 Jan 29 09:20 cgroup.procs
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.failcnt
    --w------- 1 root root 0 Jan 29 09:27 memory.force_empty
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.kmem.failcnt
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.kmem.limit_in_bytes
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.kmem.max_usage_in_bytes
    -r--r--r-- 1 root root 0 Jan 29 09:27 memory.kmem.slabinfo
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.kmem.tcp.failcnt
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.kmem.tcp.limit_in_bytes
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.kmem.tcp.max_usage_in_bytes
    -r--r--r-- 1 root root 0 Jan 29 09:27 memory.kmem.tcp.usage_in_bytes
    -r--r--r-- 1 root root 0 Jan 29 09:27 memory.kmem.usage_in_bytes
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.limit_in_bytes
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.max_usage_in_bytes
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.memsw.failcnt
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.memsw.limit_in_bytes
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.memsw.max_usage_in_bytes
    -r--r--r-- 1 root root 0 Jan 29 09:27 memory.memsw.usage_in_bytes
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.move_charge_at_immigrate
    -r--r--r-- 1 root root 0 Jan 29 09:27 memory.numa_stat
    -rw-r--r-- 1 root root 0 Jan 29 09:20 memory.oom_control
    ---------- 1 root root 0 Jan 29 09:27 memory.pressure_level
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.soft_limit_in_bytes
    -r--r--r-- 1 root root 0 Jan 29 09:27 memory.stat
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.swappiness
    -r--r--r-- 1 root root 0 Jan 29 09:27 memory.usage_in_bytes
    -rw-r--r-- 1 root root 0 Jan 29 09:27 memory.use_hierarchy
    -rw-r--r-- 1 root root 0 Jan 29 09:27 notify_on_release
    -rw-r--r-- 1 root root 0 Jan 29 09:27 tasks
    root@docker-lab:~# ll /sys/fs/cgroup/devices/docker/980b3b38e44419fca0df8681101274a16a75a2bf426f7cfb6354a73953a42cfe/    #    查看容器 cgroup devices  相关内容
    total 0
    drwxr-xr-x 2 root root 0 Jan 29 09:29 ./
    drwxr-xr-x 3 root root 0 Jun 14  2018 ../
    -rw-r--r-- 1 root root 0 Jan 29 09:29 cgroup.clone_children
    -rw-r--r-- 1 root root 0 Jan 29 09:20 cgroup.procs
    --w------- 1 root root 0 Jan 29 09:20 devices.allow
    --w------- 1 root root 0 Jan 29 09:20 devices.deny
    -r--r--r-- 1 root root 0 Jan 29 09:29 devices.list
    -rw-r--r-- 1 root root 0 Jan 29 09:29 notify_on_release
    -rw-r--r-- 1 root root 0 Jan 29 09:29 tasks
    root@docker-lab:~# ll /sys/fs/cgroup/blkio/docker/980b3b38e44419fca0df8681101274a16a75a2bf426f7cfb6354a73953a42cfe/    #    查看容器 cgroup blkio 相关内容
    total 0
    drwxr-xr-x 2 root root 0 Jan 29 09:29 ./
    drwxr-xr-x 3 root root 0 Jan 29 09:20 ../
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_merged
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_merged_recursive
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_queued
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_queued_recursive
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_service_bytes
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_service_bytes_recursive
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_serviced
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_serviced_recursive
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_service_time
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_service_time_recursive
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_wait_time
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.io_wait_time_recursive
    -rw-r--r-- 1 root root 0 Jan 29 09:29 blkio.leaf_weight
    -rw-r--r-- 1 root root 0 Jan 29 09:29 blkio.leaf_weight_device
    --w------- 1 root root 0 Jan 29 09:29 blkio.reset_stats
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.sectors
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.sectors_recursive
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.throttle.io_service_bytes
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.throttle.io_serviced
    -rw-r--r-- 1 root root 0 Jan 29 09:29 blkio.throttle.read_bps_device
    -rw-r--r-- 1 root root 0 Jan 29 09:29 blkio.throttle.read_iops_device
    -rw-r--r-- 1 root root 0 Jan 29 09:29 blkio.throttle.write_bps_device
    -rw-r--r-- 1 root root 0 Jan 29 09:29 blkio.throttle.write_iops_device
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.time
    -r--r--r-- 1 root root 0 Jan 29 09:29 blkio.time_recursive
    -rw-r--r-- 1 root root 0 Jan 29 09:29 blkio.weight
    -rw-r--r-- 1 root root 0 Jan 29 09:29 blkio.weight_device
    -rw-r--r-- 1 root root 0 Jan 29 09:29 cgroup.clone_children
    -rw-r--r-- 1 root root 0 Jan 29 09:20 cgroup.procs
    -rw-r--r-- 1 root root 0 Jan 29 09:29 notify_on_release
    -rw-r--r-- 1 root root 0 Jan 29 09:29 tasks
     
     
     
    namespace
     
    在每个容器中,我们都可以看到文件系统、网卡等资源,这些资源看上去是容器自己的。拿网卡来说,每个容器都会认为自己有一块独立的网卡,及时docker host上只有一个块物理网卡。这种方式非常好,他使得容器更像一个独立的计算机。
     
    Linux实现这种方式的技术是namespace,namespace管理着docker host中全局唯一的资源,并可以让每个容器都觉得只有自己在使用他。换句话说,namespace实现了容器间的资源隔离
     
    Linux使用了六种namespace,分别对应六种资源: mount、UTS、IPC、PID、Network、User。
     
    Mount namespace
     
    它使得容器看上去拥有整个文件系统
     
    容器有自己的 / 目录,可以执行mount 和 unmount命令。当然我们知道这些操作系统只在当前容器中生效,不会影响到 docker host 和其他容器。
     
    UTS namespace
     
    简单的说,UTS namespace让容器有自己的hostname 。默认情况下,容器的hostname 是他的短ID,可以通过 -h 或者 --hostname 参数设定
     
    IPC namespace
     
    它可以让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与docker host和其他容器的IPC混在一起。
     
    下面例子可以看到所有容器的进程都挂载 dockerd 进程下面,同时也可以看到容器自己的子进程。如果我们进入到容器中,使用ps命令只能看到自己的进程
     
    root@docker-lab:~# docker run -d httpd
    48ec7932db1c5c27a194b15b3a3c1349a5d43d9260661b381d1563092ed941b6
    root@docker-lab:~#
    root@docker-lab:~# docker run -d nginx
    37a75b3a9bd9ad07fb07bff04b6df16e3cb693e47ffb87a1184d1b8f975e8b6d
     
    root@docker-lab:~# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    37a75b3a9bd9        nginx               "nginx -g 'daemon of…"   25 seconds ago      Up 25 seconds       80/tcp              compassionate_chatterjee
    48ec7932db1c        httpd               "httpd-foreground"       32 seconds ago      Up 32 seconds       80/tcp              amazing_banach
    root@docker-lab:~# ps axf
     
    24323 ?        Ssl   71:17 /usr/bin/dockerd -H fd:// -H tcp://0.0.0.0
    24336 ?        Ssl  149:45  \_ docker-containerd --config /var/run/docker/containerd/containerd.toml
    27680 ?        Sl     0:00      \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/48ec7932db1c5c27a194b15b3a3c1349a5d4
    27712 ?        Ss     0:00      |   \_ httpd -DFOREGROUND
    27759 ?        Sl     0:00      |       \_ httpd -DFOREGROUND
    27760 ?        Sl     0:00      |       \_ httpd -DFOREGROUND
    27761 ?        Sl     0:00      |       \_ httpd -DFOREGROUND
    27954 ?        Sl     0:00      \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/37a75b3a9bd9ad07fb07bff04b6df16e3cb6
    27989 ?        Ss     0:00          \_ nginx: master process nginx -g daemon off;
    28033 ?        S      0:00              \_ nginx: worker process
     
     
    Network namespace
     
    Network namespace 让容器拥有自己的独立的网卡、IP、路由等资源。
     
    User namespace
     
    他让容器能够管理自己的用户,docker host 不能看到容器中创建的用户
     

     
    容器常用命令总结
     
    create        创建
    run             创建+启动
    pause         暂停
    unpause    恢复
    stop           停止
    kill             杀掉
    start          启动
    restart       重启
    start          启动
    attach       进入容器启动的终端
    exec          在容器中启动新的进程,通常使用 -it
    logs           显示容器启动进程的控制台输出 用-f 持续打印
    rm             删除
     
  • 相关阅读:
    每天出门前,记得提醒自己一遍,别落下了梦想
    逐帧动画 and 有限状态机(fsm)
    【备忘】指定为同名callback的jsonp && IE下script loaded状态标记
    【NodeCC】nodejs版本的脚本压缩和compo工具
    半年拾遗
    context2D上的texture mapping
    软件系统配置UI(QT)
    MongoDB增加排序内存版本4.4.1
    搭建Mingw64环境并使用git管理ffmpeg
    js 运算符
  • 原文地址:https://www.cnblogs.com/www1707/p/10333488.html
Copyright © 2011-2022 走看看