从0开始学docker (每日更新 24-11-6)

news2024/11/14 0:25:30

限制容器运行的资源

限制容器的内存使用

容器的内存包括两部分:物理内存和交换空间(swap)

用户内存限制

-m,--memory:容器可用的最大内存,该值最低为4MB

--memory-swap:允许容器置入磁盘交换空间的内存数量

docker设置用户内存使用的4种方式:

1.对容器内存使用无限制

2.设置内存限制并取消交换空间内存限制

docker run -it -m 300M --memory-swap -1 ubuntu /bin/bash  #容器中的进程可以使用300MB内存,并且按需使用尽可能多的交换空间

3.只设置内存限制

docker run -it -m 300M ubuntu /bin/bash

默认情况下,虚拟内存总量--memory-swap将设置为内存大小的两倍

4.同时设置内存和交换空间

docker run -it -m 300M --memory-swap 1G ubuntu /bin/bash 

表示容器进程能使用300MB内存和700MB交换空间

内核内存限制 

不同于用户内存,内核内存不能交换到磁盘,内核内存无法使用交换空间,容器消耗过多的内核内存可能会导致其阻塞系统服务,内核内存不会完全独立于用户内存,而是在用户内存限制的上下文中限制内核内存

docker run -it -m 500M --kernel-memory 50M ubuntu /bin/bash  #设置了用户内存和内核内存,容器进程可以使用共500MB的内存,在500MB的内存中,最多可以使用50MB的内核内存

 docker run -it --kernel-memory 50M ubuntu /bin/bash  #只设置内核内存限制,容器可以尽可能使用多的内存,但是只可以使用50MB的内核内存

设置内存预留实现软限制 

设置内存软限制只是为了确保容器不会长时间消耗过多内存,因为每次内存回收就会缩减容器内存消耗到软限制

--memory-reservation:设置内存预留,是一种内存软限制,允许更大的内存共享

正常情况下,容器可以根据需要尽可能多的使用内存,且只能被-m/--memory所设置的硬限制所约束,设置内存预留后,当docker检测到内存争用或内存不足时,强制容器将其内存限制为预留值

内存预留值应始终低于硬限制,否则硬限制会优先触发,当内存预留值设置为0表示不受限制

作为一个软限制功能,内存预留并不能保证不会超过限制,它的主要目的是确保当内存争用严重时,内存按照预留设置进行分配

docker run -it -m 500M --memory-reservation 200M ubuntu /bin/bash  #限制内存为500MB,内存预留值为200MB,当容器内存消耗超过200而小于500MB时,下一次系统内存回收将尝试将容器内存缩减到200MB以下

docker run -it --memory-reservation 1G ubuntu /bin/bash  #设置内存软限制为1GB,没有设置硬限制 

禁止杀死容器的进程 

默认情况下,当发生内存溢出时,内核会杀死容器中的进程

--oom-kill-disable:禁止杀死进程

注意只能在同时设置了-m选项的容器上使用此选项,因为如果未设置-m选项可能会耗尽主机的内存

docker run -it -m 100M --oom-kill-disable ubuntu /bin/bash  #设置内存为100MB并禁止杀死容器的进程

docker run -it --oom-kill-disable ubuntu /bin/bash  #存在风险,创建的容器会无限制的使用内存,会导致杀死系统进程来释放内存 

swappiness限制 

在Linux系统中,swappiness值(百分比)越大,表示越积极的使用交换空间,否则表示越积极的使用物理内存

docker run -it --memory-swappiness=0 ubuntu /bin/bash  #关闭内存页面交换

限制容器的CPU使用 

CPU份额限制

-c(--cpi-shares):将CPU份额权重设置为更高的值,默认值为1024

只有在运行CPU密集型进程才会使用CPU份额权重,实际的CPU时间总数会根据系统上的运行的容器数量变化

可用CPU资源

--cups:指定容器可以使用的的可用CPU资源,其值是一个浮点数,默认是0.000,表示不受限制。例如,如果主机有两个CPU,并且设置了--cups=1.5,则该容器最多可以使用一个半CPU

--cup-period:设置CPU周期以限制CPU的使用,默认的CPU  CFS(完全公平调度器)周期为100ms

--cpu-quota:限制容器的CPU使用配额,默认值0表示容器占用百分之百的CPU资源

docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu /bin/bash

这个命令用--cpus改写,等效命令为: 

 docker run -it --cpus=0.5 ubuntu /bin/bash

为容器指定CPU或核心 

--cpuset-cpus:限制容器可以使用的特定CPU或核心,即允许容器在该CPU或核心上执行

可以用逗号分隔cpu

docker run -it --cpuset-cpus="1,3" ubuntu /bin/bash  #表示容器可以在cpu1,cpu3上执行

可以用连字符表示cpu的范围

docker run -it --cpuset-cpus="0-2" ubuntu /bin/bash  #表示容器可以在cpu0,cpu1,cpu2上执行 

块IO带宽限制 

块IO是磁盘的读写

docker可以通过设置权重、限制bit/s和io/s(每秒IO次数)控制容器读写磁盘的带宽

设置块IO权重

--blkio-weight:默认值是500,可设置的范围是10~1000

--blkio-weight-device=“设备名称:权重”

docker run -it --blkio-weight-device "/dev/sda:200" ubuntu

300是默认权重,200是为指定设备设置的权重可覆盖默认权重 

docker run -it --blkio-weight 300 --blkio-weight-device "/dev/sda:200" ubuntu 

限制设备读写速率 

限制每秒读写字节数:

--device-read-bps

docker run -it --device-read-bps /dev/sda:1mb ubuntu  #创建一个容器,限制指定设备的读取速率为1MB/s

--device-write-bps

docker run -it --device-write-bps /dev/sda:1mb ubuntu  #创建一个容器,限制指定设备的写入速率为1MB/s 

限制每秒IO次数:

docker run -it --device-read-iops /dev/sda:1000 ubuntu  #创建一个容器,限制它对指定设备的读取速率为每秒IO的次数为1000 

写入同理

资源限制的实现机制-控制组 

对容器的CPU、内存等进行资源限制具体是由控制组的相应子系统来实现的,例如,memory子系统设定控制组中任务所使用的内存限制

在docker run中使用--cpu-shares其实就是配置控制组,相关的配置保存在/sys/fs/cgroup中

1.启动一个容器,设置内存限额为300MB,CPU权重为512

2.打开另一个终端,获取该容器的完整ID (标号2)

3.查看目录,Linux会为每个正在运行的的容器创建一个Cgroup目录,一容器ID命名 (标号2)

4.每个容器子目录中包含所有与CPU相关的Cgroup配置 (标号3)

查看内存配置与块IO的Cgroup配置

同样的,创建一个centos容器并启动 

 打开另一个窗口,可以看到centos正在运行,可以查看它的cpu资源配置

 动态更改容器的配置

docker update [OPTIONS] CONTAINER [CONTAINER...]  #主要容器在主机上使用太多资源,也就是修改的是容器的运行时资源限制

docker update --cpu-shares 512 abef12345  #将一个容器的CPU份额权重改为512

docker update --restart=on-failure:3 abef123455  #更改某容器的重启策略 

容器监控

Docker容器监控命令

查看容器中运行的进程信息

docker top CONTAINER [ps OPTIONS]

容器运行时不一定提供/bin/bash终端来交互执行top命令,而且容器中有可能没有top命令

查看容器中正在运行的进程:

选项是指OPTIONS是指Linux的ps命令的选项,可以用于显示特定的信息

可以运行以下命令行脚本来查看所有正在运行的容器中的进程信息:

查看容器系统的使用情况 

docker stats [OPTIONS] [CONTAINER...]

--all(-a):显示所有的容器,包括未运行的,默认值显示正在运行的容器

--format:根据指定格式显示内容

--no-stream:仅显示第一条记录(只输出当前的状态)

--no-trunc:不截断输出,显示完整信息

默认情况下,给命令会每隔一秒刷新一次输出的内容,知道按下Ctrl+C退出

8列数据分别为:容器ID、容器名称、CPU使用百分比、使用的内存与最大可用内存、内存使用百分比、网络IO数据、磁盘IO数据和进程ID

docker stats --no-stream  #不持续监控,只输出当前状态 

docker stats --no-stream 容器名称/容器ID  #查看指定容器的资源使用情况

  

使用cAdvisor监控容器 

可以用于分析正在运行的容器的资源占用情况和性能指标,是具有图形界面的Docker容器监控工具。cAdvisor是一个运行时的守护进程,负责收集、聚合、处理和输出正在运行的容器的数据,可以监测到资源隔离参数、历史资源使用和网络统计数据。cAdvisor可以在主机上原生安装,也可以作为Docker容器运行

容器的日志管理

使用docker logs命令查看容器日志

对于一个运行中的容器,Docker 会将日志发送到容器的标准输出设备(STDOUT) 和标准错误设备(STDERR)上,可以将标准输出设备和标准错误设备视为容器的控制台终端。如果容器以前台方式运行,日志会直接输出在当前的终端窗口中。如果以后台方式运行容器,则不能直接看到输出的日志。对于这种情形,可以使用 docker attach 命令连接到后台容器的控制台终端,查看输出的日志。不过这种方法仅用于查看容器日志就没有必要了,因为 Docker 自带的 docker logs 命令专门用于查看容器的日志,其语法格式如下:

docker logs [OPTIONS] CONTAINER

--details:显示更为详细的日志信息

--follow(-f):跟踪日志输出

--since:显示自某个时间开始的所有日志

--tail:仅列出最新的n条日志

--timestamps(-t):显示截止日期

--until:显示到某个截止日期的所有日志

docker logs --since="2024-10-10"  --tail=3 容器ID  #显示该容器从24年10月10号以来的最新3条日志

配置日志驱动重定向容器的日志记录

容器日志发送到标准输出设备和标准错误设备是Dooker默认的日志行为。实际上,Dooker 提
共了多种日志机制帮助用户从运行的容器中提取日志信息。这些机制被称为日志驱动(logging driver)。Docker 默认的日志驱动是json-file。

配置容器的日志驱动

在启动容器时,可以通过--log-driver 选项将其配置为使用与Docker守护进程不同的日志驱动。

配置日志驱动将容器的日志重定向到Linux日志系统

一直以来,syslog都是Linux标配的日志记录工具,rsyslog是syslog的多线程增强版,也是CentOS7中默认的日志系统。它主要用来收集系统产生的各种日志,日志文件默认放在/var/log/目录下。选择syslog作为日志驱动可将日志输出定向到syslog日志系统,前提是syslog守护进程必须在容器宿主机上运行。例如:

docker run -it --log-driver syslog ubuntu /bin/bash  #将该容器的日志记录到syslog文件(centos7是/var/log/messages)

将容器日志记录到 journald:
journald是一个收集并存储日志数据的systemd日志系统服务。它将日志数据存储在带有索引的结构化二进制文件中,便于集中查看和管理,可以使用journalctl命令查看。

选择journald作为日志驱动可将日志输出定向到systemd日志系统,例如:

docker run -it --log-driver journald ubuntu /bin/bash 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++初阶——vector

一、什么是vector vector是表示可变大小的数组的序列容器,就像数组一样,vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效,但是它的大小是动态可变的,并且它的大小会被容器自动处理。 二、vector的构造 常用的构…

GIT的基本使用与进阶

GIT的简单入门 一.什么是git? Git 是一个开源的分布式版本控制系统,用于跟踪文件更改、管理代码版本以及协作开发。它主要由 Linus Torvalds 于 2005 年创建,最初是为 Linux 内核开发而设计的。如今,Git 已经成为现代软件开发中…

CulturalBench :一个旨在评估大型语言模型在全球不同文化背景下知识掌握情况的基准测试数据集

2024-10-04,为了提升大型语言模型在不同文化背景下的实用性,华盛顿大学、艾伦人工智能研究所等机构联合创建了CulturalBench。这个数据集包含1,227个由人类编写和验证的问题,覆盖了包括被边缘化地区在内的45个全球区域。CulturalBench的推出&…

C语言中,“extern”关键字的含义与用法

在C语言中,extern 关键字用于声明一个已经在其他地方定义的变量或函数。它的主要作用是告诉编译器,某个变量或函数是在当前文件之外定义的,编译器应该在链接阶段找到这个变量或函数的实际定义。以下是 extern 的一些常见用途和用法&#xff1…

「Mac玩转仓颉内测版1」入门篇1 - Cangjie环境的搭建

本篇详细介绍在Mac系统上快速搭建Cangjie开发环境的步骤,涵盖VSCode的下载与安装、Cangjie插件的离线安装、工具链的配置及验证。通过这些步骤,确保开发环境配置完成,为Cangjie项目开发提供稳定的基础支持。 关键词 Cangjie开发环境搭建VSC…

Kubernetes网络揭秘:从DNS到核心概念,一站式综述

文章目录 一.overlay vs underlayL2 underlayL3 underlay 二、calico vs flannel2.1 calico架构2.2 flannel架构 三、iptables四、Vxlan五、kubernetes网络架构综述六、DNS七、Kubernetes域名解析策略 一.overlay vs underlay overlay网络是在传统网络上虚拟出一个虚拟网络&am…

飞凌嵌入式FET527N-C核心板现已适配Android 13

飞凌嵌入式FET527N-C核心板现已成功适配Android13,新系统的支持能够为用户提供更优质的使用体验。那么,运行Android13系统的FET527N-C核心板具有哪些突出的优势呢? 1、性能与兼容性提升 飞凌嵌入式FET527N-C核心板搭载了全志T527系列高性能处…

破解仓库管理难题!库存管理流程详解

随着市场竞争加剧和客户需求不断提升,企业的仓库管理在日益复杂的供应链环境中面临诸多挑战。许多企业在仓库管理上仍停留在传统手工操作或基础的数字化管理阶段,这种方式容易导致库存信息不准确、管理效率低下、数据滞后等问题。 企业现状 当前&#…

电缆管道高效智能化管理:智能电缆管道可视化机器人

电缆管道高效智能化管理:智能电缆管道可视化机器人 电缆管道作为城市“生命线”的重要组成部分,其安全性和可靠性日益受到重视。然而,传统的人工巡检方式存在诸多不足,如巡检效率低下、安全隐患大、难以发现隐蔽故障等。 很多电力…

tomcat启动失败和缓存清理办法

tomcat只在学校接触过并且是在window xp和win7的电脑上配置过(中途升级过电脑系统),只记得在windows系统上可以将其设置成服务管理。但我已毕业10多年了,学的知识早就不知道丢哪里了。这次为了修改一个07,08年的项目&a…

RDD 算子全面解析:从基础到进阶与面试要点

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…

如何在CentOS 7上搭建SMB服务

如何在CentOS 7上搭建SMB服务 因项目测试需求,需要自行搭建SMB服务,**SMB(Server Message Block)**协议是一种常用的文件共享方式,它可以让不同操作系统之间共享文件、打印机等资源。本文将带你一步步搭建一个简单的S…

ubuntu18.04 配置安卓编译环境

目前有个项目,验收时有个要求是在linux中进行编译打包生成apk文件。我平时都是在windows环境android studio中进行打包的,花了半天时间研究了一下,记录如下: 安装安卓sdk cd /opt wget https://dl.google.com/android/reposito…

英伟达HOVER——用于人形机器人的多功能全身控制器:整合不同的控制模式且实现彼此之间的无缝切换

前言 前几天,一在长沙的朋友李总发我一个英伟达HOVER的视频(自从我今年年初以来持续不断的解读各大顶级实验室的最前沿paper、以及分享我司七月在具身领域的探索与落地后,影响力便越来越大了,不断加油 ),该视频说的有点玄乎&…

C语言中“type”的含义

在C语言中,“type”是指数据类型,它定义了变量可以存储的数据种类以及可以对这些数据执行的操作。C语言提供了一系列基本的数据类型,它们包括但不限于: 整型(Integer Types): int:用…

ffmpeg 视频滤镜:屏蔽边框杂色- fillborders

滤镜描述 fillborders 官网链接 > FFmpeg Filters Documentation fillborders滤镜有几种方式帮你屏蔽边框的杂色、不好的图案。 滤镜使用 参数 left <int> ..FV.....T. set the left fill border (from 0 to INT_MAX) (default 0)right …

云计算答案

情境一习题练习 一、选择题 1、在虚拟机VMware软件中实现联网过程&#xff0c;图中箭头所指的网络连接方式与下列哪个相关&#xff08; C &#xff09;。 A.仅主机模式 B.桥接 C.NAT D.嫁接 2、请问下图这个虚拟化架构属于什么类型&#xff08; A …

[ Linux 命令基础 2 ] Linux 命令详解-系统管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Golang | Leetcode Golang题解之第554题砖墙

题目&#xff1a; 题解&#xff1a; func leastBricks(wall [][]int) int {cnt : map[int]int{}for _, widths : range wall {sum : 0for _, width : range widths[:len(widths)-1] {sum widthcnt[sum]}}maxCnt : 0for _, c : range cnt {if c > maxCnt {maxCnt c}}retur…

QT中使用图表之QChart绘制动态折线图

使用QChart绘制一个随着时间的变化而动态显示的折线图 每一秒增加1个点&#xff0c;总共显示10s内的数据 显然x轴我们使用日期时间轴 同时使用1个定时器&#xff0c;每隔1秒往折线系列中添加1个数据进去 步骤如下&#xff1a; 1、创建图表视图 //1、创建图表视图 QChartV…