前言

简单的整理一下一些基本概念。

正文

简单运行一个容器:

创建一个容器:

docker run -it busybox /bin/bash

然后看下进程:

ps -ef

做了一个障眼法,使用的是pid namespace方式,让容器内部只能看到由容器创建的进程。

linux 还有一些其他的机制:

比如,Mount Namespace,用于让被隔离进程只看到当前 Namespace 里的挂载点信

息;Network Namespace,用于让被隔离进程看到当前 Namespace 里的网络设备和配

置。

现在隔离了一些资源,似乎能让新启动的进程,只能使用被容器规范起来的资源。

但是有一个问题,那就是把资源分配出去了,到底分配多少资源。

主要是几大块吧,内存、cpu、磁盘。

Linux Cgroups 就是 Linux 内核中用来为进程设置资源限制的一个重要功能。

Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程

组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。

举个例子

查看cgroup 限制:

mount -t cgroup

有这些限制:

举个限制cpu的例子:

进入限制cpu的目录下:

创建一个组,比如mkdir container:

改下两个参数:

echo 20000 > cpu.cfs_quota_us

限制100ms 内只能使用20ms。

现在运行一个进程:

看下cpu:

100% 了,现在限制一下这个进程的cpu。

echo 3121 > tasks

再看下cpu:

现在kill 3121

除 CPU 子系统外,Cgroups 的每一项子系统都有其独有的资源限制能力,比如:

blkio,为 块 设 备 设 定 I/O 限 制,一般用于磁盘等设备;

cpuset,为进程分配单独的 CPU 核和对应的内存节点;

memory,为进程设定内存使用的限制。

Linux Cgroups 的设计还是比较易用的,简单粗暴地理解呢,它就是一个子系统目录加上

一组资源限制文件的组合。而对于 Docker 等 Linux 容器项目来说,它们只需要在每个子

系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,

把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了。

例如:

 docker run -it --cpu-period=100000 --cpu-quota=20000 busybox /bin/sh

这样就限制了。

来看下限制:

进去查看:

大概就是这么回事了。

linux 容器化优势不多说,用的自然知道,节约能源,方便使用。

弊端:

  1. 在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,最典型的例子就

    是:时间。
  2. 众所周知,Linux 下的 /proc 目录存储的是记录当前内核运行状态的一系列特殊文件,用户

    可以通过访问这些文件,查看系统以及当前正在运行的进程的信息,比如 CPU 使用情况、

    内存占用率等,这些文件也是 top 指令查看系统信息的主要数据来源。

    但是,你如果在容器里执行 top 指令,就会发现,它显示的信息居然是宿主机的 CPU 和内

    存数据,而不是当前容器的数据。

    造成这个问题的原因就是,/proc 文件系统并不知道用户通过 Cgroups 给这个容器做了什

    么样的资源限制,即:/proc 文件系统不了解 Cgroups 限制的存在。

    在生产环境中,这个问题必须进行修正,否则应用程序在容器里读取到的 CPU 核数、可用

    内存等信息都是宿主机上的数据,这会给应用的运行带来非常大的困惑和风险。这也是在企

    业中,容器化应用碰到的一个常见问题,也是容器相较于虚拟机另一个不尽如人意的地方。

k8s 深入篇———— docker 是什么[一]的更多相关文章

  1. docker+k8s基础篇五

    Docker+K8s基础篇(五) service资源介绍 A:service资源的工作特性 service的使用 A:service字段介绍 B:ClusterIP的简单使用 C:NodePort的简 ...

  2. docker+k8s基础篇四

    Docker+K8s基础篇(四) pod控制器 A:pod控制器类型 ReplicaSet控制器 A:ReplicaSet控制器介绍 B:ReplicaSet控制器的使用 Deployment控制器 ...

  3. docker+k8s基础篇三

    Docker+K8s基础篇(三) kubernetes上的资源 A:k8s上的常用资源 Pod的配置清单 A:Pod上的清单定义 B:Pod创建资源的方法 C:spec下其它字段的介绍 Pod的生命周 ...

  4. docker+k8s基础篇二

    Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...

  5. docker+k8s基础篇一

    Docker+K8s基础篇(一) docker的介绍 A:为什么是docker B:k8s介绍 docker的使用 A:docker的安装 B:docker的常用命令 C:docker容器的启动和操作 ...

  6. 【Docker】第一篇 Docker的初始化安装部署

    一.Docker基础 Dacker倡导的理念:一个容器一个进程 Docker的版本了解: Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人 ...

  7. 国内不fq安装K8S一: 安装docker

    目录 1.安装docker 1.1 准备工作 1.2 安装docker 1.3 修改cgroup 国内不fq安装K8S一: 安装docker 国内不fq安装K8S二: 安装kubernet 国内不fq ...

  8. devops-4:Jenkins基于k8s cloud和docker cloud动态增减节点

    Jenkins管理动态节点 上文介绍Jenkins增加静态agent的步骤,除了静态增加外,还有动态管理的功能,两者最大的差异在于动态可以在有job运行时,临时加入一个agent到jenkins ma ...

  9. 微服务探索之路03篇-docker私有仓库Harbor搭建+Kubernetes(k8s)部署私有仓库的镜像

    ❝ 目录: 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通 微服务探索之路02篇liunx ubuntu服务器部署k8s(kubernet ...

  10. 【K8S】基于Docker+K8S+GitLab/SVN+Jenkins+Harbor搭建持续集成交付环境(环境搭建篇)

    写在前面 最近在 K8S 1.18.2 版本的集群上搭建DevOps环境,期间遇到了各种坑.目前,搭建环境的过程中出现的各种坑均已被填平,特此记录,并分享给大家! 服务器规划 IP 主机名 节点 操作 ...

随机推荐

  1. C++ //list容器 构造函数 //list赋值和交换 //list容器大小操作 //list插入和删除,移除 //清空 //list数据存取back(); front() //list 反转和排序

    1 //list容器 构造函数 //list赋值和交换 //list容器大小操作 2 //list插入和删除,移除 //清空 //list数据存取back(); front() 3 //list 反转 ...

  2. 出海业务如何搭建国内也能快速访问的https网站与接口(无需备案)

    背景信息 由于最近在搭建我的出海网站 https://www.idatariver.com/zh-cn , 感兴趣的可以看看. 其中一个环节便是给后端API接口加上ssl,毕竟http看着不如http ...

  3. 如何下载RTMP/http直播源直播视频(比尔下载器使用完整教程)

    之前已经介绍了如何抓取各种app直播源及在线视频地址,本节内容将详细介绍如何下载rtmp/http直播源的直播视频,请注意,rtmp/http指协议,不针对任何app,凡是使用了以上协议的基本原理一样 ...

  4. 3DCAD图纸转2D(DXF)图纸通用解决方案文稿

    本文地址:https://gitee.com/dvaloveu/lovedva/issues/I6B5YC 视频演示(1.25倍速&原速):Acfun Bilibili 脚本地址:https: ...

  5. SyntaxError: invalid property id(就是不支持ES6) (浏览器不支持对象...展开)

    SyntaxError: invalid property id(就是不支持ES6) (浏览器不支持对象...展开) 火狐55以后支持

  6. tapable - webpack 的 hooks - getAc - 异步流程控制

    tapable - webpack 的 hooks,类似自己的 getAc 官方地址 https://www.npmjs.com/package/tapable 随便找了篇文章:聊聊 Webpack ...

  7. 后端基础PHP-PHP简介及基本函数

    后端基础PHP-PHP简介及基本函数 1.PHP简单介绍 2.PHP基本语法 一.PHP简单介绍 PHP(超文本预处理器),是一种通用的开源脚本语言,标准的后端语言 比较常见的后端语言,ASP|ASP ...

  8. 基于Rust的Tile-Based游戏开发杂记(01)导入

    什么是Tile-Based游戏? Tile-based游戏是一种使用tile(译为:瓦片,瓷砖)作为基本构建单位来设计游戏关卡.地图或其他视觉元素的游戏类型.在这样的游戏中,游戏世界的背景.地形.环境 ...

  9. 3DCAT为3D应用在云端构筑一个可靠的家

    保护知识产权,一直是数字化长期关注的议题,如何保护应用内的数字化资产(文字.图片.音频.视频.模型)等,是当今行业的难题,只要运行在Windows环境的三维应用,都可能面临被破解提取出资产,为原创版权 ...

  10. Linux快速入门(五)Linux系统管理

    top top命令相当于任务管理器.在top命令中,可以使用M,将进程列表按内存使用排序,使用P将进程列表按照CPU的使用情况排序,输入q退出. (1)第一行是任务队列信息,显示系统时间.运行时间.当 ...