如何在Docker内部使用ulimit——如何在docker内部生成core

简介: Ulimit在linux里ulimit命令可以对shell生成的进程的资源进行限制。常用的ulimit限制打开文件句柄数core文件大小设置进程能够消耗的虚拟内存设置用户能够打开的进程数目不太常用的ulimit限制设置数据段的最大值.

Ulimit

在linux里ulimit命令可以对shell生成的进程的资源进行限制。

常用的ulimit限制

  • 打开文件句柄数
  • core文件大小
  • 设置进程能够消耗的虚拟内存
  • 设置用户能够打开的进程数目

不太常用的ulimit限制

设置数据段的最大值.单位:kbytes
设置创建文件的最大值.单位:blocks
设置在内存中锁定进程的最大值.单位:kbytes
设置可以使用的常驻内存的最大值.单位:kbytes
设置内核可以同时打开的文件描述符的最大值.单位:n
设置管道缓冲区的最大值.单位:kbytes
设置堆栈的最大值.单位:kbytes
设置CPU使用时间的最大上限.单位:seconds

ulimit设置限制的两条水线

ulimit设置限制的时候会设置两条线soft和hard线,当资源到达了soft线那么只是告警,如果达到了hard线那么内核就强制限制了。

在docker里使用ulimit限制

从上面小节中可以看到linux系统可以通过配置ulimit对很多资源进行限制。在docker内部如何使用ulimt这个工具便利性呢。

在dockerd中为所有容器配置默认的ulimit

  • 在/etc/docker/daemon.json里通过

“ulimit”:ulimit-resource=M:N 对所有容器默认某个资源进行限制。

表2-1

上表中M为soft水线,N为hard水线。如果“=”右边只有一个那么同时设置soft水线=hard水线

  • 在dockerd启动参数中设置
    这种方式是指通过修改docker.service文件或者直接命令行启动dockerd的方式

--default-ulimit unlimit-resources=M:N

表2-2

表2-2中的M和N和表2-1中的同义

在docker run时为某个容器设置ulimit

除了在dockerd里设置容器的默认ulimit值,还可以为某个容器指定一个的ulimit值。这借助在docker run时带参数

--ulimit ulimit-resources=M:N

表2-3
表2-3中的M和N和表2-1中同意义

docker中能够设置的ulimit参数

常用的docker ulimit设置项

参数 意义 例子
nofile shell进程打开文件数目 docker run --ulimit nofile=20
core 进程生成core文件的尺寸 docker run --ulimit core =-1 //开启进程core
nproc shell能打开的进程多少 Na
fsize 进程写文件的最大尺寸 na

其他docker ulimit设置项

参数 意义 例子
cpu ulimit cpu 限制进程能够使用的cpu资源,单位为s。当达到soft线后触发SIGXCPU,默认为杀死进程(可以忽略此信号)。达到hard线后,发送SIGKILL na
data ulimit data na
locks ulimit locks na
memlock ulimit memlock na
msgqueue ulimit msgqueue na
Nice ulimit nice na
rss ulimit rss na
rtprio ulimit rtprio na
rttime Ulimit rttime na
Sigpending ulimit sigpending na
stack ulimit stack na

Docker里如何实现ulimit的传递

ulimit参数定义和解析

docker里对ulimit参数的定义在go-unit/ulimit.go里,这里定义了docker可以传递的ulimit参数。

  • 参数解析是通过
    opts/ulimit.Set()设置内部结构
    opts/ulimit.GetList()取用
  • 参数解析过程
    NewRunCommand()/NewCreateCommand() --->opts.AddFlags()—->pflag.FlagSet.Var()解析命令行传递过来的ulimit参数,FlagSet最终调用opts/ulimit.Set()将命令行传递的参数转换为内部格式。
    Container.runCreate()—>runconfigopts.Parse==opts.Parse()将内部格式转换为container.HostConfig格式。而这个HostConfig格式最终变成一个runc的spec(config.json)里的hostconfig字段rlimit。
    而runc解析configxx.json,完成ulimit配置。
目录
相关文章
|
5月前
|
开发框架 .NET Docker
.NET Core项目部署到Windows系统Docker
.NET Core项目部署到Windows系统Docker
120 2
|
Linux Docker 容器
.net Core WebApi发布到Docker并推送到阿里云容器服务
.net Core WebApi发布到Docker并推送到阿里云容器服务
595 0
.net Core WebApi发布到Docker并推送到阿里云容器服务
|
6月前
|
开发框架 .NET API
ASP.NET Core 部署到docker
ASP.NET Core 部署到docker
65 0
|
12月前
|
Docker 容器
.NET Core 网站项目在Docker中运行无法访问问题处理
.NET Core 网站项目在Docker中运行无法访问问题处理
264 0
|
8月前
|
jenkins Shell 持续交付
jenkins中部署.net core到docker
jenkins中部署.net core到docker
111 0
|
8月前
|
Docker 容器
docker 部署 .net core
docker 部署 .net core
75 0
|
监控 Linux 编译器
六、.net core (.NET 6)程序部署到Docker上
使用Docker部署应用程序首先确保已经安装Docker 桌面软件,如下图:
768 1
六、.net core (.NET 6)程序部署到Docker上
|
Linux Docker 容器
『Docker』在Docker快速部署.NET Core项目
📣读完这篇文章里你能收获到 - 在Docker快速部署.NET Core项目
341 0
『Docker』在Docker快速部署.NET Core项目
|
数据可视化 Docker 容器
(1)将.NET Core编写的数据可视化项目打包成Docker镜像,实现容器化部署
(1)将.NET Core编写的数据可视化项目打包成Docker镜像,实现容器化部署 第一步 环境准备,安装docker环境:
(1)将.NET Core编写的数据可视化项目打包成Docker镜像,实现容器化部署
|
开发框架 NoSQL .NET
Docker-HealthCheck指令探测ASP.NET Core容器健康状态
HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查,还包括应用程序对外部服务或依赖资源的健康检查。
Docker-HealthCheck指令探测ASP.NET Core容器健康状态