030、实现容器的底层技术(2019-01-25 周五)

参考https://www.cnblogs.com/CloudMan6/p/7045784.html

为了更好的理解容器的特性,本节我们将讨论容器的底层实现技术。

cgroup 和 namespace 是最重要的两种技术。cgroup 实现资源限额namespace 实现资源隔离

cgroup

全程 Control Group 。Linux操作系统通过 cgroup 可以设置进程使用CPU、MEM 和 IO 资源的限额。就是我们前面学习的参数

--cpu-shares

-m

--device-write-bps

[email protected]:~# 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

[email protected]:~# 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

[email protected]:~# 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

[email protected]:~# cat /sys/fs/cgroup/cpu/docker/980b3b38e44419fca0df8681101274a16a75a2bf426f7cfb6354a73953a42cfe/cpu.shares    #    查看cgroup中设置的 cpu.shares 值

512

[email protected]:~#

[email protected]:~# 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/

[email protected]:~# 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

[email protected]:~# 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

[email protected]:~# 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

[email protected]:~# 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命令只能看到自己的进程

[email protected]:~# docker run -d httpd

48ec7932db1c5c27a194b15b3a3c1349a5d43d9260661b381d1563092ed941b6

[email protected]:~#

[email protected]:~# docker run -d nginx

37a75b3a9bd9ad07fb07bff04b6df16e3cb693e47ffb87a1184d1b8f975e8b6d

[email protected]:~# 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

[email protected]:~# 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             删除

原文地址:https://www.cnblogs.com/www1707/p/10333488.html

时间: 2024-09-30 20:49:58

030、实现容器的底层技术(2019-01-25 周五)的相关文章

第 4 章 容器 - 030 - 实现容器的底层技术

实现容器的底层技术 cgroup 和 namespace 是最重要的两种技术. cgroup 实现资源限额 namespace 实现资源隔离 cgroup cgroup 全称 Control Group. Linux 操作系统通过 cgroup 可以设置进程使用 CPU.内存 和 IO 资源的限额. 前面我们看到的--cpu-shares.-m.--device-write-bps 实际上就是在配置 cgroup. cgroup 存在 /sys/fs/cgroup 文件中. 举个例子:启动一个容

实现容器的底层技术 - 每天5分钟玩转 Docker 容器技术(30)

为了更好地理解容器的特性,本节我们将讨论容器的底层实现技术.cgroup 和 namespace 是最重要的两种技术.cgroup 实现资源限额, namespace 实现资源隔离. cgroup cgroup 全称 Control Group.Linux 操作系统通过 cgroup 可以设置进程使用 CPU.内存 和 IO 资源的限额.相信你已经猜到了:前面我们看到的--cpu-shares.-m.--device-write-bps 实际上就是在配置 cgroup. cgroup 到底长什么

28-实现容器的底层技术

为了更好地理解容器的特性,本节我们将讨论容器的底层实现技术.cgroup 和 namespace 是最重要的两种技术.cgroup 实现资源限额, namespace 实现资源隔离. cgroup cgroup 全称 Control Group.Linux 操作系统通过 cgroup 可以设置进程使用 CPU.内存 和 IO 资源的限额.相信你已经猜到了:前面我们看到的--cpu-shares.-m.--device-write-bps 实际上就是在配置 cgroup. cgroup 到底长什么

实现容器的底层技术

进程间通信: 1.socket 2.共享内存 3.消息队列 为了更好地理解容器的特性,我们将讨论容器的底层实现技术.cgroup 和 namespace 是最重要的两种技术.cgroup 实现资源限额, namespace 实现资源隔离. cgroup:cgroup 全称 Control Group.Linux 操作系统通过 cgroup 可以设置进程使用 CPU.内存 和 IO 资源的限额.cgroup 到底长什么样子呢?我们可以在 /sys/fs/cgroup 中找到它.还是用例子来说明,启

2019/01/25 低迷的一天

今天不分享技术,也不发表工作事情.主要是因为今天看到的2个事情有感 1.中午和同事下去吃饭,吃饭的地方是一个公共的美食城,所以就有那种吃完了的饭菜要等一会才有人收拾,恰好吃完后,隔壁2个人离去.这时候突然来了一个50岁左右的男人,着装整齐,背了个包,开始以为他是找座位,还特意看了下周围,也瞟了下我,突然他拿起别人吃完的饭菜在那里狼吞虎咽,第一次看到,也是很真实的看到,我没想到一个看起来不像缺钱的人竟然会饭都吃不起,我当时还看了他几眼,他好像知道了有点忐忑那种,手和筷子发抖,于是我马上低头看手机,

AWS Lambda&Fargate 无服务底层技术是如何实现的

一.AWS Serverless 服务 近些年 AWS 非常推崇无服务器模式,自从2014年 Lambda 发布之后,无服务器大受欢迎,随之 2017 年推出 AWS Fargate 服务,应用于自家的容器服务平台 ECS.在 2019 年,EKS 也相继支持 AWS Fargate. 现在,更多的用户使用无服务器计算来构建应用程序,AWS 旨在打造让用户无需担心基础设施的预置或管理问题.开发人员可以使用 AWS Fargate 将其代码封装为无服务器容器,或使用 AWS Lambda 封装为无

各大公司容器云的技术栈对比

郑昀编著于2015/10/20 目前来看,几家历史包袱较重的公司都选择不让上层应用感知到底层是 VM 还是容器,所以都改了 docker 内核,如360.点评.汽车之家.最后附上我们的容器私有云技术栈以及系统截图. 点评容器技术栈 2014年启动基于 docker 搭建私有云,之前谈不上使用过私有云 运维工具:Puppet NATS+Nginx+Zookepper: 组件之间的交互使用了 NATS,通过消息的『发布-订阅』模型,将各个组件之间的耦合最小化 对于Web类型的应用,通过和 Nginx

关联容器(底层机制) — hashtable

C++ 11已将哈希表纳入了标准之列.hashtable是hash_set.hash_map.hash_multiset.hash_multimap的底层机制,即这四种容器中都包含一个hashtable. 解决碰撞问题的办法有许多,线性探测.二次探测.开链等等.SGI STL的hashtable采用的开链方法,每个hash table中的元素用vector承载,每个元素称为桶(bucket),一个桶指向一个存储了实际元素的链表(list),链表节点(node)结构如下: template <cl

从容器和 Kubernetes 技术看现代云计算的发展轨迹

容器化技术(containerization). 你可能会有很多疑惑:容器到底是什么,它究竟怎样工作?Docker.Kubernetes到底指的是什么,Google Container Engine以及Managed VM又有什么用?它们之间有何关联,我们如何通过容器来构建一个功能强大的服务,并且能让它们在生产环境的大规模集群中使用? 用户采用这种技术,怎样才能获得商业价值?好了,我们不再卖关子,接下来就直入主题.我们首先会对容器技术进行具体的介绍,之后讲述容器技术究竟如何使我们更好地进行工作.