前言

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

正文

简单运行一个容器:

创建一个容器:

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. Jmeter 之 forEach控制器

    1 添加方法: 线程组右键-> 添加 -> 逻辑控制器 ->ForEach控制器   2 作用: 可以更方便JMeter后置处理器提取出来的多组数据,也可以定义具有特定规则的数据,用 ...

  2. Java 小练习(2) 利用面向对象的编程方法 设计类Circle计算圆的面积

    1 package com.bytezero.exer; 2 /*** 3 * 4 * @Description 5 * @author Bytezero·zhenglei! Email:420498 ...

  3. 如何避免MYSQL主从延迟带来的读写问题?

    在MYSQL 部署架构选型上,许多公司都会用到主从读写分离的架构,如下是一个一主一从的架构,主库master负责写入,从库slave进行读取. 但是既然是读写分离,必然会面临这样一个问题,当在主库上进 ...

  4. husky 7.0.4 git hooks 前端 commit 钩子 git转svn [已解决]

    husky 7 的安装,注意下版本 第一步 安装 cnpm install husky@7.0.4 --save-dev 第二步 在package.json script加入 "prepar ...

  5. Docker 安装成功(win10家庭版)

    https://desktop.docker.com/win/stable/Docker Desktop Installer.exe 安装遇到了 然后 更新 这个 https://wslstorest ...

  6. day01-SpringBoot基本介绍

    SpringBoot基本介绍 1.SpringBoot是什么? 官网地址:https://spring.io/projects/spring-boot 学习文档:https://docs.spring ...

  7. 通过socket进行网络通信(服务端)

    声明:此文只是为自己方便理解,做了一些具象的比喻和假设,并不符合客观事实,谨慎阅读! ​ 在一台主机中, 两个进程想要通信可以通过一个管道(文件):一个从管道的一端写,一个从另一端读 , 然而管道是半 ...

  8. [STM32]STM32双机蓝牙串口通信

    [STM32]STM32双机蓝牙串口通信 期末考完力,虽然GPA--,但也终于有空搓一搓32了 蓝牙模块配置 我们先配置蓝牙模块,需要主从兼容,配置过程可以参考这个博客:https://blog.cs ...

  9. 浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素

    浅析倾斜摄影三维模型(3D)几何坐标精度偏差的几个因素 倾斜摄影是一种通过倾斜角度较大的相机拍摄建筑物.地形等场景,从而生成高精度的三维模型的技术.然而,在进行倾斜摄影操作时,由于多种因素的影响,导致 ...

  10. 三维模型3DTile格式轻量化压缩处理重难点分析

    三维模型3DTile格式轻量化压缩处理重难点分析 在对三维模型3DTile格式进行轻量化压缩处理的过程中,存在一些重要而又困难的问题需要解决.以下是几个主要的重难点: 1.压缩率和模型质量之间的平衡: ...